Массивы массивов. Матрицы Урок 23 До сих пор Вы применяли тип ARRAY только для хранения и обработки линейных массивов информации. Массив представлялся, как линейная таблица содержащая однотипную информацию. Например, объявлен массив a: array [1..9] of integer, который уже заполнен (определён). Его можно представить следующим образом. Имя массива a Индекс 1 Содержимое 2 2 3 4 5 6 7 8 9 12 -9 5 2 14 3 4 7 -6 В этом случае, для того чтобы обратиться к элементу массива, необходимо указать имя данного массива с индексом элемента в квадратных скобках. Например: a[4]. Для данного массива базовым типом является стандартный, простой тип integer. Поэтому содержимое каждой ячейки массива, это целое число. Базовым типом для массивов может быть практически любой тип, в том числе и сам тип массив. То есть в Turbo Pascale может быть объявлена переменная следующего вида: Var Объявление двумерного массива. Для того, чтобы не возникало переменных с длинным описанием, удобно сначала описать базовый тип массив в разделе описания типов пользователя, а затем объявлять переменную-массив описанного выше типа. В этом случае сделанное выше объявление переменноймассива a будет выглядеть следующим образом: Type r=array[1..4] of integer; Var a: array[1..3] of r; Объявленный таким образом массив массивов a можно изобразить следующим образом: Имя массива a Индекс 1 2 3 Содержимое 1 1 1 2 2 2 3 3 х 3 4 4 4 Для того, чтобы обратиться к элементу такого массива, необходимо дважды указывать его индекс. Например, к ячейке отмеченной крестиком обращаются, в данном случае, так: a[2][3]. Многомерные массивы Работата с более сложными массивами. Например: Type c1=array [1..5] of integer; c2=array [1..4] of c1; c3=array [1..5] of c2; c4=array [1..10] of c3; Var mas: c4; Для того, чтобы обратиться к элементу массива mas, необходимо, после имени массива указать четыре индекса элемента: mas[2][3][5][1]. Более «прямой» способ объявления многомерных массивов Пример: Var matr: array[1..3,1..5] of integer; Таким образом, мы объявили двумерный массив, который можно изобразить следующим образом: Имя массива matr Индекс 1 Содержимое Индекс 2 1 2 3 4 5 1 2 Х 3 Для того, чтобы обратиться к элементу массива, отмеченному крестиком, необходимо, после имени массива указать два индекса через запятую в одних квадратных скобках: matr[2,4]. Таким способом можно описывать и более сложные массивы. Например, объявление 5-мерного массива. Var ex: array [1..10,1..10,1..5,1..15,1..4] of real; Обращаясь к элементу данного массива, необходимо указывать пять его индексов: ex[1,1,1,1,1]. Матрицы Двумерные массивы, которые ещё называют квадратными и прямоугольными таблицами, называют матрицами. Изображают их с помощью двух индексов. Примеры: матриц а11 а12 а13 b11 b12 b13 b14 а21 а22 а23 b21 b22 b23 b24 а31 а32 а33 Первый индекс - номер строки, второй - номер столбца; a13 читается "а один три", а не "а тринадцать". В программах на Паскале используются соответственно конструкции а[1,3]. Размер матриц Про матрицу имеющую m строк и n столбцов, говорят, что она имеет размер mxn ("m на n"). Если m=n, то матрица называется квадратной. Для квадратной матрицы элементы с одинаковыми индексами для строк и столбцов составляют главную диагональ матрицы. Для изображённой выше матрицы это элементы а11, а22, а33. Противоположная диагональ называется побочной диагональю. К ней относятся элементы а13, а22, а31. Как работать с матрицами Для обработки матриц наиболее удобно применять вложенные циклы с параметром. Описанный ниже фрагмент программы предназначен для заполнения матрицы целых чисел размером 4x5 с клавиатуры. for i:=1 to 4 do for j:=1 to 5 do begin write('Введите элемент ',i,' ',j,' '); readln a[i,j]; end; Допустимая операция присваивания В системе программирования Turbo Pascal, для одинаковых массивов допустима операция присваивания массива массиву. Например, если описано два массива следующим образом: VAR A,B: array[1..50,1..60] of real; то допустима следующая операция присваивания: A:=B; Примеры программ Дана матрица действительных чисел размером 3x5. Вычислить сумму элементов матрицы. PROGRAM EX_1; CONST n=3; {Количество строк} m=5; {Количество столбцов} TYPE mas=array[1..n,1..m] of real; VAR b: mas; {Массив} i: integer; {Индекс строки} j: integer; {Индекс столбца} s: real; {Сумма} BEGIN {Ввод значений матрицы} Writeln('Введите значения элементов матрицы:'); for i:=1 to n do for j:=1 to m do readln(b[i,j]); {Вычисление суммы} s:=0; for i:=1 to n do for j:=1 to m do s:=s+b[i,j]; writeln('Сумма = ',s); END. Дана матрица целых чисел размером 4x4. Заменить все элементы главной диагонали на нули. Вывести на экран монитора содержимое матрицы до обработки и после обработки. PROGRAM EX_2; VAR matr: array[1..4,1..4] of integer; {Матрица} i: integer; {Индекс строки} j: integer; {Индекс солбца} BEGIN {Ввод значений матрицы} for i:=1 to 4 do for j:=1 to 4 do begin write('Введите элемент ',i,' ',j,' '); readln matr[i,j]; end; {Вывод содержимого матрицы до обработки} Writeln('Содержимое матрицы до обработки'); for i:=1 to 4 do begin for j:=1 to 4 do write(matr[i,j]:4); writeln; end; {Обработка матрицы} for i:=1 to 4 do matr[i,i]:=0; {Вывод содержимого матрицы после обработки} Writeln('Содержимое обработанной матрицы '); for i:=1 t0 4 do begin for j:=1 to 4 do write(matr[i,j]:4); writeln; end; Контрольные вопросы 1. Какие способы объявления многомерных массивов вы знаете? 2. Как обратиться к элементу многомерного массива? 3. В каких случаях допускается обращение к многомерному массиву целиком? 4. Какая конструкция применяется для обработки n-мерного массива. Задания для самостоятельного выполнения 1. Дана матрица целых чисел размером 4x3. Определите сумму каждой строки этой матрицы. Результат вывести на экран монитора. 2. Дана матрица целых чисел размером 3x4. Определите сумму каждого столбца этой матрицы. Результат вывести на экран монитора. 3. Дана матрица целых чисел размером 4x4. Определите сумму элементов расположенных выше главной диагонали. Результат вывести на экран монитора. 4. Дана матрица целых чисел размером 4x3. Отсортировать каждую строку матрицы по возрастанию. Вывести содержимое матрицы до обработки и после обработки. 5. Дана матрица целых чисел размером 3x4. Отсортировать каждый столбец матрицы по убыванию. Вывести содержимое матрицы до обработки и после обработки. 6. Дана матрица целых чисел размером 5x3. Заменить все отрицательные элементы матрицы на нули. Вывести содержимое матрицы до обработки и после обработки. 7. Дана матрица целых чисел размером 4x4. поменять местами строки и столбцы этой матрицы. Вывести содержимое матрицы до обработки и после обработки. 8. Дана матрица целых чисел размером 5x3. Определить максимальный и минимальный элемент матрицы. Результат вывести на экран монитора. 9. Дана матрица A символов размером 4x3. Организовать и вывести на экран матрицу Б состоящую из целых чисел, полученных преобразованием чисел матрицы А. 10. Дана матрица целых чисел размером 4x4. Увеличить все чётные элементы на 16, а нечётные элементы увеличить втрое. Вывести на экран содержимое обработанной матрицы. 11. Дана матрица целых чисел размером 4x4. Повернуть матрицу на 90