Двумерный массив или прямоугольная матрица B из n строк и m столбцов в общем виде выглядит следующим образом:
b11 b12 b1m
b21 b22 b2m
bn1 bn2 bnm
На языке Delphi имена элементов массива записываются также с двумя номерами (индексами):
b[1,1],b[1,2],…,b[1,m],b[2,1],b[2,2],…,b[2,m],…,b[n,1],b[n,2],…,b[n,m].
В памяти компьютера элементы двумерного массива расположены один за другим: после элементов первой строки следуют элементы второй строки матрицы и т.д. Если количество строк матрицы равно количеству столбцов, то такая матрица называется квадратной. Главная диагональ квадратной матрицы проходит из левого верхнего угла в правый нижний.
Рассмотрим задачи обработки матриц и алгоритмы их решения.
3.1. Вычисление суммы элементов главной диагонали квадратной матрицы.
Для решения задачи надо выполнить следующие шаги: ввести матрицу в память; найти сумму элементов главной диагонали; напечатать результат. Описание матрицы, как и описание одномерного массива, используется для резервирования памяти. В описании матрицы указываются диапазоны для двух номеров: строк и столбцов.
При обработке массивов в разделе описания переменных программы появляются имена индексов элементов: для одномерных массивов – одной, для двумерного – двух целочисленных переменных.
При вычислении суммы элементов диагонали следует обратить внимание на имена суммируемых элементов: оба индекса имеют одинаковое значение, т.е. в общем виде имя элемента диагонали будет b[i,i]. Это означает, что можно рассматривать диагональ как одномерный массив и использовать один цикл для вычислений.
Программа имеет следующий вид:
program Sum_Diagonal;
{$APPTYPE CONSOLE}
uses
SysUtils;
const
N=3;
var
b:array[1..n,1..n] of real;
I,j:interger;
S:real;
begin
writeln(‘введите значения элементов матрицы по строкам’);
writeln(‘в конце каждой строки нажимайте Enter’);
for i:=1 to n do
begin
for j:=1 to n do read(b[i,j]);
writeln;
end;
S:=0;
for i:=1 to n do
S:=S+b[i,i];
write(‘сумма элементов диагонали матрицы s=’,s);
readln;
end.
3.2.Нахождение наибольших элементов каждой строки матрицы.
Каждую строку матрицы можно рассматривать как одномерный массив и использовать идею нахождения наибольшего значения в программе maxim из предыдущего раздела. Найденные значения будем помещать в одномерный массив a.
program Max_In_Rows;
{$APPTYPE CONSOLE}
uses
SysUtils;
const
n=3;
var
b:array[1..n,1..n] of real;
I,j:interger;
a:array [1..n] of real;
begin
writeln(‘введите значения элементов матрицы по строкам’);
writeln(‘в конце каждой строки нажимайте Enter’);
for i:=1 to n do
begin
for j:=1 to n do read(b[i,j]);
writeln;
end;
for i:=1 to n do
begin
a[i]:=b[i,1];
for j:=2 to n do
if a[i]<b[i,j] then a[i]:=b[i,j];
end;
writeln (‘Наибольшие значения строк матрицы S’);
writeln (‘Номер строки Наибольшее значение’);
for i:=1 to n do
writeln (i:6,’ ’:20,a[i]);
readln;
end.
3.3. Нахождение сумм элементов столбцов матрицы.
При обработке матриц можно осуществлять операции как над строками, так и над столбцами. При нахождении суммы элементов столбцов можно использовать алгоритм из программы summa предыдущего раздела. Для лучшего понимания работы программы введем переменную S для вычисления суммы, а затем для каждого столбца запишем полученный результат в массив a, т.е. присвоим его переменной a[j], где j – текущий номер столбца матрицы.
Ниже приводится возможный вариант программы.
program Sum_By_Columns;
{$APPTYPE CONSOLE}
uses
SysUtils;
const
n=3;
var
b:array[1..n,1..n] of real;
I,j:interger;
S:=real;
a:array [1..n] of real;
begin
writeln(‘введите значения элементов матрицы по строкам’);
writeln(‘в конце каждой строки нажимайте Enter’);
for i:=1 to n do
begin
for j:=1 to n do read(b[i,j]);
writeln;
end;
for j:=1 to n do
begin
S:=0;
for i:=1 to n do S:=S+b[i,j];
a[,j]:=S;
end;
write(‘сумма элементов столбцов матрицы: ’);
for i:=1 to n do
write(a[i]);
readln;
end.
3.4. Перестановка строк матрицы.
В прямоугольной матрице b из n строк и m столбцов требуется поменять местами две строки. При решении этой задачи можно использовать алгоритм обмена значениями двух переменных из программы сортировки. Для этого достаточно организовать цикл по переменной столбца и, используя промежуточную (буферную) переменную, менять местами каждую пару элементов, стоящих в одном столбце. При заданных номерах строк K и L решение выглядит так:
program P;
{$APPTYPE CONSOLE}
uses
SysUtils;
const
n=3;m=4;
var
b:array [1..n,1..m] of real;
c:real;
K,L,i,j:interger;
begin
write(‘Введите номера меняемых местами строк матрицы’);
readln(K,L);
writeln(‘введите значения элементов матрицы по строкам’);
writeln(‘в конце каждой строки нажимайте Enter’);
for i:=1 to n do
begin
for j:=1 to n do read(b[i,j]);
writeln;
end;
for j:=1 to m do
begin
c:=b[K,j];
b[K,j}:=b[L,j};
b[L,j}:=c;
end;
writeln;
writeln(‘матрица с переставленными строками:’);
for i:=1 to n do
begin
for j:=1 to m do
write(b[i,j]);
wtiteln
end;
readln;
end.
Пример
Задача 1.
Рассчитать сумму отрицательных элементов массива А(n),
если известно, что
n = 5, A = (1.5, -4.6, 10, -1.7, -4.9).
Задача 2.
Найти разность R между максимальным и минимальным элементами массива
1. С помощью Проводника Windows на рабочем логическом диске создайте папку (например, Ivanov-5) для размещения файлов проекта.
2. Создайте проект «Console Application» консольного приложения Delphi.
3. Сохраните файлы проекта в папку Ivanov-5 под именем Ivanov
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.