ДИНАМИЧЕСКИЕ МАССИВЫ
Динамические массивы появились в Delphi 4 и представляют средство для хранения данных для тех задач, где заранее неизвестное количество элементов в обрабатываемых массивах.
Объявление динамических массивов
Type имя =array of базовый_тип;
или
var имя: array of базовый_тип;
где имя – идентификатор;
базовый_тип - тип элементов массива.
Например:
Var A : array of integer;
Длину массива задают процедурой SetLength :
SetLength(имя, длина)
имя - строка или переменная, которая является динамическим массивом;
длина - новое количество характеристик или элементов в массиве.
Например:
SetLength(А, 7);
выделяет для массива А в операционной памяти 7 элементов и присваивает этим элементам нулевые значения.
Индекс первого элемента массива равняется нулю, поэтому масив содержит элементы A[0], A[1], ..., A[5], A[6].
Например:
For i:=0 to 6 do a[i]:=random(10);
Если надо, длину динамического массива можно изменить, с помощью еще одного использования процедуры SetLength.
Если новая длина окажется больше начальной, то к массиву прибавятся новые элементы с нулевыми значениями; если меньше, то последние элементы в начальном массиве будут отброшены.
Переменная которая имеет тип динамического массива, является указателем, таким образом содержит адрес участка памяти, начиная с которого располагаются элементы массива.
Поэтому освобождение динамической памяти может быть осуществлено одним из трех средств:
1. A:=nil;
2. finalize(A);
3. SetLength(A, 0);
В программах реальная длина может быть определена или с помощью функции Length(массив), или с помощью функции High(массив) – наибольшее значение индекса.
Для этих функций справедливо следующее соотношения:
Length(массив) = High(массив)+1
Также есть функция Low(массив), которая определяет меньше всего значение индекса – 0.
Динамический массив может передаваться в качестве параметра в те подпрограммы, в объявление которых соответствующий формальный параметр объявленн как открытый массив, например
procedure x(t: array of real; var w: array of integer);
Можно сказать, что открытый массив, который используется для передачи параметров, аналогичендинамическому массиву. В частности, начальное значение индекса в открытом массиве также равняется 0.
В качестве фактического параметра может передаваться и статический массив.
Задача №1.
Написать программу для нахождения суммы элементов главной диагонали квадратной матрицы.
program DymamicMass2;
var A:array of array of integer; //Объявление двумерного динамического массива
S, N, i,j: integer;
begin
writeln('Enter N'); //Введение количества строк и столбиков
readln(N);
setlength(A,N,N); //Выделение памяти под динамический массив и инициализация нулями
For i:=0 to N-1 do //Возможно записать For i:=0 to High(A) do
begin
For j:=0 to N-1 do
begin
A[i,j]:=random(10);
write(A[i,j],' ');
end;
writeln
end;
i:=0;
S:=0;
while i<=High(A) do
begin
S:=S+A[i,i];
inc(i)
end;
finalize(A);//Освобождение памяти
writeln('S=',S) ;
readln;readln
end.
Задача №2.
Составить программу для нахождения последнего отрицательного элемента. Использовать подпрограммы. В качестве фактических параметров использовать открытые массивы.
program DymamicMass3;
var b:array of real; //объявление динамического одномерного массива
x,n:integer;
flag:boolean;
procedure vvod(var a:array of real);
//объявление открытого массива
var i:integer; //
begin //length(a) – количество элементов
for i:=Low(a) to high(a) do
//Low(a)=0, high(a)=length(a)-1
a[i]:=-5+random(11);
end;
procedure Negativ(a:array of real; var found:boolean;var Item:integer);
var i:integer;
begin
i:= High(A);
found:=false;
while (i>=Low(A)) and not found do
begin
if A[i]<0 then
begin
found:=true;
item:=i ;
end;
dec(i);
end;
end;
procedure vivod( a:array of real);
var i:integer;
begin
writeln(' Array (',length(a),')');
for i:=Low(a) to high(a) do
write(a[i]:6:1);
writeln
end;
begin
randomize;
writeln('Enter n');
readln(n);
Setlength(b,n); //!!!!!!!!!!!!!!!
vvod(b);
vivod(b);
Negativ(B,flag,x) ;
//Обратите внимание, что индекс элемента на единицу меньше его порядкового номера,
//так как индексация начинается из нуля!
if flag then writeln('Value found. Index =',x,'Nomber=',x+1)
else writeln('Value not found.') ;
finalize(b); //!!!!!!!!!!!!!!!
readln;readln
end.