- •1. Основні поняття Object Pascal
- •Label { Розділ опису міток } Const { Розділ опису констант }
- •Дійсні дані зображуються в експоненціальній формі
- •Введення і виведення даних. Для введення і виведення даних використовуються процедури
- •Лабораторна робота № 1 Лінійні програми з розгалуженнями
- •2. Оператори повторень
- •Оператор for з зарезервованим словом to виконується за алгоритмом:
- •Завершення виконання оператора for.
- •Лабораторна робота № 2 Циклічні програми. Обчислення з заданою точністю
- •3. Структуровані типи даних. Масиви
- •Лабораторна робота № 3 Алгоритми обробки масивів
- •4. Алгоритми обробки багатовимірних масивів
- •Лабораторна робота № 4 Алгоритми обробки багатовимірних масивів
- •5. Упорядкування і пошук даних
- •Лабораторна робота № 5 Упорядкування і пошук даних
- •6. Структуровані типи даних. Множини
- •Лабораторна робота № 6 Множини
- •7. Символьні рядки
- •Лабораторна робота № 7 Символьні рядки
- •8. Процедури і функції
- •Лабораторна робота № 8 Процедури і функції
- •9. Процедури і функції. Процедурні типи
- •Лабораторна робота № 9 Процедурні типи
- •Теоретичні відомості для виконання лабораторної роботи
- •1. Формула середніх прямокутників
- •2. Формула трапецій
- •3. Формула Сімпсона (формула парабол)
- •Розв’язування рівнянь. Розв’язування рівнянь виду
- •10. Рекурсивні процедури і функції Рекурсія – це такий спосіб організації обчислювального процесу, при якому підпрограма під час виконання звертається сама до себе.
- •Лабораторна робота № 10 Рекурсивні процедури і функції
- •11. Динамічні структури даних
- •Дані, які використовуються у програмі, поділяються на статичні й динамічні.
- •Вказівник може бути у трьох станах:
- •Вказівники
- •Лабораторна робота № 11 Динамічні структури даних
- •12. Файли
- •Лабораторна робота № 12 Текстові файли
- •Додаток Процедури і функції Object Pascal
- •Література
- •Практикум
- •58012, Чернівці, вул. Коцюбинського, 2
Лабораторна робота № 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.