Информатика_всем
.pdf6. Двумерные массивы |
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. Двумерные массивы |
141 |
Алгоритм решения состоит в следующем. Во внешнем цикле меняем индекс строки (Рисунок 6.12 а)), а во внутреннем решаем задачу поиска суммы элементов одномерного массива с последующим выводом результатов на экран (Рисунок 6.12 б)). Индекс строки i фиксируем во внутреннем цикле. Поиск суммы обычный, по рекуррентной формуле: «сумма текущего равна сумме предыдущего плюс текущее». На каждом новом проходе (при изменении индекса строки i) происходит обнуление переменной хранящей текущее значение суммы S.
Для иллюстрации задачи предоставим тестовый пример:
|
−1 |
−4 |
−8 |
0 |
−2 |
S1 = 0 |
вход: A = |
|
|
|
|
|
выход: S2 =8 |
1 |
0 |
4 |
−5 |
3 |
||
|
2 |
−7 |
−1 |
0 |
8 |
S3 =10 |
Программная часть на языке Pascal следующая: for i:=1 to N do
begin
S := 0;
for j:=1 to M do if A[i,j]>0 then
S:=S+A[i,j];
writeLn(‘сумма ’, i, ’-той строки равна’, S); end;
А теперь рассмотрим пример с обработкой элементов по столбцам. Пусть задача будет формулируется следующим образом:
ПРИМЕР
Переписать максимальные элементы каждой строки двумерного массива A в одномерный массив B.
Тестовый пример выглядит так:
|
|
|
−1 |
−4 |
−8 |
0 |
|
−2 |
|
||
вход: |
A = |
|
|
|
|
|
|
|
|
|
|
1 |
0 |
4 |
|
−5 |
3 |
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
−7 |
−1 |
0 |
|
8 |
|
|
|
выход: |
B = |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
2 |
0 |
4 |
|
0 |
|
8 |
, |
|||
|
|
|
|
|
|
|
|
|
|
|
|
а текст программы: for j:=1 to M do
begin
max:= A[1, j]; for j:=1 to N do
if A[i,j]>max then max:=A[i,j];
B[j]:=max;
end;
144 6.3 Обработка отдельных строк или столбцов матрицы
while j<=M do begin
for i:=1 to N do A[i,j]:=1;
j:=j+2;
end;
Рисунок 6.15 Обработка четных столбцов при помощи цикла for – а) и при помощи цикла while –б)
Вообще, там где происходит заведомо меньшее число проходов чем строк или столбцов в матрице, нет необходимости проводить полный перебор. Гораздо логичнее будет использовать или цикл с предусловием с нужным шагом по строкам/столбцам, или цикл for с меньшим числом проходов и с формулой прямого вычисления нужного индекса.
ПРИМЕР
Переставить местами соседние строки матрицы. Это означает
следующее: |
|
|
|
|
|
|
|
|
|
|
|
|
−1 |
−4 |
−8 |
0 |
−2 |
|
−4 |
−1 |
0 |
−8 |
−2 |
вход: A = |
|
|
|
|
|
выход: A = |
|
|
|
|
|
1 |
0 |
4 |
−5 |
3 |
0 |
1 |
−5 |
4 |
3 |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
−7 |
−1 |
0 |
8 |
|
−7 |
2 |
0 |
−1 |
8 |
|
|
|
|
|
|
|
|
|
|
|
|
Последний столбец остался без изменения, поскольку для него не нашлось пары. Очевидно, что число парных перестановок столбцов в два раза меньше чем их количество в матрице.
Алгоритм решения при помощи цикла for следующий (Ошибка!
Источник ссылки не найден. а)):