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

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

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

Можно отметить следующие достоинства динамической памяти:

1) Экономичность и эффективность ее использования;

2) возможность динамического изменения числа элементов в связанных структурах, например в списках;

3) статические переменные существуют только в течение жизни блока, в котором они объявлены, а динамические – и после выхода из блока до окончания программы.

4) Переменная, размещаемая динамически, не объявляется в разделе VAR и не имеет имени в программе. компилятор не планирует выделение места в памяти под такие переменные.

В Delphi:

Динамический массив — это массив, память для которого выделяется динамически. Размерность динамического мас¬сива на момент компиляции не известна. Для объявления такого мас¬сива применяется обычное описание, но без указания размерности. Основным отличием динамических массивов от статических является возможность изменения их размерности в ходе выполнения программы.

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

Описание динамического массива:

Type <Имя типа массива> = Array of <Тип элементов>

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

Пример динамического массива:

TYPE CODES = ARRAY OF INTEGER;

VAR A:CODES;

BEGIN

SETLENGTH (A,30);

A[0]:= 'POOH LIKES HUNNY'

END;

Необходимо учитывать, что динамический массив индексируется значениями, отсчет которых начинается с 0. Чтобы обратиться к первому элементу массива, необходимо использовать индекс 0, а к последнему – 29.

При необходимости память, выделенную под массив, можно освободить самостоятельно (например, если массив использовал слишком большое ее количество). Для этого достаточно просто присвоить массиву значение nil. Например: A:= nil;

Пример многомерного динамического массива:

Type Codes = array of array of array of integer;

var A:Codes;

Begin

Setlength (A,10,20,30);

end;

Массив А имеет 10 элементов, каждый массив A[i] имеет 20 элементов, а массивы A[i][j] – 30 элементов

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

Обращение к участку динамической памяти в программе осуществляется с помощью специальной ссылочной переменной, которая называется указателем (ссылкой). Переменная типа «указатель» содержит адрес размещения участка динамической памяти, с которой связан этот указатель. Компилятор отводит под переменную типа «указатель» 4 байта статической памяти.

Описание типа указатель:

Type <идентификатор указателя>=^<тип>;

P=^Word; P – идентификатор типа «указатель» на данные типа WORD.

Динамическая память может быть выделена двумя способами:

New (p), где Р – переменная типа «типизированный указатель»

Getmem (P, size), где Р – переменная типа «указатель» требуемого типа, а size – целочисленное выражение размера запрашиваемой памяти в байтах. Эта процедура создает новую динамическую переменную требуемого размера и свойства, а также помещает адрес этой созданной переменной в переменную Р типа «указатель». Доступ к значению созданной переменной можно получить с помощью P^.

При работе с массивами практически всегда возникает задача настройки программы на фактическое количество элементов массива. В зависимости от применяемых средств решение этой задачи бывает различным.

Первый вариант - использование констант для задания размерности массива. Такой способ требует перекомпиляции программы при каждом изменении числа обрабатываемых элементов.

PROGRAM FIRST;

CONST

N : INTEGER = 10;

{ ЛИБО N = 10; }

VAR

A : ARRAY [ 1..N ] OF REAL;

I : INTEGER;

BEGIN

FOR I := 1 TO N DO

BEGIN

WRITELN (' ВВЕДИТЕ ', I , ' -ЫЙ ЭЛЕМЕНТ МАССИВА ');

READLN ( A [ I ] )

END;

{ И ДАЛЕЕ ВСЕ ЦИКЛЫ РАБОТЫ С МАССИВОМ ИСПОЛЬЗУЮТ N}

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

PROGRAM SECOND;

VAR

A : ARRAY [ 1..25 ] OF REAL;

I, NF : INTEGER;

BEGIN

WRITELN ('ВВЕДИТЕ ФАКТИЧЕСКОЕ ЧИСЛО ЭЛЕМЕНТОВ’,

‘ МАССИВА <= 25 ');

READLN ( NF );

FOR I := 1 TO NF DO

BEGIN

WRITELN ('ВВЕДИТЕ ', I , ' -ЫЙ ЭЛЕМЕНТ МАССИВА ');

READLN ( A [ I ] )

END;

{ И ДАЛЕЕ ВСЕ ЦИКЛЫ РАБОТЫ С МАССИВОМ ИСПОЛЬЗУЮТ NF}

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

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

PROGRAM DYNAM_MEMORY;

TYPE

MAS = ARRAY [ 1..2 ] OF < ТРЕБУЕМЫЙ_ТИП_ЭЛЕМЕНТА >;

MS = ^ MAS;

VAR

A : MS;

I, NF : INTEGER;

BEGIN

WRITELN ('ВВЕДИТЕ ФАКТИЧЕСКОЕ ЧИСЛО ЭЛЕМЕНТОВ МАССИВА');

READLN ( NF );

GETMEM ( A, SIZEOF ( < ТРЕБУЕМЫЙ_ТИП_ЭЛЕМЕНТА>)*NF);

FOR I := 1 TO NF DO

BEGIN

WRITELN ('ВВЕДИТЕ ', I , ' -ЫЙ ЭЛЕМЕНТ МАССИВА ');

READLN ( A^ [ I ] )

END;

{ И ДАЛЕЕ ВСЕ ЦИКЛЫ РАБОТЫ С МАССИВОМ ИСПОЛЬЗУЮТ NF}

. . . . .

FREEMEM (A, NF*SIZEOF (< ТРЕБУЕМЫЙ_ТИП_ЭЛЕМЕНТА>));

END.

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