
- •10. Рекурсивні процедури і функції Рекурсія – це такий спосіб організації обчислювального процесу, при якому підпрограма в ході виконання звертається сама до себе.
- •Лабораторна робота № 10 Рекурсивні процедури і функції
- •Розрізняють незв’язані і зв’язані динамічні дані.
- •Лабораторна робота № 11 Динамічні структури даних
- •12. Файли
- •Лабораторна робота № 12 Текстові файли
Лабораторна робота № 10 Рекурсивні процедури і функції
Мета роботи:
1. Засвоєння принципів організації рекурсивних обчислювальних процесів.
2. Отримання практичних навиків розробки і використання рекурсивних процедур і функцій.
Завдання:
Задано
натуральне
.
Розробити програму для обчислення
заданих сум. При обчисленні сум використати
рекурсивні процедури або функції.
1.
,
2.
,
3.
,
4.
,
5.
,
6.
,
.
7.
,
.
8.
,
,
.
9.
,
,
.
10.
,
,
.
Задано
натуральні
і
.
Розробити програму для обчислення
значень заданих виразів. При обчисленні
виразів використати рекурсивні процедури
або функції.
11.
,12.
,
13.
14.
,15.
,
16.,
17,
18.,
19.
,
20.,
Задано
масиви чисел
.
Розробити програму для обчислення
заданої суми, де
–
відповідні елементи масивів
і
.
При обчисленні сум використати рекурсивні
процедури або функції.
21..22.
.
2324.
25.
,
Задано
дійсні
і масив
,
.
Розробити програму обчислення значення
заданих сум. При обчисленні сум
використати рекурсивні процедури або
функції.
26.,
27.,
28.,
29.,
30.
,
11. Динамічні структури даних
Дані, які використовуються у програмі, поділяються на статичні й динамічні.
Статичні структури даних розміщуються у статичній пам’яті, виділеній компілятором у процесі компіляції програми. Їх взаєморозміщення, взаємозв’язки елементів і кількість завжди залишаються постійними в процесі виконання програми.
Динамічні структури даних розміщуються у динамічній пам’яті, яка виділяється на етапі виконання програми. Їх внутрішня побудова формується за деяким законом, а їх взаєморозміщення, взаємозв’язки елементів і кількість можуть динамічно змінюватися в процесі виконання програми. Для роботи з динамічними даними використовуються вказівники.
Вказівник – це статична змінна, значенням якої є адреса динамічної пам’яті. З допомогою вказівників можна розміщати в динамічній пам’яті будь-які типи даних (цілі, дійсні, логічні, символьні, символьні рядки, масиви, записи та інші). Такі вказівники називаються типізованими. Для опису типізованого вказівника використовується значок ^, який поміщається перед відповідним типом, наприклад
Type Tank = record
p, i, b: string[15];
rn: word;
ps: string[20];
end;
Var v1, s1; ^integer;
v2: ^double;
v3: ^Tank;
Можна описати вказівник і не зв’язувати його з конкретним типом даних. Для цього є стандартний тип Pointer, наприклад:
Var p1, p2: pointer;
Такі вказівники називають нетипізованими. З їх допомогою зручно працювати з динамічними даними, структура і тип яких змінюється при виконанні програми.
Вказівник може бути у трьох станах:
визначений, містить адресу змінної, для якої виділена пам’ять;
невизначений (до першого присвоєння або після звільнення пам’яті);
помічений зарезервованим словом NIL (не вказує ні на які дані).
Значеннями вказівників є адреси змінних, розміщених у динамічній пам’яті. Для них допустима операція присвоєння, якщо вони вказують на один і той же тип даних і типізованому вказівнику можна присвоювати значення нетипізованого. Наприклад, присвоєння v1:=s1; і p1:=p2; – допустимі, а присвоєння v1:=v2 і p1:=v3; – недопустимі.
Для звернення до даних, на які вказує вказівник, за його іменем зразу ставиться значок ^. Наприклад, v1^:=5; або s1^:=v1^.
Вся динамічна пам’ять розглядається як суцільний масив байтів, який називається купою. Для виділення і звільнення динамічної пам’яті використовуються процедури:
Procedure New (Var P: Pointer); – резервує фрагмент купи динамічної пам’яті для розміщення змінної і поміщає в типізований вказівник P адресу першого байта.
Procedure Dispose (Var P: Pointer); – повертає в купу фрагмент динамічної пам’яті, який був зарезервований за типізованим вказівником P. Якщо вказівник P невизначений, то фіксується помилка.
Procedure GetMem (Var P: Pointer; Size: Integer); – резервує за нетипізованим вказівником P фрагмент динамічної пам’яті розміру Size (в байтах) і присвоює йому адресу цієї області.
Procedure FreeMem (Var P: Pointer; Size: Integer); – повертає в купу фрагмент динамічної пам’яті, який був зарезервований за нетипізованим вказівником P. Звільняти потрібно такий розмір пам’яті, який був виділений.