Скачиваний:
47
Добавлен:
10.02.2015
Размер:
70.14 Кб
Скачать

Практикум 10. Динамические массивы.

1.Понятие и сущность динамических массивов.

2.Синтаксис объявления.

3.Передача динамического массива как параметра в процедуры и функции

4.Особенности многомерных динамических массивов.

Понятие и сущность динамических массивов.

Термин «динамический массив» вовсе не означает какой-то

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

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

Само понятие «динамический массив» неразрывно связано с

понятием «динамическая память», которое, в свою очередь, трактуется как потенциально доступная часть свободной, не занятой памяти. Естественно,

динамическая память является доступной тогда и только тогда, когда есть резерв не используемой памяти.

Другим отличием динамического массива от «обычного»

статического, является возможность изменять его размеры во время исполнения программы, в то время как память,

выделенная во время компиляции остается постоянной.

Внутреннее строение динамического массива проще всего представить в виде непрерывного фрагмента памяти, размер и структура которого полностью определяется программистом. Естественно, что и ответственность также полностью ложится на программиста.

Основная цель введения динамических массивов в состав языка DELPHI (в стандарте ПАСКАЛЯ их не было) – дать

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

основой для работы с динамической памятью.

Отсчет элементов динамического массива всегда начинается от нуля, а количество элементов в нем на единицу больше индекса последнего элемента.

Динамические массивы, как и статические, бывают одномерными, двумерными, трехмерными и т.д.

Синтаксис объявления.

Одномерные массивы (векторы)

Type TDynVector=array of <базовый тип>;

Двумерные

Type TDynMatr=array of array of <базовый тип>;

Трехмерные

Type TDynMatr3D=array of array of array of <базовый тип>;

Таким образом матрицы трактуются как массив векторов, а трехмерные матрицы – как массив двумерных матриц и т.д.

Переменные объявляются в разделе Var обычным образом, например

Var v : TDynVector; a : TDynMatr; D : TDynMatr3D;

Но объявленные таким образом массивы еще не содержат ни одного элемента, так как под них не выделено ни байта памяти.

Формирование динамического массива целых размерностью от 10 до 16 элементов случайным образом

Type

TDynVector=array of integer;

Var

n, i : word;

С помощью этой стандартной

 

v

:

процедуры массиву v будет

 

выделено динамической

BEGIN

 

 

 

 

памяти на n элементов

randomize;

 

n:=10+random(7);

 

SetLength(v, n);

for i:=0 to n-1

do v[i]:=random(101)-50;

for i:=0 to n-1

do write(v[i]:4); writeln;

readln;

Динамическая память – это чужая память,

v:=nil;

взятая лишь на время. Поработал отдай

END.

 

обратно!

Передача динамического массива как параметра в процедуры и функции

Динамические массивы могут быть объявлены в списке формальных параметров процедур и функции не только обычным образом через имя пользовательского типа, что является стандартом синтаксиса. Например, для предыдущего примера, стандартное объявление выглядит, так (и это правильно, и я бы сказал красиво!)

Function F(v :TDynVector; n:integer) : boolean;

С точки зрения стандарта Паскаля, в списке формальных параметров после двоеточия должно идти правильное имя типа, а три слова array of integer таковым не

являются, хотя бы потому, что между ними стоят пробелы.

Стандарт стандартом, но для динамических массивов в DELPHI разрешена и такая конструкция

Function F(v : array of integer; n:integer) : boolean;

Особенности многомерных динамических массивов.

Если в статических массивах диапазоны изменения индексов по каждому измерению строго фиксированы и, например число столбцов в матрице в каждой строке одинаково, то в

динамическом массиве, который трактуется как массив независимых массивов, этого ограничения нет. Таким

образом с помощью динамических массивов можно формировать матрицы с переменным числом столбцов и/или строк.

Формирование матрицы с переменным числом столбцов.

Type TDynMatr=array of array of integer; TDynVect=array of integer;

Var i, j, m : word; a : TDynMatr;

n : TDynVect;

BEGIN Randomize;

m:=7+random(7); writeln(' m=', m:3);

SetLength(a, m);

SetLength(n, m); for i:=0 to m-1 do begin

n[i]:=7+random(7);

SetLength(a[i], n[i]); a[i,0]:=n[i];

for j:=1 to n[i]-1 do a[i,j]:=random(101)-50; end;

// Продолжение for i:=0 to m-1 do

begin

for j:=0 to n[i]-1 do write(a[i, j]:4); writeln;

end;

readln; a:=nil; n:=nil;

END.

Соседние файлы в папке Практикумы 1 курс