2.2. Обработка двумерных массивов в(n,m)
Описание матрицы
CONST
N1 = 20; {МАКСИМАЛЬНОЕ КОЛ-ВО СТРОК}
М1 = 20; {МАКСИМАЛЬНОЕ КОЛ-ВО СТОЛБЦОВ}
TYPE
MAS2 = ARRAY[1..N1,1..M1] OF INTEGER;
VAR
B : MAS2;
N,M : INTEGER; {РЕАЛЬНЫЕ РАЗМЕРЫ}
I,J : INTEGER; {ИНДЕКСЫ}
Ввод массива
WRITELN(‘ВВЕДИТЕ КОЛ-ВО СТРОК N = ’);
READ(N);
WRITELN(‘ВВЕДИТЕ КОЛ-ВО СТОЛБЦОВ M = ’);
READ(M);
FOR I:=1 TO N DO
FOR J:=1 TO M DO
BEGIN
WRITE(‘B[‘, I , ‘,’, J, ’]= ‘);
READ(B[I,J]);
END;
Вывод массива
FOR I:=1 TO N DO
BEGIN
FOR J := 1 TO M DO
WRITE( B[I]);
WRITELN;
END;
ПРИМЕЧАНИЕ: Алгоритмы поиска произведения, количества, суммы, средних арифметических и геометрических, максимальных и минимальных значений соответствуют алгоритмам для векторов, только необходимо завести еще цикл для столбцов.
Рассмотрим далее несколько специфических алгоритмов для матриц.
Найти минимальный элемент в каждом столбце
FOR J := 1 TO M DO
BEGIN
MIN := B[1,J];
FOR I := 1 TO N DO
IF B[I,J] < MIN THEN
MIN := B[I,J];
WRITELN(MIN);
END;
Найти минимальный элемент в каждой строке и записать их в одномерный массив А
FOR I := 1 TO N DO
BEGIN
MIN := B[I,1];
FOR J := 1 TO M DO
IF B[I,J] < MIN THEN
MIN := B[I,J];
A[I] := MIN;
END;
Найти максимальный элемент среди отрицательных элементов каждой нечетной строки
I:=1;
WHILE I <= N DO
BEGIN
MAX := -10000;
J:= 1;
WHILE J <= M DO
BEGIN
IF ( B[I,J] < 0) AND (B[I,J] > MAX) THEN
MAX := B[I,J];
J := J+1;
END;
I := I+2;
END;
Построчная сортировка матрицы
FOR I := 1 TO N D0
REPEAT
FLAG:=0;
FOR J= 1 TO M –1 DO
IF A[I,J]>A[I,J+1] THEN
BEGIN
C := A[I,J];
A[I,J] := A[I,J+1];
A[I,J+1] := C;
FLAG := 1;
END;
UNTIL FLAG=0;
Обменять местами элементы главной и побочной диагоналей
FOR I := 1 TO N DO
BEGIN
V := A[I,I];
A[I,I] := A[I,N+1-I];
A[I,N+1-I] := V;
END;
Что-то сделать над главной диагональю( диаг. не включать)
FOR I :=1 TO N-1 DO
FOR J := I+1 TO N DO
……………….
Что-то сделать под главной диагональю( диаг. не включать)
FOR I :=2 TO N DO
FOR J := 1 TO I-1 DO
……………….
Что-то сделать над побочной диагональю( диаг. не включать)
FOR I :=1 TO N-1 DO
FOR J := 1 TO N-I DO
……………….
Что-то сделать под побочной диагональю( диаг. не включать)
FOR I :=2 TO N DO
FOR J := N+2-I TO N DO
……………….
Примеры решения задач
Задача 1
Дан одномерный массив T(N). Найти в массиве минимальный элемент и сумму четных элементов. Затем заменить этой суммой все отрицательные элементы, стоящие после минимального элемента.
Тестовый пример
Ввод:
Размерность массива N=10.
Массив Т: {13; 15; 11; –100; 8; 4; –7; 6; –5; 78}
Вывод:
Минимальный элемент массива: –100.
Сумма четных элементов массива: –4.
Массив Т после преобразования: {13; 15; 11; –100; 8; 4; –4; 6; –4; 78}
Б
лок-схема
с пошаговой детализацией:
Программа на ЯВУ ТР7.0
PROGRAM ZADACHA1;
CONST
N1=50;
TYPE
MAS1=ARRAY[1..N1] OF INTEGER;
VAR
T:MAS1;
IMIN,MIN,S:INTEGER;
I:INTEGER;
N:INTEGER;
BEGIN
{ШАГ 1-2}
WRITE('ВВЕДИТЕ РАЗМЕР N=');
READ(N);
FOR I:=1 TO N DO
BEGIN
WRITE('T[',I,']= ');
READ(T[I]);
END;
{--------------------------------------------------------}
{ШАГ 2-3}
MIN:=T[1];
IMIN:=1;
FOR I:=2 TO N DO
IF T[I]<MIN THEN
BEGIN
MIN:=T[I];
IMIN:=I;
END;
WRITELN('МИНИМАЛЬНЫЙ ЭЛЕМЕНТ МАССИВА: ',MIN);
{--------------------------------------------------------}
{ШАГ 3-4}
S:=0;
FOR I:=1 TO N DO
IF T[I] mod 2=0 THEN
S:=S+T[I];
WRITELN('СУММА ЧЕТНЫХ ЭЛЕМЕНТОВ МАССИВА: ',S);
{--------------------------------------------------------}
IF IMIN<N THEN
BEGIN
{ШАГ 4-5}
FOR I:=IMIN+1 TO N DO
IF T[I]<0 THEN
T[I]:=S;
{--------------------------------------------------------}
{ШАГ 5-6}
FOR I:=1 TO N DO
WRITELN('T[',I,']=',T[I]:4);
END
{--------------------------------------------------------}
ELSE
WRITE('МИНИМАЛЬНЫЙ ЭЛЕМЕНТ ПОСЛЕДНИЙ');
WRITELN;
END.
Задача 2
В массиве В(N) найти максимальный элемент. Если максимальный элемент находится в первой половине массива, то сформировать массив К, переписав в него все отрицательные элементы массива В, и массив Р, переписав в него все положительные элементы массива В. Массивы К и Р отпечатать.
Тестовый пример
Ввод:
Размерность массива N=15.
Массив Т: {13; -15; -11; 100; 8; 4; 0; 6; –5; 0; 3; -8; 4; -3; 1}
Вывод:
Номер максимального элемента массива В: 4.
Массив К: {-15; -11; -5; -8; –3} Массив К: {13; 100; 8; 4; 6; 3; 4; 1}
Блок-схема с пошаговой детализацией:
П
рограмма
на ЯВУ ТР7.0
PROGRAM ZADACHA2;
CONST
N1=50;
TYPE
MAS1=ARRAY[1..N1] OF REAL;
VAR
B,K,P:MAS1;
MAX:REAL;
IMAX,K1,K2:INTEGER;
I:INTEGER;
N:INTEGER;
BEGIN
{ШАГ 1-2}
WRITE('ВВЕДИТЕ РАЗМЕР N=');
READ(N);
FOR I:=1 TO N DO
BEGIN
WRITE('B[',I,']= ');
READ(B[I]);
END;
{-----------------------------------------------------------------------}
{ШАГ 2-3}
MAX:=B[1];
IMAX:=1;
FOR I:=2 TO N DO
IF B[I]>MAX THEN
BEGIN
MAX:=B[I];
IMAX:=I;
END;
{-----------------------------------------------------------------------}
IF IMAX<(N div 2)+1 THEN
BEGIN
{ШАГ 3-4}
K1:=0;
K2:=0;
FOR I:=1 TO N DO
IF B[I]<0 THEN
BEGIN
K1:=K1+1;
K[K1]:=B[I];
END
ELSE
IF B[I]>0 THEN
BEGIN
K2:=K2+1;
P[K2]:=B[I];
END;
{-----------------------------------------------------------------------}
{ШАГ 4-5}
FOR I:=1 TO K1 DO
WRITELN('K[',I,']=',K[I]:6:2);
{-----------------------------------------------------------------------}
{ШАГ 5-6}
FOR I:=1 TO K2 DO
WRITELN('P[',I,']=',P[I]:6:2);
{-----------------------------------------------------------------------}
END;
END.
Задача 3
Дана матрица K(N,M). Найти среднее арифметическое в каждой строке матрицы и переписать в одномерный массив Т. Затем в массиве изменить порядок следования элементов на обратный.
Тестовый пример
Ввод:
Размерность массива N=4, М=3.
Матрица К: 13 –15 8
6 0 3
-1 8 5
11 13 6
Вывод:
Массив Т: {2; 3; 4; 10}
Массив Т после перестановки: {10; 4; 3; 2}
Блок-схема с пошаговой детализацией:
Программа на ЯВУ ТР7.0
PROGRAM ZADACHA3;
CONST
N1=20;
M1=25;
TYPE
MAS2=ARRAY[1..N1,1..M1] OF REAL;
MAS1=ARRAY[1..N1] OF REAL;
VAR
K:MAS2;
T:MAS1;
C,S:REAL;
I,J:INTEGER;
N,M:INTEGER;
BEGIN
{ШАГ 1-2}
WRITE('ВВЕДИТЕ КОЛ-ВО СТОРОК N=');
READ(N);
WRITE('ВВЕДИТЕ КОЛ-ВО СТОЛБЦОВ M=');
READ(M);
FOR I:=1 TO N DO
FOR J:=1 TO M DO
BEGIN
WRITE('K[',I,',',J,']= ');
READ(K[I,J]);
END;
{------------------------------------------}
{ШАГ 2-3}
FOR I:=1 TO N DO
BEGIN
S:=0;
FOR J:=1 TO M DO
S:=S+K[I,J];
T[I]:=S/M;
END;
{------------------------------------------}
{ШАГ 3-4}
FOR I:=1 TO N DO
WRITELN('T[',I,']=',T[I]:6:2);
{------------------------------------------}
{ШАГ 4-5}
FOR I:=1 TO N DIV 2 DO
BEGIN
C:=T[I];
T[I]:=T[N+1-I];
T[N+1-I]:=C;
END;
{------------------------------------------}
{ШАГ 6-7}
FOR I:=1 TO N DO
WRITELN('T[',I,']=',T[I]:6:2);
END.
Задача 4
Даны матрицы F(N,N) и D(N,N). Поменять местами главные диагонали матриц F и D. Затем найти максимальный элемент под побочной диагональю матрицы F и минимальный элемент всей матрицы D и поменять их местами.
Тестовый пример
Ввод:
Размерность массива N=3.
Матрица F: 13 –15 8 Матрица D: 14 10 18
6 0 3 16 2 13
-1 8 5 -1 18 -5
Вывод:
После смены диагоналей:
Матрица F: 14 –15 8 Матрица D: 13 10 18
6 2 3 16 0 13
-1 8 -5 -1 18 5
Максимальный элемент матрицы F: 8
Минимальный элемент матрицы D: -1
После смены местами максимального и минимального элементов:
Матрица F: 14 –15 8 Матрица D: 13 10 18
6 2 3 16 0 13
-1 -1 -5 8 18 5
Блок-схема:
Пошаговую детализацию предлагается выполнить студентам самостоятельно.
Программа на ЯВУ ТР7.0
PROGRAM ZADACHA4;
CONST
N1=20;
TYPE
MAS2=ARRAY[1..N1,1..N1] OF REAL;
VAR
F,D:MAS2;
MAX,MIN,C:REAL;
IMAX,JMAX:INTEGER;
IMIN,JMIN:INTEGER;
I,J:INTEGER;
N:INTEGER;
BEGIN
{ШАГ 1-2}
WRITE('ВВЕДИТЕ РАЗМЕРНОСТЬ КВАДРАТНЫХ МАТРИЦ N=');
READ(N);
FOR I:=1 TO N DO
FOR J:=1 TO N DO
BEGIN
WRITE('F[',I,',',J,']= ');
READ(F[I,J]);
END;
{---------------------------------------------------------}
{ШАГ 2-3}
FOR I:=1 TO N DO
FOR J:=1 TO N DO
BEGIN
WRITE('D[',I,',',J,']= ');
READ(D[I,J]);
END;
{---------------------------------------------------------}
{ШАГ 3-4}
FOR I:=1 TO N DO
BEGIN
C:=F[I,I];
F[I,I]:=D[I,I];
D[I,I]:=C;
END;
{---------------------------------------------------------}
{ШАГ 4-5}
WRITELN('ВЫВОД МАТРИЦЫ F');
FOR I:=1 TO N DO
BEGIN
FOR J:=1 TO N DO
WRITE(F[I,J]:6:3);
WRITELN;
END;
{---------------------------------------------------------}
{ШАГ 5-6}
WRITELN('ВЫВОД МАТРИЦЫ D');
FOR I:=1 TO N DO
BEGIN
FOR J:=1 TO N DO
WRITE(D[I,J]:6:3);
WRITELN;
END;
{---------------------------------------------------------}
{ШАГ 6-7}
MAX:=-9999;
IMAX:=0;
JMAX:=0;
FOR I:=2 TO N DO
FOR J:=N+2-I TO N DO
IF F[I,J]>MAX THEN
BEGIN
MAX:=F[I,J];
IMAX:=I;
JMAX:=J;
END;
WRITELN('МАКСИМАЛЬНЫЙ ЭЛЕМЕНТ МАТРИЦЫ F',MAX:8:3);
{---------------------------------------------------------}
{ШАГ 7-8}
MIN:=D[1,1];
IMIN:=1;
JMIN:=1;
FOR I:=1 TO N DO
FOR J:=1 TO N DO
IF D[I,J]<MIN THEN
BEGIN
MIN:=D[I,J];
IMIN:=I;
JMIN:=J;
END;
WRITELN('МИНИМАЛЬНЫЙ ЭЛЕМЕНТ МАТРИЦЫ D',MIN:8:3);
{---------------------------------------------------------}
{ШАГ 8-9}
F[IMAX,JMAX]:=MIN;
D[IMIN,JMIN]:=MAX;
{---------------------------------------------------------}
{ШАГ 9-10}
WRITELN('ВЫВОД МАТРИЦЫ F');
FOR I:=1 TO N DO
BEGIN
FOR J:=1 TO N DO
WRITE(F[I,J]:6:3);
WRITELN;
END;
{---------------------------------------------------------}
{ШАГ 10-11}
WRITELN('ВЫВОД МАТРИЦЫ D');
FOR I:=1 TO N DO
BEGIN
FOR J:=1 TO N DO
WRITE(D[I,J]:6:3);
WRITELN;
END;
END.
