Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
METOD_2.doc
Скачиваний:
11
Добавлен:
09.11.2019
Размер:
9.21 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. .

23 24.

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

Розрізняють незв’язані і зв’язані динамічні дані.

Незв’язані динамічні дані аналогічні статичним, тільки вони можуть з’являтися і зникати під час виконання програми.

Приклад. Моделювання масиву зі змінною верхньою межею.

Program LAB11_1;

{$APPTYPE CONSOLE}

uses Sysutils;

TYPE Tvector = array[1..1] of integer;

VAR vt: ^ Tvector; {Типізований вказівник}

pn: Pointer; { Нетипізований вказівник}

n, i, j: integer;

BEGIN

{Введення початкових даних}

writeln(‘Введіть розмір масиву n<=200’);

readln(n);

{Розрахунок розміру пам’яті для розміщення }

{n елементів масиву}

j:=n*sizeof(integer);

{Виділення динамічної пам’яті}

GetMem (pn, j);

vt:=pn;

writeln(‘Введіть елементи масиву ’);

for i:=1 to n do

read(vt^[i]);

{Виведення масиву по п’ять елементів у рядку}

for i:=1 to n do

if i mod 5 <> 0 then write(vt^[i]:6)

else writeln(vt^[i]:6);

{Звільнення динамічної пам’яті}

FreeMem(pn, j);

readln;

END.

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