Обработка многомерных массивов
Многомерные массивы имеют два и более индексов. Для их обработки организуют несколько циклов, причем один вкладывается в другой. Такие циклы называются вложенными или циклами в цикле. При этом параметром в каждом цикле будет соответствующий индекс элемента массива. Для составления алгоритма и программы необходимо определить, как они меняются.
Пример 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.
|