Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Паскаль.doc
Скачиваний:
58
Добавлен:
07.06.2015
Размер:
1.21 Mб
Скачать

14. Обработка многомерных массивов

Многомерные массивы имеют два и более индексов. Для их обработки организуют несколько циклов, причем один вкладывается в другой. Такие циклы называются вложенными или циклами в цикле. При этом параметром в каждом цикле будет соответствующий индекс элемента массива. Для составления алгоритма и программы необходимо определить, как они меняются.

Пример 1. Ввести матрицу D размерностью m*n (n<=8, m<=5). Подсчитать количество отрицательных чисел в ней и заменить эти числа нулями. Вывести исходную и новую матрицу.

Алгоритм решения этой задачи может быть таким.

1. Ввести матрицу.

2. Вывести матрицу по строкам

3. Подсчитать количество нулей и заменить.

4. Вывести матрицу.

5. Закончить.

Для уточнения распишем матрицу

Нужно ввести и проанализировать все элементы матрицы, т.е. оба индекса должны принять все свои допустимые значения:

номер строки (обозначим i), изменяется от 1 до m;

номер столбца (обозначим j), изменяется от 1 до n

Уточненный алгоритм может быть таким.

1.1. Ввести количество строк (m) и столбцов (n)

1.2. Для i от 1 до m выполнить

Для j от 1 до n выполнить

ввести Dij

2. Для i от 1 до m выполнить

2.1. Для j от 1 до n выполнить

вывести Dij

2.2. Перейти на новую строку

3.1.Положить количество отрицательных чисел = 0

3.2. Для i от 1 до m выполнить

Для j от 1 до n выполнить

Если Dij<0, то

а)кол. отр.=кол. отр.+1

б)Dij=0

Программа для этого алгоритма может быть такой.

Program Matr;

Const

Mmax = 8;

Nmax = 5;

Var

D : Array [1..Mmax, 1..Nmax] Of Real;

m, n, k, i, j : Integer;

Begin

Writeln('Введите количество строк и столбцов');

Readln(m,n);

Writeln('Вводите элементы матрицы по строкам');

For i := 1 To m Do

For j :=1 To n Do

Read (D[i,j]);

Writeln('Исходная матрица');

For i := 1 To m Do

Begin

For j:=1 To n Do

Write(D[i,j]);

Writeln; {Переход на новую строку}

End;

K := 0;

For i := 1 To m Do

For j := 1 To n Do

If D[I,J] <0 Then

Begin

K := K+1;

D[I,J] := 0

End;

Writeln('Результирующая матрица');

For i := 1 To m Do

Begin

For j:=1 To n Do

Write(D[i,j]);

Writeln; {Переход на новую строку}

End;

Writeln('Количество отрицательных чисел в матрице - ',K);

End.

Пример 2. Ввести матрицу A размерностью m*n (n<=10, m<=8). Подсчитать суммы чисел по строкам и вывести исходную матрицу, а в конце каждой строки – сумму.

Для разработки алгоритма распишем матрицу и выясним, как меняются индексы обрабатываемых элементов и сколько будет сумм. Количество сумм равно числу строк (m). Введем обозначения: i-номер строки, j - номер столбца.

Алгоритм решения задачи может быть таким.

1.1. Ввести количество строк (m) и столбцов (n)

1.2. Для i от 1 до m выполнить

для j от 1 до n выполнить

ввести aij

2. Для i от 1 до m выполнить { Для каждой строки }

2.1. Положить суммаi = 0 { Сумма в i-той строке }

2.2. Для j от 1 до n выполнить { Для каждого столбца }

а) вычислить суммаi = суммаi+aij {Накопление сумма в i-ой строке }

б) вывести aij

2.3. Вывести суммаi

3. Закончить

Программа, реализующая этот алгоритм, будет иметь вид

Program SumMatr;

Const

Mmax = 8;

Nmax = 10;

Var

A : Array [1..Mmax, 1..Nmax] Of Real;

m, n, i, j : Integer;

S : Array[1..Mmax] Of Real;

Begin

Writeln('Введите количество строк и столбцов');

Readln(m,n

Writeln('Введите матрицу');

For i := 1 To m Do

For j := 1 To n Do

Read(A[i,j]);

For i := 1 To m Do

Begin

S[i] := 0;

For j := 1 To n Do

Begin

S[i]:=S[i]+A[i,j];

Write(A[i,j]:8:3);

End;

Writeln(S[I]:10:3);

End;

End.

В некоторых случаях при обработке матриц достаточно организовать только один цикл. Это, как правило, задачи, в которых обрабатываются диагонали матриц.

Пример 3. Ввести матрицу В размерностью n*n (n<10). Вывести элементы ее главной и побочной диагоналей.

Запишем матрицу и обратим внимание на изменение индексов элементов, расположенных на главной и побочной диагоналях.

1. Элементы главной диагонали имеют одинаковые индексы. Поэтому обращение к элементу, стоящему на этой диагонали можно записать так: Bii.

2. Как видно из выписанных ниже элементов побочной диагонали, сумма индексов для любого из них равна n+1. Поэтому при известном первом индексе i второй может быть вычислен как n+1-i. Другими словами, обращение к элементу побочной диагонали можно записать так: Bi,n+1-i.

Учитывая сказанное, можно записать программу для примера 3 в таком виде.

Program Diag;

Const

Nmax = 10;

Var

B : Array [1..Nmax, 1..Nmax] Of Real;

n, i, j : Integer;

Begin

Writeln('Введите количество строк и столбцов');

Readln(N);

Writeln ('Введите матрицу');

For i := 1 To n Do

For j := 1 To N Do

Read(B[I,J]);

Writeln('Главная диагональ');

For i := 1 To n Do

Write(B[i,i]:8:4);

Writeln;

Writeln('Побочная диагональ');

For i := 1 To n Do

Write(B[i,n+1-i]:8:4);

Writeln;

End.