Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информатика 2 сем / Учебник по языку Паскаль

.pdf
Скачиваний:
151
Добавлен:
14.03.2016
Размер:
3.17 Mб
Скачать

6. Двумерные массивы

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 Поиск суммы положительных элементов в каждой строке