Информатика 2 сем / Учебник по языку Паскаль
.pdf6. Двумерные массивы |
131 |
i := 1 , N |
|
j := 1 , M |
|
odd(A[i ,j] ) |
|
A[i ,j] := A[i ,j]2 |
|
Рисунок 6.5 Возведение в квадрат нечетных элементов |
|
Вот типичная задача на обработку всего двумерного массива с анализом элементов.
ПРИМЕР
Возвести в квадрат все нечетные элементы двумерного массива A. Решении таково (Рисунок 6.5):
for i:=1 to N do for j:=1 to M do
if odd(A[i,j]) then A[i,j] := sqr(A[i,j]);
Напомним, что odd – логическая функция проверки нечетности. Рассмотрим полностью задачу, которая в предыдущей главе решалась
для одномерных массивов, а именно:
ПРИМЕР
Найти среднее арифметическое четных элементов массива.
Для начала, как это принято, составим тестовый пример:
вход: |
2 |
1 |
2 |
; выход: SrA=4. |
|
8 |
4 |
5 |
|||
|
|
||||
|
|
|
|
|
Сам алгоритм практически такой же, как и в задаче для одномерных массивов отличие здесь в том, что дополнительно добавляется цикл по столбцам (по j). Блок схема алгоритма представлена на (Рисунок 6.6).
132 |
6.2 Поэлементная обработка двумерных массивов |
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рисунок 6.6 Среднее арифметическое четных элементов двумерного массива
6. Двумерные массивы |
133 |
Программа будет такова: program massiv2m;
var A:array[1..10,1..10] of integer; i,j,k,N,M:byte;
S:integer;
SrA:real; begin
writeLn('Введите количество элементов в массиве'); 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;
S:=0;
k:=0;
for i:=1 to N do for j:=1 to M do
if (A[i,j] mod 2) = 0 then begin
S:=S+A[i,j];
k:=k+1;
end; if k<>0 then
begin
SrA := S/k;
writeLn('Среднее арифметическое: ', SrA:8:2); end
else
writeLn('В массиве нет четных элементов'); end.
Поэлементная обработка массива с анализом может быть представлена некоторыми классическими алгоритмами. Наиболее известные и часто встречающиеся – алгоритмы поиска экстремальных по значению (максимум и минимум). Итак, для примера рассмотрим поиск максимума в двумерном массиве. Алгоритм точно такой же, как и для одномерного массива. Стоит только не забывать, что при просмотре меняются как строки, так и столбцы. Кроме того, нам необходима пара индексов для выяснения точного местоположения элемента с максимальным значением. За координаты отвечают переменные IMax, JMax, а за сам максимум переменная Max (Рисунок 6.8):
Imax :=1;
Jmax :=1;
Max := A[1,1]; for i:=1 to N do
for j:=1 to M do
if A[i,j]>Max then
134 |
6.2 Поэлементная обработка двумерных массивов |
begin
Max := A[i,j]; IMax := i; JMax := j;
end;
Очевидно, что для поиска минимального элемента нам потребуется изменить знак в условии с «>» на «<». Да и имена переменных в которых будут храниться искомые значения следует заменить на IMin, JMin и Min.
Рисунок 6.7 Поиск максимума |
Алгоритмы поиска элементов не всегда могут быть такими простыми. В качестве примера рассмотрим еще одну задачу, которая решалась для одномерного массива, а именно:
6. Двумерные массивы |
135 |
ПРИМЕР
Найти наименьший среди нечетных элементов двумерного массива.
Для этой задачи составим тестовый пример:
|
−8 |
−1 |
3 |
−1 |
|
вход: A = |
|
|
|
|
выход: Min = –5; IMin = 2; JMin = 1; |
−5 |
0 |
7 |
6 |
||
|
|
|
|
|
|
|
2 |
1 |
9 |
4 |
|
Здесь при решении есть некоторые особенности, связанные с тем, что обрабатываемый массив двумерный. А так алгоритм практически такой же, и распадается на две части: поиск первого нечетного элемента и поиск минимума, при условии нечетности, начиная с найденного. Тут тоже воспользуемся для первой части задачи циклом с предусловием. Теперь нужно производить инкрементацию не только индекса столбца JMin, но и следить за своевременной инкрементацией индекса столбца IMin (Рисунок
6.8):
IMin := 1;
JMin := 1;
while (not odd(A[IMin,JMin])) and (IMin<N) do begin
JMin := JMin+1; if JMin>M then
begin
JMin := 1; IMin := IMin+1;
end;
end;
for i:= IMin to N do for j:= 1 to M do
if A[i,j]< A[IMin,JMin]) and (odd(A[i,j]) then begin
Min := A[i,j]; IMin := i; JMin := j;
end;
if IMin<=then writeLn(‘A[’,IMin,‘,’,JMin,‘]=’,A[IMin,JMin]);
else
writeLn(‘в массиве все элементы четные’);
Если в массиве все элементы четные, то будет выведено соответствующее сообщение. Рассмотренный пример является одним из вариантов решения задачи, однако, он не единственный. Есть иная реализация алгоритма поиска с использованием логической переменной Flag, аналогично тому как это делалось для одномерного массива. Здесь будет всё аналогично, за исключением добавления цикла по строкам и включения как индексов строк, так и столбцов (алгоритм рассматривать не будем).
136 |
6.2 Поэлементная обработка двумерных массивов |
|
|
|
IMin := 1 |
|
|
JMin := 1 |
|
Not odd(A[IMin, JMin]) |
|
|
|
And Imin≤N |
|
|
JMin := JMin+1 |
|
|
Jmin>M |
|
JMin := 1 |
|
|
IMin := IMin + 1 |
|
|
|
i := Imin , N |
|
|
j := 1 , M |
|
(A[i, j] < A[Imin, JMin]) |
|
|
|
and odd(A[i, j]) |
|
IMin := i |
|
|
JMin := j |
|
|
|
Imin≤N |
|
Вывод A[IMin, Jmin] |
‘В массиве все |
|
IMin, JMin |
элементы четные’ |
|
Рисунок 6.8 Поиск минимального среди нечетных |
6. Двумерные массивы |
137 |
Вот еще одна типовая задача на максимумы и минимумы для двумерных массивов.
ПРИМЕР
В двумерном массиве поменять местами максимальный и минимальный элементы.
Тут все просто. Ищем индексы максимума и минимума, а далее производим обмен в три действия (Рисунок 6.9).
program MaxMInExch; const L=10;
type T2Mx = array[1.. L,1..L] of integer; var A: T2Mx;
i,j,Imax,Jmax,IMin,JMin,N,M:byte;
buf:integer; begin
writeLn('Введите размерность матрицы:'); 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; IMax:=1; JMax:=1; IMin:=1; JMin:=1; for i:=1 to N do
for j:=1 to M do begin
if A[i,j]>A[IMax,JMax] then begin
IMax:=i; JMax:=j; end;
if A[i,j]<A[IMin,JMin] then begin
IMin:=i; JMin:=j; end;
end;
buf:=A[IMax,JMax];
A[IMax,JMax]:=A[IMin,JMin];
A[IMin,JMin]:=buf;
writeLn('Матрица после преобразования:'); for i:=1 to N do
begin
for j:=1 to N do write(A[i,j]:4);
writeLn;
end;
end.
|
138 |
6.2 Поэлементная обработка двумерных массивов |
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рисунок 6.9 Обмен максимума и минимума в двумерном массиве
ПРИМЕР
Далее можно рассмотреть задачу формирования из заданного массива нового нового.
Из матрицы A получить новые одномерные массивы C и D. В C содержатся положительные компоненты матрицы A, а в D – отрицательные. Длины получившихся массивов сохраняются в переменных Nc и Nd, соответственно.
6. Двумерные массивы |
139 |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рисунок 6.10 Формирование из двумерного массива пары одномерных |
Тестовый пример может выглядеть так:
|
1 |
−5 |
4 |
2 |
B = |
|
|
|
|
|
|
|
|
|
|
|
вход: A = |
|
1 |
|
4 |
2 |
|
3 |
6 |
7 |
8 |
||||||
|
|
|
|
|
|
|
||||||||||
−3 |
3 |
0 |
6 |
выход: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
D = |
|
−5 |
|
−3 |
|
|
|
||||
|
7 |
0 |
8 |
0 |
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
Листинг программы для блок-схемы (Рисунок 6.10):
Nc := 0; Nd := 0; for i:=1 to N do for j:=1 to M do
if A[i,j]>0 then begin
Nc:=Nc+1; C[Nc]:=A[i,j]; end
else
if A[i,j]<0 then begin
Nd := Nd+1; C[Nd]:=A[i,j]; end;
1406.3 Обработка отдельных строк или столбцов матрицы
6.3Обработка отдельных строк или столбцов матрицы
Важным классом алгоритмов двумерных массив является построчная или постолбцовая обработка. Если вспомнить одно из определений двумерного массива, которое говорит что это «массив одномерных массивов», то подход к поставленной задаче упрощается.
Для решения таких задач можно воспользоваться алгоритмами показанными на Рисунок 6.11. Суть их сводится к тому, что внутри внешнего цикла помещаются действия, которые можно представить в виде алгоритма на одномерном массиве, если положить неизменным индекс строки i при построчном, или индекс j при постолбцовом проходе.
Рисунок 6.11 Построчная – а) и постолбцовая – б) обработка двумерного массива
В качестве примера можно решить, скажем, такую задачу:
ПРИМЕР
Найти сумму положительных элементов в каждой строке матрицы.
Рисунок 6.12 Поиск суммы положительных элементов в каждой строке