Програмування Pascal / lab 13
.odtМета роботи
Мета роботи – ознайомитись із особливостями застосування динамічних об’єктів складної структури: списками, стеками та чергами; з операціями, які виконуються над елементами цих об’єктів. Набути практичних навичок програмування з використанням динамічних об’єктів складної структури.
Контрольні питання
1. Які операції виконуються над рядками?
Над динамічним рядком найчастіше виконуються такі операції:
1. Пошук заданого елемента у рядку.
2. Вставка заданого елемента у певне місце рядка.
3. Видалення заданого елемента з вказаного місця рядка.
Найчастіше ці операції подаються у вигляді функції або процедур.
Застосування функцій та процедур простіше в динамічних рядках з ланкою заголовком, оскільки, як перша, так і наступні літери рядка формуються і
обробляються за однаковими правилами.
2. Що таке однонаправлений список, чим він відрізняється від рядка?
Розглянутий раніше рядок, зображений у вигляді ланцюжка символів, є частковим випадком лінійного однонаправленого списку. Для рядка елементами є символи. Для однонаправленого списка – елементами можуть бути значення будь-якого типу: дійсні числа, масиви, записи тощо. Принцип організації та роботи з лінійним однонаправленим списком такий самий, як із рядком. Кожен елемент, що входить у однонаправлений список, має вказівник на наступний елемент. Лінійні однонаправлені списки можуть бути як із ланкою-заголовком, так і без неї. Слід пам’ятати, що тип елементів однонаправленого списку повинен бути однаковий. За лінійним однонаправленим списком можна рухатися лише в одному напрямку від початку до кінця і кожен раз повертатися на його початок оператором: VLAN := VSLOV;
3. Які поля містить двонаправлений список?
На практиці часто виникає потреба провести обробку попереднього елемента у списку. У однонаправленому списку необхідно вертатися на початок рядка, переглянути всі елементи, до того, який потрібний. Це незручно
і нераціонально. Тому для подібних задач доцільно створити двонаправлений список, тобто список, у якому можна рухатися у двох напрямках: як вперед, так і назад. У разі створення такого списку в запис додається ще одне поле – PRIV –
вказівник на попередній елемент.
3. Що таке двонаправлений кільцевий список?
Функція пошуку елемента у двонаправленому списку практично не
відрізняється від аналогічної функції для однонаправленого списку. Головне
перебрати всі елементи або спочатку до кінця, або від кінця до початку.
FUNCTION POSH (ST :ZV2; BUK : CHAR: VAR REZ :
ZV2):BOOLEAN;
Формальними параметрами будуть:
ST – вказівник на рядок;
BUK – символ або елемент, який шукається;
REZ – параметр-змінна через який передається вказівник на перше
входження заданого символу.
4. Який оператор необхідно передбачити у програмі, щоб перейти на
початок однонаправленого та двонаправленого списку?
Схематично алгоритм видалення заданого елемента з двонаправленого
списку зображений на рис. 8.
Щоб видалити елемент В, необхідно:
1. У поле NEXT елемента А записати вказівник на елемент С.
2. У поле PRIV елемента С записати вказівник на елемент А.
5 . Що таке черга, який режим обслуговування черги?
У програмуванні існує структура даних, яка називається чергою. Вона
використовується для моделювання реальної черги. За своїм змістом черга є
суто динамічним об’єктом. Довжина черги (набір її елементів) у часі постійно
змінюється.
Над чергою визначені дві операції:
1. Занести елемент у чергу.
2. Видалити елемент з черги.
У черзі доступні дві позиції:
1. Початок черги.
2. Кінець черги.
За дисципліною обслуговування розрізняють два види черг:
1. FIFO (First In First Out) – “перший прийшов – перший пішов”.
2. LIFO (Last In First Out) – “останній прийшов – перший пішов”.
6. Які операції виконуються над стеком?
ині стека, присвоюється змінній А та повертається у головну програму.
Ланка, в якій був цей елемент, виключається із стека.
PROCEDURE VDSTEK(VAR ST : ZV; VAR A : CHAR);
BEGIN
A := ST↑.ELEM;
ST := ST↑.NEXT
END;
Ця процедура дуже проста, але вона має два недоліки:
1) елемент, який видаляється із стека не знищується, що призводить до “засмічення” пам’яті машини;
2) якщо стек виявиться пустим, то результат виконання процедури буде
невизначеним.
Тому у процедуру слід додати фрагмент перевірки, чи стек не є пустим, і
процедуру видалення динамічного елемента:
PROCEDURE VDSTEK(VAR ST : ZV; VAR A : CHAR);
VAR Q : ZV;
BEGIN
IF ST = NIL THEN WRITELN(’СТЕК ПУСТИЙ’)
ELSE
BEGIN
A := ST↑.ELEM;
Q := ST;
ST := ST↑.NEXT;
DISPOSE(Q)
END
END;
7. Що таке “вершина стека”?
Під час розроблення трансляторів виникає потреба перевірити баланс
дужок в арифметичних виразах. Для цієї задачі використовується стек. Алго-
ритм полягає в тому, що кожна ліва дужка “(“ записується у стек, коли
виявляється права дужка “)”, то ліва дужка зі стека видаляється. Якщо після
закінчення перегляду вхідного рядка стек порожній, то це означає, що є баланс
дужок. У всіх інших випадках баланс дужок не виконується
Індивідуальне завдання
20.Сформувати чергу, елементами якої є слова. Перевірити, чи входять у
неї слова “IF”. Вивести чергу і повідомлення про входження слів.
Текст програми
program lab13(input,output);
uses crt;
type
zv=^pointer;
pointer=record
elem:char;
next:zv;
end;
var
vlan,vslov:zv;
sym:char;
l:boolean;
procedure vstav(lanka:zv; buk:char);
var
q:zv;
begin
new(q);
q^.elem:=buk;
q^.next:=lanka^.next;
lanka^.next:=q;
end;
procedure vudal(lanka:zv);
var
q:zv;
begin
q:=lanka^.next;
lanka^.next:=lanka^.next^.next;
dispose(q);
end;
begin
clrscr;
new(vslov);
vslov^.next:=nil;
vlan:=vslov;
writeln('Введіть символи');
repeat
read(sym);
vstav(vlan, sym);
vlan:=vlan^.next;
until sym='.';
writeln('String =');
vlan:=vslov;
vlan:=vlan^.next;
while vlan^.next<>nil do
begin
write(vlan^.elem);
vlan:=vlan^.next;
end;
writeln;
vlan:=vslov;
while vlan^.next<>nil do
begin
if (vlan^.elem=' ') and
(vlan^.next^.elem='i') and
(vlan^.next^.next^.elem='f') and
(vlan^.next^.next^.next^.next^.elem=' ') then
begin
l:=true;
end;
vudal(vlan);
end;
writeln('L=',l);
end.
Висновки
Виконуючи цю лабараторну роботу, я навчилась використовувати та застосовувати стеки, черги та одно- і дво- нааправлені списки, а також виконувати дії над ними.