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

Билет 22

  1. Открытые и динамические массивы. Запрос и освобождение памяти во время работы программы.

  2. Цикл repeat.

1) Динамические массивы задаются без указания границ индексов: Var <имя массива>: array of <тип>; Распределение памяти и указание границ индекса осуществляется в ходе выполнения программы путем инициации массива с помощью процедуры SetLength(<имя массива>,<длина массива>); после выполнения этой процедуры массив получает память для размещения значений своих элементов. Нижняя граница индексов всегда равна 0. При желании длину массива можно изменить при повторном использовании процедуры SetLength. При этом в памяти резервируется место для нового массива, элементы старого массива переносятся в новый. После чего память, выделенная прежнему массиву, освобождается. Для сокращения затрат времени лучше сразу создать массив максимальной длины. Если новая длина будет больше исходной, в массив добавятся новые элементы с нулевыми значениями; если меньше, то последние элементы будут отброшены. В отличие от обычных массивов, динамические массивы могут иметь разную длину по второму и следующим измерениям. Фактически идентификатор динамического массива ссылается на указатель, содержащий адрес первого байта памяти, выделенной для размещения массива. Удаление из памяти динамического массива может осуществляться тремя способами:

1)Присвоить переменной значение nil;(a:=nil) 2)Использовать процедуру Finalize;(finalize(a)) 3)Установить нулевую длину(SetLength(a,0)

Если массив передается в подпрограмму, то необходимо первоначально описать его тип. Динамический массив передается в подпрограмму, в которой соответствующий формальный параметр объявлен как открытый массив. Открытый массив аналогичен динамическому. В подпрограмме реальная длина массива может быть определена с помощью функции Length – длина массива, либо при помощи функции High – наибольшее значение индекса. High(<Массив>)=Length(<Массив>)-1. В качестве фактического параметра для открытого массива может выступать и статический массив. Если минимальный индекс в статическом массиве не равен 0, то первый элемент статического массива все равно будет соответствовать нулевому элементу открытого массива. При использовании открытых массивов вы должны включить соответствующее указание компилятору – {$P+}. Во-первых, открытые массивы могут быть только одномерными. Во-вторых, их элементы передаются через стек, что замедляет работу программы и может послужить причиной переполнения стека.

2)Оператор repeat имеет следующий формат:

Repeat

< оператор! >;

< оператор2 >; ...;

< onepaтopN >

until < логическое выражение>;

Выполняется оператор repeat следующим образом. В начале выполняется группа опе­раторов – оператор1, оператор2,..., onepaтopN. Затем вычисляется значение логического выражения. Если оно равняется true, то цикл прекращается, в противном случае выпол­няется следующая итерация цикла. Поскольку условие прекращения цикла проверяется в конце цикла, то операторы, об­разующие тело цикла, выполняются по крайней мере один раз. В отличие от операторов for и while, синтаксис которых предусматривает выполне­ние в цикле только одного оператора, в тело цикла оператора repeat может входить про­извольное количество операторов. Это означает, что использование операторных скобок begin...end в операторе repeat не обязательно, хотя их присутствие не будет ошибкой.

Для правильного выхода из цикла условие выхода должно меняться внутри операторов, составляющих тело цикла while или repeat... until. Следующий цикл никогда не завершится «естественным» способом:

Repeat

until False;

Для гибкого управления циклическими операторами for, while и repeat в состав Object Pascal включены две процедуры без параметров:

break - реализует немедленный выход из цикла; действие проце­дуры заключается в передаче управления оператору, стоя­щему сразу за концом циклического оператора;

continue - обеспечивает досрочное завершение очередного про­хода цикла; эквивалент передачи управления в самый конец циклического оператора.

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