Ввод-вывод матриц
Двумерный массив
Двумерный массив отличается от одномерного массива тем, что для доступа к его элементам используется два индекса. Для того, чтобы задать какую-либо ячейку двумерной таблицы указывают номер строки и номер столбца.
Двумерный массив можно описать тремя способами:
1) с использованием раздела описания типов:
Type Matrica=array[1..10, 1..10] of real;
Var a,b: matrica;
2) без использования раздела описания типов:
Var X: array[1..5,1..4] of integer; {Двумерный массив 5х4 элементов}
Полный вид двухмерного массива (матрицы):
a[1,1] a[1,2] a[1,3] a[1,4]
a[2,1] a[2,2] a[2,3] a[2,4]
a[3,1] a[3,2] a[3,3] a[3,4]
a[4,1] a[4,2] a[4,3] a[4,4]
a[5,1] a[5,2] a[5,3] a[5,4]
3) с использованием констант:
Const M=5; N=4;
Var Matr: array[1..M, 1..N] of real;
1) Ввод элементов матрицы осуществляют с помощью вложенных циклов for:
for i:=1 to 5 do
for j:=1 to 4 do Read(а[i,j]);
2) Вывод элементов матрицы можно осуществлять по строкам или по столбцам, но лучше, если они будут выводиться в виде таблицы, например
1 2 0 4
2 4 1 2
1 4 5 4
8 7 9 0
for i:=1 to 4 do
begin
for j:=1 to 4 do Write(a[i,j],’ ‘); {Печатается строка}
WriteLn; {Переход на новую строку}
end;
Свойства элементов матрицы:
1. если номер строки элемента совпадает с номером столбца (i=j), это означает что элемент лежит на главной диагонали матрицы.
2. если номер строки превышает номер столбца (i>j), то элемент находится ниже главной диагонали.
3. если номер столбца больше номера строки (i<j), то элемент находится выше главной диагонали.
4. элемент лежит на побочной диагонали, если его индексы удовлетворяют равенству i + j – 1 = n.
Пример1. Выведите элементы побочной диагонали квадратичной матрицы (3х3) на экран.
Program Primer1;
Var i,j :byte;
a: array[1..3,1..3] of integer;
begin
for i:=1 to 3 do
for j:=1 to 3 do Read(a[i,j]);
for i:=1 to 3 do
for j:=1 to 3 do If i+j-1=3 then Write(a[i,j],’ ‘);
end.
Пример 2. Составить программу, которая формирует двумерный массив случайных чисел, находит максимальный элемент в каждой строке матрицы и выводит его на экран.
program primer2;
const n=3;m=3;
var a:array[1..m,1..n] of integer;
i,j,max:integer;
begin
randomize;
for i:=1 to n do
begin
for j:=1 to m do
begin
a[i,j]:=random(20);
write(a[i,j],' ');
end;
writeln;
end;
for i:=1 to n do
begin
max:=a[i,1];
for j:=2 to m do
if a[i,j]>max then max:=a[i,j];
writeln('a[',i,']=',max);
end;
end.
Пример 3. Найти средние значения элементов каждого столбца матрицы (n,m) и вывести их на экран в виде одномерного массива.
program primer3;
var a:array[1..10,1..10] of integer;
b:array[1..10] of real;
i,j,S,n,m:integer;
begin
writeln('Введите n,m');
readln(n,m);
for i:=1 to n do
for j:=1 to m do
begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
writeln('Исходная матрица');
for i:=1 to n do
begin
for j:=1 to m do
write(a[i,j],' ');
writeln;
end;
for j:=1 to m do
begin
S:=0;
for i:=1 to n do S:=S+a[i,j];
b[j]:=S/m;
end;
for i:=1 to m do write(b[i]:6:2,' ');
end.
Пример 4. Написать программу умножения двух матриц A(n, m) и B(m, l).
Например, необходимо перемножить две матрицы
,
Воспользовавшись правилом «строка на столбец», получим матрицу:
.
В общем виде формула для нахождения Сij матрицы имеет вид:
,
где i = 1, N и j = 1, L. Обратите внимание, что проводить операцию умножения можно только в том случае, если количество строк левой матрицы совпадает с количеством столбцов правой. Кроме того, А*В ≠ В*А.
program primer4;
var a,b,c: array [1..10,1..10] of integer;
i,j,k,m,n,l: byte;
s:integer;
begin
writeln('Vvedite m,n,l');
read(n,m,l);
writeln('Vvedite massiv A');
for i:=1 to n do
for j:=1 to m do read(a[i,j]);
writeln('Vvedite massiv B');
for i:=1 to m do
for j:=1 to l do read(b[i,j]);
writeln;
for i:=1 to n do
for j:=1 to l do
begin
S:=0;
for k:=1 to m do S:=S+a[i,k]*b[k,j];
c[i,j]:=S;
end;
for i:=1 to n do
begin
for j:=1 to l do write(c[i,j],' ');
writeln;
end;
end.
Пример 5. Написать программу, которая в каждой строке матрицы сортирует элементы по возрастанию.
program Sort;
const m=4; n=4;
var a: array [1..n,1..m] of integer;
i,j,c,k: byte;
begin
writeln('Введите матрицу');
for i:=1 to n do
for j:=1 to m do read(a[i,j]);
writeln;
for i:=1 to n do
for k:=1 to m-1 do {k - номер просмотра}
for j:=1 to m-k do
if a[i,j]>a[i,j+1] then
begin
c:=a[i,j];
a[i,j]:=a[i,j+1];
a[i,j+1]:=c;
end;
for i:=1 to n do
begin
for j:=1 to m do write(a[i,j],' ');
writeln;
end;
end.