
1.2. Многомерные массивы
Рассмотрим прямоугольные таблицы, состоящие из чисел и содержащие произвольное число m строк и произвольное число n столбцов. В математике их называют матрицами, а числа, входящие в состав матрицы - ее элементами. Если число строк матрицы совпадает с числом ее столбцов, то матрица называется квадратной.
В программировании матрицей называется переменная-массив, компоненты которой опять же массивы. Общий вид задания типа, определяющего двумерный массив, такой же, что и в случае, определяющем одномерный массив.
В общем виде описание двумерного массива выглядит так:
имя массива: array [НижняяГраницаИндекса1..ВерхняяГраницаИндекса1, НижняяГраницаИндекса2..ВерхняяГраницаИндекса2} of Тип;
Здесь НижняяГраницаИндекса1, ВерхняяГранщаИндекса1, НижняяГранща-Индекса2, ВерхняяГраницаИндекса2 - целые константы, определяющие диапазоны изменения индексов и, следовательно, число элементов массива, а тип - тип элементов массива.
Например, зададим массив следующим образом:
Var
M: Array [1..168,1..9] of Byte;
{задает двумерный массив, т. е. прямоугольную таблицу, состоящую из 168 строк и 9
столбцов}
Этот же массив можно задать иначе, непосредственно при описании полной переменной:
Var
M: Array [1..168] of Array [1..9] of Byte;
Можно задать описание массива так:
Туре
Vector = Array [1..9] of Byte;
Var
M: Array [1..168] of Vector;
Во всех трех случаях массив описан верно. В двумерном массиве доступ к любому из элементов осуществляется по двум индексам: номеру строки и номеру столбца, например:
M[100],[7] или M[100, 7] - это элемент, находящийся на пересечении сотой строки и седьмого столбца.
Число элементов массива равно произведению числа строк m на число столбцов n. Следовательно, массив M содержит 168*9 = 1512 элементов.
Двумерный массив хорошо иллюстрирует различие между физическим и логическим представлением данных. Он представляет собой логическую структуру данных, которая удобна для программирования и решения задач. Двумерный массив может оказаться полезным при описании объекта, который является двумерным физически (например, шахматная доска или карта). Его используют также при организации набора значений или при вычислениях, зависящих от двух параметров, например вычислении значений двойных сумм.
В языке Паскаль допускается работа с массивами, размерность которых больше двух. Трехмерный действительный массив может быть объявлен следующим образом:
Var А : Array [1..3, 1..4, 1..5] of Real;
Элементы в таком массиве адресуются тремя индексами. Первый индекс задает номер матрицы, второй - номер строки и третий - номер столбца. Такой массив полезен, если некоторое значение определяется тремя параметрами. Например, массив температур может быть проиндексирован по широте, долготе и высоте. При выходе за третье измерение геометрическая аналогия по очевидным причинам невозможна. Количество измерений формально не ограничено.
Многомерные массивы, как и одномерные, можно задавать одним из способов ввода данных в программу. Значения элементов двумерных массивов выводят на экран и вводят с клавиатуры, как правило, по строкам, т. е. сначала все элементы первой строки, затем второй и т. д. Это удобно выполнять при помощи вложенных инструкций for.
Например, требуется ввести в матрицу P размером 3 строки, 4 столбца следующие значения: 1-я строка -1, 1,1,1; 2-я строка - 2, 2, 2, 2; 3-я строка - 3,3,3,3, затем умножить на 3 каждый элемент массива и получить результат на мониторе распечатанным по строкам.
Program massiv5;
Uses Crt;
var
P: array[1..3, 1..4] of Integer;
i,j : Integer;
Begin
ClrScr;
For i: = 1 To 3 Do
begin
WriteLn ('Введи строку ', i);
For j :=1 To 4 Do
Read(P[i,j]);
end;
For i:=1 To 3 Do
begin
For j:=1 To 4 Do
Write (P[i,j]*3);
WriteLn;
end;
ReadKey;
End.
Здесь каждый раз, когда внутренний цикл завершается, внешний цикл увеличивает i на единицу и внутренний цикл выполняется вновь. Таким образом, сначала вводятся, а потом выводятся все компоненты массива по строкам. При выводе мы умножаем каждый элемент массива на 3.
При описании массивов в программе удобно использовать именованные константы как значения верхних границ индексов массива. При задании массива как сложной константы в блоке Const (или в блоках, если их несколько) в круглых скобках перечисляются элементы-массивы, состоящие из элементов-скаляров. Для двумерного массива это может выглядеть так:
Const
a: Array [1..2, 1..5] of Integer = ((-1, 23, 0, 7, 6), (2, 0, -12, 6, 4));
Трехмерный массив можно задать аналогично или следующим образом:
Туре
Cube = Array [0..1, 0..1, 0..1] of Integer;
Const
M : Cube = (((0, 1), (2, 3)), ((4, 5), (6, 7)));
Элементы трехмерного массива будут хранить после этого следующие значения:
М[0, 0, 0] = 0; М[0, 0, 1] = 1; М[0, 1, 0] = 2; М[0, 1, 1] = 3;
М[1, 0, 0] = 4; М[1, 0, 1] = 5; М[1, 1, 0] = 6; М[1, 1, 1] = 7.
В стандартной матричной задаче может потребоваться:
- получить новую матрицу (ввести матрицу) по заданному правилу;
- найти какую-либо величину, используя элементы данной матрицы;
- преобразовать матрицу требуемым образом;
- определить, обладает ли матрица (ее один или несколько элементов, строка, столбец) указанным свойством;
- выполнить ту или иную операцию над матрицей (матрицами).
Следующая задача иллюстрирует использование вложенных циклов при вычислении
двойных
сумм
Program massiv6;
Uses Crt;
var
sum: real;
i,j:1..100;
Begin
ClrScr;
sum: = 0;
Textcolor (LightRed);
For i: = 1 To 100 Do
For j : = 1 To 50 Do
sum : = sum + 1/ (i + sqr (j));
WriteLn (' Сумма равна ', sum);
ReadKey;
End.