Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metod-PASCAL.doc
Скачиваний:
4
Добавлен:
23.02.2016
Размер:
889.34 Кб
Скачать

Варiанти завдань №7

Органiзувати файли для масиву записiв, варiанти яких визначені в завданнi №5.

15. Вказівний тип

Змiннi типу масивiв, стандартних типiв, перелiчення, обмеженого типу називаються статичними, тому що по їх iменах вiдбувається звертання до наперед зарезервованої областi пам'ятi. Однак, часто виникає необхiднiсть в динамiчному породженнi об'єктiв i розмiщенні їх у пам'ятi ЕОМ пiд час виконання програми. Така ситуацiя може зустрiчатися, коли кiлькiсть об'єктiв у програмi заранi не вiдома i виділяти достатню кiлькiсть комiрок пам'ятi пiд них з запасом неефективно. В цьому випадку мова Паскаль дає можливiсть програмiсту застосувати динамiчнi структури даних, якi дозволяють змiнювати кiлькiсть об’єктiв у програмi. Для доступу до динамiчних об'єктiв маємо змiннi спецiального типу, який називається вказiвним. Вiн описується так:

TYPE <iм'я типу> = <тип наповнення>;

VAR <iм'я змiнної> : <iм'я типу>;

<iм'я змiнної> : <стандартний тип>;

Наприклад :

TYPE WT = CHAR;

VAR ST: WT; A2: INTEGER;

Для створення динамiчних об'єктiв маємо стандартну процедуру NEW (<iм'я вказiвної змiнної>).

Пiсля виконання такої процедури <змiнна> одержує значення вказiвки на породжений об'єкт. Щоб одержати доступ до динамiчно видiленої пам'ятi, необхiдно звернутися за формою: <iм'я вказiвної змiнної>.

Наприклад : VAR A1, A2 : INTEGER; . . .

NEW (A); A1:=235, A2:=A1 ;

WRITE (A1, A2+100);

В результатi виконання цих операторiв роздрукуються данi:

235 335.

Для знищення динамiчних об'єктiв iснує процедура DISPOSE(<iм'я вказiвної змiнної>). Пiсля її виконання <змiннiй> присвоюється константа NIL, а пам'ять звiльнюється.

Властивостi вказiвних змiнних та вказiвного типу:

а) Вказiвна змiнна може використовуватись в операторах присвоювання: A1:=A2; A2:=NIL;

б) Над вказiвними змiнними можна виконувати операції порiвняння = та <> (iншi операції порiвняння не мають сенсу):

IF A1 <> NIL THEN ...;

IF A1=A2 THEN ...;

в) Початкове значення вказiвної змiнної дорiвнює NIL . Такий же стан виникає i пiсля виконання процедури DISPOSE;

г) При роботi з вказiвними даними треба бути обережним, щоб не засмiтити пам'ять ЕОМ.

NEW(A1); NEW(A2); (A1) :=75; A2:=175; A1:= A2;

Адреса числа 75 загублена i комiрку з цiєю адресою неможливо очистити процедурою DISPOSE.

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

Списком називається упорядкована структура, кожний елемент якої мiстить вказiвку на наступний елемент. Для органiзацiї списку використовується запис, що складається з iнформацiйної частини, яка зберiгає iнформацiю про об'єкт, та вказiвної частини, яка зв'язує об'єкт з наступним:

Для означення списку використовуєтся так званий рекурсивний опис. Наприклад, опис списку на зарплату пiдроздiлу має вигляд:

TYPE VKAZ = SPISOK;

SPISOK = RECORD

PR: STRING[30];

ZA: REAL;

ADR: VKAZ;

END;

VAR S1,S2 : VKAZ;

Змiнна S1 вказує на початок списку. Рухаючись з допомогою вказiвок, можна пройти послiдовно по всiх об'єктах списку. Рекурсивним описом називається попереднє означення змінної, тому що опис VKAZ включає в себе посилання на SPISOK, який ще не описаний. Це єдине виключення з правила в мовi Паскаль за яким посилання на iдентифiкатор допускається лише пiсля того, як вiн уже описаний.

До елемента звертаються по складеному iменi:

S1.ZA , S2.ADR .

З допомогою змiнних, означених у попередньому описi, створимо список на одержання зарплати. Змiнна A1 потрiбна для породження нового елемента списку, змiнна A2 – для зберігання початкової адреси списку.

PROCEDURE SP;

BEGIN

S2:=NIL;

FOR I:=1 TO N DO

BEGIN

NEW(A1);

READ(S1. PR,S1.ZA);

S1.AD:=S2;

S1:=S2;

END

END;

Для того щоб організувати список на N осіб, необхідно побудувати цикл, що відповідає такій схемі:

1)

2)

3)

Виведення списку можливе таким програмним фрагментом:

PROCEDURE VIVOD;

BEGIN

S2:=S1;

WHILE TRUE DO

BEGIN

WRITE (S1.PR,S1.ZP);

IF S1. ADR=NIL THEN EXIT;

S1:=S1. ADR

END

END;

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