Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Р6_Влож_Циклы_печать.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
331 Кб
Скачать
☆

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

Двумерный массив можно рассматривать как одномерный, у которого каждый элемент сам является массивом, например,

type mat = array [0..5] of array [0..2] of Byte

Такое описание можно заменить более компактным:

type mat = array [0..5, 0..2] of Byte; это двумерный массив, у которого 6 строк [0..5] и 3 столбца [0..2].

Примеры описания двумерных массивов

const N=4; K=3;

type Vector = array [1..N, 1..K ] of Real; //тип массив 4х3}

var M_X : Vector; //переменная массив 4х3}

M_Y : array [1.N, 0..K ] of Byte; //переменная массив 4х4}

M_Z : array [ 1..4, 3..7 ] of Word;

В памяти элементы многомерного массива следуют друг за другом так, что при переходе от младших адресов к старшим наиболее быстро меняется правый индекс массива. Например, для двумерного массива А: array [1..3,1..3] of Byte, последовательность расположения элементов будет следующая:

A[1,1] A[1,2] A[1,3] A[2,1] A[2,2] A[2,3] A[3,1] A[3,2] A[3,3]

Динамические двумерные массивы

При объявлении таких массивов границы индексов не указывают:

var В: array of array of Real; //двумерный массив

Динамические массивы не имеют установленного размера или длины. Глубина вложенности массивов (размерность массива) не ограничена, однако суммарная длина внутреннего представления многомерного массива не может быть больше 2 Гбайт. Распределение памяти и указание границ индексов по каждому измерению динамических массивов осуществляется в ходе выполнения программы путем инициации массива процедурой SetLength.

SetLength(var S; NewLength: Integer) - устанавливает длину переменной динамического массива,

где S - переменная динамического массива;

NewLength - число элементов массива S, нижняя граница индексов

динамического массива всегда 0.

Для освобождения памяти занятой массивом достаточно присвоить идентификатору значение nil или использовать процедуру Finalize.

В многомерных динамических массивах каждый элемент любого из N-1 измерений (N - количество измерений) представляет собой динамический массив и, следовательно, нуждается в инициации.

Пример 2. Инициация двумерного динамического массива

Будем инициировать двумерный массив 3 х 3,

type T2Ar_Real = array of array of Real; //в разделе implementation

var M2: T2Ar_Real; //двумерный динамический массив

…………………………

begin //в исполняемом блоке какой-либо процедуры

SetLength(M2, 3); //Устанавливаем длину первого измерения = 3 (количество

столбцов)

SetLength(M2[0], 3) ; //Задаем длину 0-го столбца, счёт от 0

SetLength(M2[1], 3) ; //Задаем длину 1-го столбца

SetLength(M2[2] ,3) ; //Задаем длину 2-го столбца

Недостаток такого способа

Пример 3. Процедура инициации двумерного массива

Дано: описание типа двумерного динамического массива, type T2Ar_Real = array of array of Real;

описание переменной массива, var M2: T2Ar_Real;

поле Edit1, в которое будет введено значение размерности массива N;

Требуется разработать процедуру Cr_2Mx инициации двумерного динамического массива размером N x N.

Постановка задачи:

  • после ввода размерности массива, преобразуем строковое значение в числовое N;

  • зададим количество столбцов массива;

  • в цикле зададим длину каждого столбца.

procedure Cr_2Mx(Str: String; var M2: T2Ar_Real; var N: integer);

{Str – строковое значение размерности массива}

{var M2 – открытый параметр массива}

{var N – размерность массива, }

var i, cod: Integer; // i – счётчик, cod - индикатор преобразования Строка-Число

begin If Str ='' //проверка на пустое значение

then begin

ShowMessage('Введите N!') ;

exit //досрочное завершение процедуры

end; //конец if Str…

Val(Str, N, сod); //преобразование Str в число N

if cod = 0 //успешное преобразование

then begin

SetLength(M2, N); //задаём кол-во столбцов N

for i:= 0 to N -1 do //задаем длину i-го столбца, счёт от 0

SetLength(M2[i], N);

end

else begin

ShowMessage('Ошибка ввода N!');

exit;

end;

end;

В ызов процедуры инициации двумерного массива NxN, из какой-либо процедуры обработки события будет выглядеть так, Cr_2Mx(Edit1.Text, M2, N).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]