Дії над динамічними змінними - Інформатика, програмування

11.5 Дії над динамічними змінними

Ми розглянули питання, коли йшлося про дії над змінними (покажчиками). Тепер звернемося до дій над динамічними змінними.

Як мовилося раніше вище, динамічні змінні покликані раціональніше використовувати пам'ять у процесі роботи програми. Раціональність полягає, перш за все, у тому, щоб прибирати з пам'яті вже непотрібні дані. Це досягається за допомогою оператора DISPOSE, який має вигляд DISPOSE (R), де DISPOSE - ім'я процедури стирання, а R - ім'я змінної посилання, що вказує на динамічну змінну R^, що підлягає видаленню.

Отже, DISPOSE звільняє пам'ять нового використання. Динамічні змінні, не стерті за допомогою DISPOSE, продовжують займати місце в купі після закінчення роботи фрагмента програми (стають сміттям), їх треба прибирати.

ПРИКЛАД 3. Породження та подальше стирання двох динамічних об'єктів

new(A); new(B); A^:= 1; B^:= 2;

ПРИКЛАД 4. Знаходження в речовинному масиві RA елемента з індексом, що дорівнює значенню найменшого елемента масиву IA

RA = array[1..10] of real;

IA = array[1..10] of integer;

G^[1]:= random(12) + 6; k:= G^[1];

for i:= 2 to 10 do begin G^[i]:= random(12) + 6;

rite(G^[i],''); якщо G^[i] k then k: = X[i]^;

writeln; writeln ('Найбільший елемент:', k:4:1);

for i:= n downto 1 do dispose (X[i]);

11.6 Динамічні структури даних. Обробка ланцюжків

Структури даних є важливим поняттям в інформатиці як науці, що знаходить своє вираження у описі будь-якої мови програмування. Особливо це стосується структурованих мов, якою є мова Паскаль. Уцій мові сильно розвинений інститут організації даних, причому для роботи з цими даними є кілька типів даних та способів їх включення до складних структур.

Найчастіше змінні цих типів використовуються самостійно (відокремлено), однак можна створювати на їх основі інші типи даних вищого рівня складності, які називають комбінованими. Ми вже знаємо приклад такого типу - RECORD, що дозволяє об'єднати в єдине ціле дані практично всіх вищевказаних типів (поля запису мають різний тип даних).

Введення посилальних змінних дає можливість посилити цей прийом, а посилання у поєднанні з регулярними (масивами та типом STRING) та комбінованими (RECORD) типами дозволяють утворити так звані динамічні структури даних у вигляді ланцюжків, черг, стеків, деків та ін.

З поняттям "ланцюжок" пов'язане поняття рядка - упорядкованої послідовності даних алфавіту мови. Рядок - найуніверсальніша структура даних, з нею пов'язані рішення багатьох завдань.

Є три класичні завдання роботи з рядками:

1) пошук входження заданої літери у рядок;

2) вставка заданої літери у вказане місце рядка;

3) виключення літери із зазначеного місця рядка.

Розв'язання цих завдань залежить від способу подання рядка:

1) векторне уявлення;

2) подання рядка у вигляді ланцюжка з використанням посилального та комбінованого типів.

Сюди відносяться типи STRING та символьний масив. Наприклад, слово PASCAL можна уявити двома способами:

VAR S1: STRING [6]; S2: ARRAY[1..6] OF CHAR.

І тут S1[1]='P', S2[4]='C'.

Отже, ми маємо безпосередній доступ до літери, і це зручно для вирішення першого завдання. Складніше питання з рішеннямзавдання вставки елемента у рядок (або видалення з рядка).

Наприклад, у слово PASAL потрібно вставити пропущену літеру C ® PASCAL. Тут елементи, які за вставкою, збільшують свої індекси, тобто. після вставки треба проводити переіндексацію програмним шляхом. Така сама ситуація і при видаленні елемента.

При вставці та видаленні довжина рядка змінюється. Отже, потрібно замовляти довжину об'єкта трохи більше за реальний і передбачати покажчик кінця рядка, наприклад, знак "#".

ПРИКЛАД 6. Видалення в літерному векторі елемента, що йде за вказаним індексом

var ST: array[1..N] of char;

writeln('індекс?'); read(IND); K:=IND+1;

begin ST[K]:=ST[K+1]; K:=K+1; end;

Це завдання вирішується набагато простіше, якщо уявити літерний вектор за допомогою типу STRING і застосувати процедуру DELETE, проте тут треба заздалегідь замовляти довжину вектора.

При роботі з рядками важливим є поняття "наступний елемент". У векторному уявленні воно тісно пов'язане з розташуванням попереднього елемента. У цьому випадку наступний елемент фізично знаходиться поруч із попереднім (у сусідньому осередку пам'яті). Однак, суцільне розташування рядка в пам'яті не завжди зручне та ефективне. Змінні типу покажчик дозволяють реалізовувати звані пов'язані структури даних, серед яких найпоширеніші лінійні списки - ланцюжка, де елемент викликається з допомогою покажчика на попередній чи наступний елементи.

Цю ситуацію можна порівняти з чергою на прийом до лікаря: у приймальні пацієнти не обов'язково сидять один за одним, але кожен суб'єкт (елемент списку) знає, за ким чи перед ким він "коштує".

За такої організації, якщо хтось залишає чергу, це не вимагає фізичного переміщення інших: простостоїть за минулим тепер запам'ятовує іншу людину (змінюються посилання).