Двумерные массивы
Двумерные массивы в математике представляются матрицей:

или сокращенно можно записать:





Описание двумерного массива
Описание матрицы в разделе VAR задается структурным типом вида:
<имя массива>: ARRAY [m1..m2, n1..n2] OF <тип элементов>;
m1..m2 – диапазон значений индекса i, определяющий число строк;
n1..n2 – диапазон значений индекса j, определяющий число столбцов.
По описанию матрицы во внутренней памяти компьютера выделяется область из (

Var
A: array [1..3, 1..5] of real;
в памяти компьютера выделяется область, состоящая из

Обращение к отдельным элементам матрицы осуществляется с помощью переменной с двумя индексами, например:



Ввод-вывод двумерного массива
Для поэлементного ввода и вывода матрицы используется двойной цикл FOR. Если задать индекс


Пример 1.
Организовать ввод целочисленной матрицы


Описание матрицы вместе с текущими индексами имеет вид:
Var
M: array [1..2, 1..3] of integer;
i, j: integer;
Ввод в программе реализуется в форме диалога, т.е. сопровождается соответствующим сообщением:
Begin {начало программы}
writeln(‘Введите матрицу М’);
for i := 1 to 2 do
for j := 1 to 3 do read(m[i, j]);
…………
На клавиатуре нагляднее всего набирать элементы матрицы по строкам.
1 2 3 <Enter>
4 5 6 <Enter>
Пример 2.
Организовать вывод матрицы M на экран.
Вывод матрицы надо реализовать в удобном для чтения виде, т.е. чтобы на одной строке экрана располагалась одна строка матрицы. С этой целью в тело внешнего цикла, помимо внутреннего, включается еще оператор WRITELN, который переводит курсор к началу следующей строки экрана после вывода текущей строки матрицы.
for i := 1 to 2 do
begin
for j := 1 to 3 do write(m[i, j]:3);
writeln
end;
Вид матрицы на экране будет следующим:
1 2 3
4 5 6
Обработка матриц
Базовыми алгоритмами обработки матриц являются те же алгоритмы, которые используются при обработке одномерных массивов. Однако реализацию этих алгоритмов можно условно рассматривать для двух типов задач.
1. Алгоритмы реализуются при обработке всех элементов матрицы.
2. Алгоритмы реализуются внутри каждой строки или каждого столбца матрицы.
Реализация алгоритмов для задач первого типа
Задача 1. Дана матрица вещественных чисел


Program DМ_1;
Var
A: array [1..4, 1..6] of real;
i, j: integer;
P1, P2, Z: real;
Begin
writeln(‘Введите матрицу А’);
for i := 1 to 4 do
for j := 1 to 6 do read(a[i,j]);
P1 := 1;
P2 := 1;
for i := 1 to 4 do
for j :=1 to 6 do
begin
if a[i,j]>0 then P1 := P1 * a[i,j];
if a[i,j]<0 then P2 := P2 * a[i,j];
end;
Z := P1/abs(P2);
writeln(‘Z=’, Z:10:2);
End.
Задача 2. В квадратной целочисленной матрице

Введем обозначения:
L1 – число нулевых элементов ниже главной диагонали;
L2 – число нулевых элементов выше главной диагонали;
L= |L1-L2|.
Program DМ1_2;
Var
B: array [1..5, 1..5] of integer;
i, j, L1, L2, L: integer;
Begin
writeln(‘Введите матрицу B’);
for i := 1 to 5 do
for j := 1 to 5 do read(b[i,j]);
L1 := 0;
L2 := 0;
for i := 1 to 5 do
for j := 1 to 5 do
if b[i,j]=0 then
begin
if i>j then L1 := L1+1;
if i<j then L2 := L2 +1;
end;
L := abs(L1 – L2);
writeln(‘L=’, L);
End.
Реализация алгоритмов для задач второго типа
Задача 1. В матрице

Program DМ2_1;
Var
X: array [1..3,1..6] of real;
i, j, jmin: integer;
min: real;
Begin
writeln(‘Введите матрицу X’);
for i:= 1 to 3 do
for j := 1 to 6 do read(x[i,j]);
for i:=1 to 3 do
begin
min:=+1E6;
for j:=1 to 6 do
if x[i,j]<min then
begin
min:=x[i,j];
jmin:=j;
end;
x[i,jmin]:=x[i,1];
x[i,1]:=min;
end;
for i:=1 to 3 do
begin
for j:=1 to 6 do write (x[i,j]:6:1);
writeln;
end;
End.
Задача 2. Дана матрица вещественных чисел


Program DМ2_2;
Var
C: array [1..8, 1..4] of real;
S: array [1..4] of real;
i, j: integer;
Begin
writeln(‘Введите матрицу C’);
for i := 1 to 8 do
for j := 1 to 4 do read(c[i,j]);
for j := 1 to 4 do
begin
s[ j ] := 0;
for i := 1 to 8 do s[ j ]:= s[ j ] + c[i,j];
s[ j ] := s[ j ]/8;
end;
for j := 1 to 4 do write(s[ j ]:8:2)
writeln;
End.
В данной программе следует обратить внимание на то, что при вычислении каждого элемента s[j] организован двойной цикл, в котором индекс


ГЛАВА 8. Подпрограммы