
- •Вопросы к госэкзамену Алгоритмические языки и программирование (преподаватель — Данилина н.П.)
- •1. Алгоритм и его свойства. Структуры алгоритмов: линейные, разветвленные, циклические.
- •2. Стандартные типы данных в языке Паскаль и их объявление.
- •3. Структурированные типы данных в Паскале и их объявление: массивы, записи, файлы, множества, строки.
- •4. Программирование на языке Паскаль разветвленных структур алгоритмов(оператры if и case)
- •5. Программирование на языке Паскаль циклических структур алгоритмов (Repeat –Until, While –Do, For –to -do)
- •7. Организация подпрограмм (процедуры и функции)
- •9. Ссылочный тип данных (указатели) в языке Паскаль. Организация динамических структур
- •10.3 Создание и уничтожение динамических переменных
- •10.5. Операции с динамическими списками (дс)
- •10.5.1. Ввод, создание и заполнение динамического списка
- •10.5.2 Вывод значений элементов динамической цепочки
- •10. Модульный принцип построения программ на языке паскаль. Стандартные модули и модули пользователя.
9. Ссылочный тип данных (указатели) в языке Паскаль. Организация динамических структур
Динамические переменные не имеют индетификаторов, для доступа к ним используются переменные ссылочного типа. Для обозначения ссылочного типа используется специальный символ «^» (caret), который указывается перед базовым типом. Базовый тип - это тип динамических переменных, на которые может указывать ссылочная переменная.
Пример: Type P_int=^integer;
P_int- ссылочный тип данных, который позволяет указывать на динамическую переменную типаinteger
Rec=record
name : string[20];
Tarif : Real;
end;
P_Rec=^Rec; {Ссылочный тип, который обеспечивает указание на запись типа Rec}
var P1,P2,P_int; {P1,P2 -переменные типа P_int, значениями которых являются адреса динамических переменных типа integer}
R1,R2:P_rec {переменные R1 и R2 обеспечивают ссылку на динамические переменные типа "запись"}
A,B:^real;
Работа с динамическими переменными выполняется с помощью переменных ссылочного типа следующим образом:
P1 - значение переменной ссылочного типа,
P1 ^ - значение динамической переменной; на которую указывает переменнаяP1.
Динамические переменные могут использоваться во всех операторах в соответствии с правилами использования базового типа, например, A^ - динамическая переменная типаReal, на которую указывает ссылочная переменная А;R1^ - динамическая переменная типаRec, на которую указывает ссылкаR1.
При использовании динамических переменных типа "запись" доступ к отдельным полям происходит так же, как рассмотренов разделе 7; например:
R1^.Name; {поле Name динамической переменной R1^}
R1^.Tarif; {поле Tarif динамической переменной R1^}
Write(R1^.Name);{Вывод значения поля Name}
P1^:=P1^+5 {Сложение значения динамической переменной P1^ с 5}
Значения переменных ссылочного типа можно присваивать друг другу, сравнивать с друг другом (на равенство, и неравенство) только для одинаковых базовых типов данных; например:
if P2 = P1 then ... ; {допустимо}
if R1 <> P1 then ... {недопустимо}
В языке Паскаль имеется беcтиповой указатель, который обозначается словом "Pointer";его можно использовать для присвоения значений ссылок на любые динамические переменные.
10.3 Создание и уничтожение динамических переменных
Общий порядок использования динамических переменных следующий:
создание ДП,
применение (использование в программе),
уничтожение ДП (освобождение ОП).
Для создания динамических переменных используется процедура:
New(P1);
P1 - имя ссылочной переменной. После выполнения этой процедуры переменнойP1, будет присвоено значения адреса динамической переменной, для которой выделено место в «куче» в соответствии с базовым типом. Результат выполнения этой процедуры можно представить в виде следующей модели (рис. 10.3).
|
рис. 10.3 |
После создания динамической переменной с ней можно выполнять необходимые действия, например:
ReadLn(P1^);{ввод значения, например 5}
P1^:=P1^+7;{изменение значения: 5+7=12}
Write(P1^);{вывод значения}
. . .
Для освобождения памяти от динамической переменной используется процедура:
Dispose(P1). После того как переменная становится не нужной следует освободить место в ОП. Перед созданием динамических переменных следует проверитьналичие свободного места(в куче). Состояние динамической памяти можно представить в виде графической модели (рис. 10.4)
|
Общий объем свободной динамической памяти складывается из суммы свободных участков:
В свободной области можно найти свободный участок максимальной длины
Vmax = max(Vc,i), i=1,2, ..., n
В языке Турбо Паскаль имеются функции, которые определяют общий объем свободной динамической памяти и объем наибольшего свободного участка: Memavail (Memory available); MaxAvail. Перед созданием динамической переменной рекомендуется использоватьMaxAvailдля проверки достаточного объема памяти для создаваемой переменной. Требуемый объем памяти может быть определен с помощью функцииSizeOf(P1), которая определяет длину аргумента в байтах. АргументP1 - либо базовый тип, либо имя ссылочной переменной. Проверка наличия свободной ОП для динамической переменной может быть выполнена следующим образом.
. . . .
if SizeOf(R1)>MaxAvail then
begin
Writeln('Недостаточно памяти для динамических переменных');
repeat
Until keypressed
end;
. . . .10.4. Динамические цепочки (списки, массивы)
Динамические цепочки- это последовательности взаимосвязанных динамических переменных, которые можно предоставить в виде графической модели: (рис. 10.5)
|
рис. 10.5 |
Эта модель называется однонаправленным списком. Начало динамической цепочки должно быть зафиксировано. Если адрес первого элемента потерян, то доступ ко всей динамической цепочке будет утерян, и она станет недоступной.
Такие динамические цепочки можно использовать, как массивы переменной длины. Для обозначения окончания динамической цепочки в поле ссылки последнего элемента помещают специальную константу Nilссылочного типа, которая не куда не указывает.
Также можно использовать двунаправленный список, с указанием на предыдущий элемент (рис. 10.6).
|
рис. 10.6 |
Указатель на начало списка (например, вед),
Указатель на текущий элемент, с которым выполняются действия в данный момент: чтение, запись, сравнение и др.(тек.);
Tek1 - указывает на элемент, предшествующий текущему,
New(P) - указатель для добавления нового элемента динамической цепочки.