Лекция
Тема:
«Обработка двумерных массивов в программах на Turbo Pascal»
План
1. Описание двумерных массивов
2. Основные операции с
двумерными массивами
3. Типовые алгоритмы обработки
двумерных массивов
1. Описание двумерных массивов
Помимо одномерных массивов широкое применение получили двумерные массивы
(матрицы). Это массивы, состоящие как бы из нескольких одномерных массивов,
записанных в несколько строк.
Массивы, в которых положение каждого элемента определяется 2 величинами -
номером строки и номером столбца - называются двумерными массивами, матрицами.
Для описания двумерного массива нужно указывать количество элементов в
строке и количество строк. Оператор
описания таких массивов имеет один из видов:
Type Mas=Array [1..10,1..15] Of
Real;
Var A,B: Mas;
Var A, B: Array [1..10,1..15] Of
Real;
В данном примере описаны два двумерных массива А, В, состоящих из 10
строк и 15 столбцов.
После этой записи под каждый массив отводится по 10*15*6 = 900 байт оперативной памяти (6 –
это количество байт, которое занимает одна переменная типа Real).
2. Основные операции с двумерными массивами
Работа с массивами производится поэлементно. Каждый элемент массива
определяется именем массива и двумя индексами (номером строки и номером
столбца).
При
этом для указания имени элемента задается имя массива, а затем, в квадратных
скобках, вначале номер строки, а затем номер столбца.
Присвоить элементу массива А, расположенному на пересечении 3 строки и 2 столбца значение = 10.4
А[3,
2]= 10.4;
Обнулить элемент массива А на пересечении 2 строки и 4 столбца:
А[2,
4] = 0;
А[1,
4] = А[1, 4] + К;
Поменять местами значение элемента А[2,2] со значением элемента А[4,3], используя новую переменную:
В = А[2,2];
А(2,2) = А[4,3];
А[4,3] = В;
Ввод осуществляется с помощью операторов READ, READLN. При этом, так как элемент массива характеризуется двумя индексами (номером строки и номером столбца), то поэлементная обработка массива выполняется с помощью вложенных циклов. Во внешнем цикле меняется номер строки, а во внутреннем - номер столбца.
Type Mas = Array [1..10,1..10]
Of Real;
Var A: MAS;
I,J,N,M: Integer;
Write ('Введите количество строк в матрице: ');
Readln (N);
Write ('Введите количество столбцов в матрице:
');
Readln (M);
Writeln ('Введите матрицу:');
For
I:= 1 To N Do
For
J:= 1 To M Do
Read
(A[I, J]);
Readln
End;
End.
Данный способ позволяет ввести двумерный массив в виде матрицы. Значения
каждой строки вводятся через пробел, а в конце строки нажимают Enter.
Для автоматического генерирования массива можно воспользоваться фрагментом:
Type Mas = Array [1..10,1..10]
Of Real;
Var A: Mas;
A,B,I,J,N,M: Integer;
Begin
Write ('Введите начало и конец отрезка: ');
Readln (A, B);
Write ('Введите количество строк в матрице: ');
Readln (N);
Write ('Введите количество столбцов в матрице:
');
Readln
(M);
Randomize;
For
J:= 1 To M Do
A[I,
J]:=(B-A)*Random+A
End;
Вывод массива
Для вывода используют операторы WRITE, WRITELN. Вывод также осуществляется во вложенном цикле. При этом, в строку выводятся элементы первой строки и курсор переходит на новую строку. То есть вывод идет построчно.
For I :=1 To N Do
Begin
Write
(A[I, J]);
End;
Если требуется вывести на экран элементы строки номер которой известен,
то используют один цикл по параметру J.
Пример. Вывести на печать элементы 2 строки матрицы А(4, 3).
Write
(A[2, J]);
Если нужно вывести на печать элементы известного столбца, то используют один цикл по параметру I.
Пример. Вывести на печать элементы 3 столбца матрицы А(4, 3)
For I:=1 To 4 Do
Write
(A[I, 3]);
3. Типовые алгоритмы обработки двумерных массивов
Для обработки двумерных массивов использую следующие виды типовых алгоритмов:
· нахождение суммы и произведения всей матрицы:
s: = 0;
p: = 1;
For i: = 1 To N Do
For
j: = 1 To M Do
Begin
s:
= s + a[i, j];
p:
= p * a[i,j];
End;
· нахождение максимального значения в матрице и его порядкового номера
max:
= a[1,1];
nom1:
= 1;
nom2=1;
For
i: = 1 To 5 N Do
For j: = 1 To M Do
If max < a[i,j] Then
Begin
max: = a[i,j];
nom1:=i;
nom2:=j
End;
· нахождение кол-ва элементов, отвечающих условию:
k:
= 0;
For
i: = 1 To N Do
For j: = 1 To M Do
If условие Then
k: = k + 1;
Пример. Найти сумму элементов в указанной строке матрицы
{Подключаем модуль для работы с экраном}
Uses Crt;
{Описываем пользовательский тип}
Type Mas = Array [1..10,1..10]
Of Real;
{Описываем переменные}
Var A: Mas;
A,B,I,J,N,M: Integer;
s:Real;
Begin
{Вводим отрезок для формирования массива}
Write ('Введите начало и конец отрезка: ');
Readln (A, B);
{Вводим размерность массива}
Write ('Введите количество строк в матрице: ');
Readln (N);
Write ('Введите количество столбцов в матрице:
');
Readln (M);
{Включаем генератор случайных чисел}
Randomize;
For
J:= 1 To M Do
A[I,
J]:=(B-A)*Random+A
{Выводим полученный массив для просмотра}
For I
:=1 To N Do
Begin
Write
(A[I, J]);
End;
{Вводим номер строки
для подсчета суммы}
Write (‘Укажите номер строки’);
ReadLn (k);
{Вначале сумма равна
0}
s: = 0;
{В цикле подсчитываем
сумму по строке}
For j: = 1 to M do
s: = s + a[k,j];
{Выводим полученную
сумму на экран}
Writeln (‘Сумма в ’,k,’-й строке равна: ’,s);
{Делаем паузу для
просмотра}
Readln;
End.
Пример. Найти сумму элементов четных строк матрицы
{Подключаем модуль для работы с экраном}
Uses Crt;
{Описываем пользовательский тип}
Type Mas = Array [1..10,1..10]
Of Real;
{Описываем переменные}
Var A: Mas;
A,B,I,J,N,M: Integer;
s:Real;
Begin
{Вводим отрезок для формирования массива}
Write ('Введите начало и конец отрезка: ');
Readln (A, B);
{Вводим размерность массива}
Write ('Введите количество строк в матрице: ');
Readln (N);
Write ('Введите количество столбцов в матрице:
');
Readln (M);
{Включаем генератор случайных чисел}
Randomize;
For
J:= 1 To M Do
A[I,
J]:=(B-A)*Random+A
{Выводим полученный массив для просмотра}
For I
:=1 To N Do
Begin
Write
(A[I, J]);
End;
{Вначале сумма равна
0}
s: = 0;
For i: = 1 To N Do
{Если текущая строка четная}
If (i Mod 2 = 0) Then
{То
проходим по все ее элемента и суммируем их}
For j: = 1 To M Do
s:
= s + A[i,j];
{Выводим полученную
сумму на экран}
Writeln (‘Сумма равна: ’,s);
{Делаем паузу для
просмотра}
Readln;
End.
Пример: Найти максимальное значение из всех максимумов каждой строки
{Подключаем модуль для работы с экраном}
Uses Crt;
{Описываем пользовательский тип}
Type Mas = Array [1..10,1..10]
Of Real;
{Описываем переменные}
Var A: Mas;
A,B,I,J,N,M: Integer;
max_str, max:Real;
Begin
{Вводим отрезок для формирования массива}
Write ('Введите начало и конец отрезка: ');
Readln (A, B);
{Вводим размерность массива}
Write ('Введите количество строк в матрице: ');
Readln (N);
Write ('Введите количество столбцов в матрице:
');
Readln (M);
{Включаем генератор случайных чисел}
Randomize;
For
J:= 1 To M Do
A[I,
J]:=(B-A)*Random+A
{Выводим полученный массив для просмотра}
For I
:=1 To N Do
Begin
Write
(A[I, J]);
End;
{Сначала максимум
равен 0}
max: = 0;
For i: = 1 To N Do
Begin
{Вначале
максимум текущей строки равен первому элементу в строке}
max_str: = a[i,1];
{Из всех элементов
строки находим максимум}
{ и заносим его в
переменную max_str}
For j: = 1 To M Do
If max_str
< a[i,j] Then
max_str: = a[i,j];
{Найденный максимум
строкисравниваем с общим максимумов}
{Если он больше, то
запоминаем его }
If max < max_str Then
max:
= max_str
End;
{Выводим полученный
максимум на экран}
Writeln (‘Максимум равен: ’,max);
{Делаем паузу для
просмотра}
Readln;
End.
Пример. Определить в какой строке находится максимальное кол-во отрицательных элементов
{Подключаем модуль для работы с экраном}
Uses Crt;
{Описываем пользовательский тип}
Type Mas = Array [1..10,1..10]
Of Real;
{Описываем переменные}
Var A: Mas;
A,B,I,J,N,M: Integer;
kol_str, kol:Real;
Begin
{Вводим отрезок для формирования массива}
Write ('Введите начало и конец отрезка: ');
Readln
(A, B);
{Вводим размерность массива}
Write ('Введите количество строк в матрице: ');
Readln (N);
Write ('Введите количество столбцов в матрице:
');
Readln (M);
{Включаем генератор случайных чисел}
Randomize;
For
J:= 1 To M Do
A[I,
J]:=(B-A)*Random+A
{Выводим полученный массив для просмотра}
For I
:=1 To N Do
Begin
Write
(A[I, J]);
End;
{Сначала количество
равно 0}
kol: = 0;
For i: = 1 To N Do
Begin
{Вначале количество в
текущей строке = 0}
kol_str: = 0;
{В цикле проходим по
всем элементам и считаем}
{количество
отрицательных элементов ней}
For j: = 1 To M Do
If a[i, j]
< 0 Then
kol_str:
= kol_str + 1;
{Если найденное
количество больше найденного ранее}
If kol < kol_str Then
{То запоминаем его и номер соответствующей строки}
Begin
kol: = kol_str;
nom:
= i;
End;
End;
{Выводим полученное
количество и номер строки}
Writeln (kol, ‘ элементов в ’, nom, ‘
строке’);
{Делаем паузу для
просмотра}
Readln
End.