Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
delphi_p1.doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
571.39 Кб
Скачать

Динамические массивы

Динамические массивы появились в Delphi 4 и представляют собой удобное средство для хранения данных для тех задач, где заранее неизвестно количество элементов в обрабатываемых массивах.

Объявить динамический массив можно следующим образом:

var <имя масива> : array of <тип>;

Например:

var vect : array of real;

Длину массива следует задать при помощи процедуры SetLength. Например:

SetLength(vect, 6);

Данная процедура выделяет для массива vect в оперативной памяти место для 6 вещественных элементов и присваивает этим элементам нулевые значения. Индекс первого элемента равен 0, поэтому массив vect содержит элементы vect[0], vect[1],…, vect[5]. При желании длину динамического массива можно изменить при помощи повторного использования процедуры SetLength. Если новая длина окажется больше исходной, то в массив добавляются новые элементы с нулевыми значениями; если меньше, то последние элементы в исходном массиве будут отброшены.

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

1. Присвоить переменной значение nil, например:

vect:=nil;

2. Использовать процедуру finalize, например:

finalize(vect);

3. Установить нулевую длину, например:

SetLength(vect, 0);

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

…………………………………….

var r : array of array of integer;

…………………………………….

SetLength(r, 3);

SetLength(r[0], 1);

SetLength(r[1], 2);

SetLength(r[2], 3);

……………………………………..

создаёт треугольный массив.

Параметры-массивы

Типом любого параметра в списке формальных параметров процедур и функций может быть только стандартный или ранее объявленный тип. Поэтому ошибочным будет, например, следующее объявление процедуры:

procedure T(x : array[1..10] of real);

так как в списке формальных параметров фактически объявляется тип-диапазон, указывающий границы индексов массива.

Если в подпрограмму передаётся массив, то следует первоначально описать его тип, например:

type tmas = array[1..10] of real;

procedure T(x : tmas);

…………………………………..

Динамический массив может передаваться в качестве параметра в те подпрограммы, в описании которых соответствующий формальный параметр объявлен как открытый массив, например:

procedure Q(t : array of real; var w : array of array of real);

Начальное значение индекса в открытом массиве равно 0, как и в динамическом. В подпрограмме реальная длина массива может быть определена либо при помощи функции Length – длина массива, либо при помощи функции High – наибольшее значение индекса. Для этих функций справедливо следующее соотношение:

High(<массив>) = Length(<массив>) – 1.

В качестве фактического параметра для открытого массива может выступать и статический массив.

Пример 42. Заполнить случайными целыми числами из интервала [-20,20] двумерный целочисленный массив размера nm, где n – случайное число из интервала [2, 5], m=n+1. В каждой строке массива вставить число, равное i100 ( i – номер строки), после третьего элемента.

type matrix = array of array of integer;

var a : matrix;

n, m, i, j : integer;

procedure init_dinmas(var x:matrix);

var i, j:integer;

begin

for i:=0 to n-1 do

for j:=0 to m-1 do x[i,j]:=-20 + random(41);

end;

procedure print_dinmas(x:matrix; nn, mm:integer);

var i,j:integer;

begin

for i:=0 to nn-1 do

begin for j:=0 to mm-1 do write(x[i,j]:5); writeln end;

end;

begin

randomize;

n:=random(4)+2; m:=n+1;

setlength(a, n, m); writeln(n:5, m:5);

init_dinmas(a); print_dinmas(a, n, m);

setlength(a, n, m+1);

for i:=0 to n-1 do

begin

for j:=m-1 downto 3 do a[i, j+1]:=a[i, j];

a[i, 3]:=(i+1)*100;

end;

print_dinmas(a, n, m+1);

readln

end.

Пример возможного варианта выполнения программы:

3 4

-4 -7 7 19

10 -2 5 7

6 -14 6 -3

-4 -7 7 100 19

10 -2 5 200 7

6 -14 6 300 -3

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