ДИНАМИЧЕСКИЕ МАССИВЫ

Динамические массивы появились в 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.