Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторні роботи з програмування Модуль 4.DOC
Скачиваний:
12
Добавлен:
23.02.2016
Размер:
1.19 Mб
Скачать

Лабораторна робота № 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. Звільняти потрібно такий розмір пам’яті, який був виділений.