Сумма матриц

Задача: 

С помощью подпрограммы заполнить матрицы случайными числами. Написать подпрограмму, вычисляющую сумму двух матриц. Вывести на экран две исходные матрицы и их сумму (используя процедуру).

Описание переменных: 

one, two - исходные матрицы;
three - матрица-сумма двух предыдущих;
matrix - процедура, заполняющая массив случайными числами;
printer - процедура, выводящая содержимое массивов на экран;
plus - процедура, вычисляющая сумму матриц.

Алгоритм решения задачи: 

Под суммой матриц будем понимать сложение их элементов, находящихся в одинаковых позициях (имеющих одинаковые индексы). Таким образом уместно складывать матрицы одинаковой размерности. При этом будет получена третья матрица с такой же размерностью как исходные.

При решении подобной задачи лучше использовать подпрограммы (процедуры или функции), так как нам приходится заполнять несколько массивов и выводить их на экран. Без подпрограмм в коде будет содержаться много почти идентичного кода.

Используются процедуры, а не функции, так как при заполнении массивов в подпрограмму передается переменная, а не значение. Таким образом, процедура заполняет "внешнюю" для нее матрицу.

В процедуру, вычисляющую сумму матриц, передается три параметра: переменная матрицы-суммы, значения первой и второй матрицы.

В основной ветке программы процедуры последовательно вызываются.

Следует обратить внимание, что randomize вызывается единожды в основной ветке программы. Если данную команду вставить в процедуру заполнения массива, то оба массива будут заполнены одинаковыми числами. Это связано с тем, что "зерно" зависит от таймера, а между двумя вызовами проходит мало времени, чтобы таймер изменил значение. Таким образом, "зерно" в программе надо получать один раз. В этом случае при повторном вызове процедуры отсчет по формуле генерации псевдослучайных чисел продолжается, а не инициируется заново.

Программа на языке Паскаль: 

const N = 2; M = 5;
type arr = array[1..N,1..M] of integer;
var
	one,two,three: arr;
	i,j: byte;
 
procedure matrix(var a: arr);
	begin
		for i:=1 to N do
			for j:=1 to M do
				a[i,j] := random(100);
	end;
 
procedure plus(var a: arr; b: arr; c: arr);
	begin
		for i:=1 to N do
			for j:=1 to M do
				a[i,j] := b[i,j]+c[i,j];
	end;
 
procedure printer(a: arr);
	begin
		for i:=1 to N do begin
			for j:=1 to M do
				write(a[i,j]:4);
			writeln;
		end;
	end;
 
begin 
	randomize;
	matrix(one);
	printer(one);
	writeln;
	matrix(two);
	printer(two);
	writeln;
	plus(three,one,two);
	printer(three);
end.

Пример выполнения программы, вычисляющей сумму двух матриц:

  67  47  72   3  57
  72  99  89  94  90

   3  24  12  81  56
  99  76  37  21   4

  70  71  84  84 113
 171 175 126 115  94

Комментарии

ошибка в решении

procedure matrix(var a: arr);
	begin
		for i:=1 to N do
			for j:=1 to M do
				a[i,j] := random(100);
	end;

Program1.pas(9,9): Переменная цикла for должна описываться в том же блоке, что и цикл for