Javascript must be enabled in your browser to use this page.
Please enable Javascript under your Tools menu in your browser.
Once javascript is enabled Click here to go back to �нтеллектуальная Кобринщина

Двумерные массивы

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

 

Обычно двумерные массивы на языке программирования Pascal описываются так:

array [1..m, 1..n] of базовый_тип

Однако можно их описывать и по-другому:

array [1..m] of array [1..n] of базовый_тип

При этом описание может быть в разделе type и тогда создается новый тип, который можно использовать при объявлении переменных. Или массив может быть описан непосредственно в разделе переменных. m и n – это константы, их можно опустить и вставить конкретные значения, но лучше так не делать. Обычно подразумевают, что в интервале от 1 до m определяется количество строк, а в интервале от 1 до n – количество столбцов массива.

1 вариант – описание массива через раздел type:

const

            M = 10;

            N = 5;

type

            matrix = array [1..M, 1..N] of integer;

var

            a: matrix;

2 вариант – описание массива в разделе переменных:

const

            M = 10;

            N = 5;

var

            a: array [1..M, 1..N] of integer;

При использовании третьего варианта описания лучше сначала определить некоторый тип одномерного массива (строка двухмерного массива), который затем используется при описании двухмерного массива:

type a = array[1..10] of byte;

var b: array[1..100] of a;

Для обращения к элементу двухмерного массива необходимо указать имя массива и в квадратных скобках через запятую – значения двух индексов (первый указывает номер строки, а второй – номер столбца), на пересечение которых стоит элемент (например, a[i,2]:=6). В языке программирования Pascal допустимо разделение индексов с помощью квадратных скобок (например, a[i][5]:= 7).

Если описывается двумерный массив как типизированная константа, то при задании значений его элементов он рассматривается как массив массивов. При этом в общих круглых скобках через запятую перечисляются заключенные в круглые скобки значения элементов строк (каждая строка в своих скобках):

type

            arr = array[1..4, 1..3] of integer;

const

            cords: arr = ((1,-1,3), (0,0,0), (1,4,0), (4,-1,-1));

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

var

    matrix: array[1..3,1..5] of integer;

    i, j: integer;

 begin

    writeln ('Введите 15 чисел: ');

     for i := 1 to 3 do

        for j := 1 to 5 do

            read (matrix[i,j]);

     for i := 1 to 3 do begin

        for j := 1 to 5 do

            write (matrix[i,j], ' ');

        writeln

    end;

 readln

end.

Размерность массива (т.е. количество содержащихся в нем значений) определяется произведением количества строк на количество столбцов. В примере выше в массив помещается 15 значений.

Когда пользователь вводит очередное число, то процедура read считывает его и помещает в ячейку с текущими индексами i и j. Когда i равна единице, значение j меняется пять раз, и, значит, заполняется первая строка таблицы. Когда i равна двум, значение j снова меняется пять раз и заполняется вторая строка таблицы. Аналогично заполняется третья строка таблицы. Внутренний цикл for в общей сложности совершает 15 итераций, внешний только 3.

Как пользователь вводит значения – не важно. Он может их разделять либо пробелом, либо переходом на новую строку.

 Вывод значений двумерного массива организован в виде таблицы. Выводятся 3 строки по 5 чисел в каждой. Внутри строк числа разделяются пробелом.

На самом деле, это не совсем корректно написанная программа. Мы несколько раз используем цифры 3 и 5. А что если мы захотим поменять размерность массива? Придется просмотреть всю программу (представьте, что она очень большая) и исправить значения. Это неэффективно. Поэтому в программе следует использовать константы. В случае чего их значения можно поменять всего лишь в одном месте.

Вторая проблема – это «кривость» выводимой на экран таблицы значений матрицы, в случае если есть значения разной разрядности (однозначное, двузначное и т.д. числа). Неплохо бы под каждое число отводить равное количество знаков.

Вот так может выглядеть подправленный вариант программы:

const

    M = 3;

    N = 5;

 

var

    matrix: array[1..M,1..N] of integer;

    i, j: integer;

 begin

    writeln ('Введите 15 чисел: ');

     for i := 1 to M do

        for j := 1 to N do

            read (matrix[i,j]);

     for i := 1 to M do begin

        for j := 1 to N do

            write (matrix[i,j]:5);

        writeln

    end;

 readln

end.