- •Передмова
- •Тема 1: Правила техніки безпеки при роботі з комп’ютером
- •Тема 2: Алфавіт. Ідентифікатори. Константи. Вирази
- •Тема 3: Загальна структура і розділи Pascal-програми
- •Тема 4: Введення і виведення у Pascal-і. Форматоване виведення
- •Тема 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: Використання модуля crt. Програмування клавіатури
- •Тема 30: Використання модуля crt. Текстове виведення на екран. Програмування звукового генератора
- •Тема 31: Графічні можливості tp 7.0. Використання бібліотеки Graph
- •Тема 32: Бібліотечні модулі користувача
- •Тема 33: Основні принципи ооп. Створення об’єктів. Використання об’єктів
- •Список літератури
- •Додаток а (довідковий) Основні алгоритми обробки масивів
- •Додаток б (довідковий) Питання перевірки знань з теорії
- •Додаток в (довідковий) Поширені коди клавіш
- •Додаток д (довідковий) Коди сканування клавіатури
Тема 28: Поняття та робота з процедурами та функціями
При написанні програм часто приходиться зіштовхуватися із ситуаціями, коли однаковий набір операторів потрібно повторити кілька разів. У таких випадках раціонально використовувати підпрограми.
Підпрограма – це іменована логічно закінчена група операторів, яку можна викликати за ім’ям в різних місцях програми будь-яке число раз.
У Pascal-і підпрограми реалізовані у виді процедур і функцій.
Процедура – це іменована логічно незалежна частина програми, призначена для виконання визначених дій після однократного опису.
Для виконання дій, передбачених процедурою, її викликають по імені. Ім'я процедури використовується тільки для її виклику і його не можна використовувати як операнд у вираженнях.
Функція аналогічна процедурі, але відрізняється від неї тим, що з ім'ям функції пов'язується її значення, що передається в точку виклику. Ім'я функції можна використовувати у вираженнях як операнд.
Виділяють дві групи процедур і функцій:
-
Убудовані (стандартні), що є частиною мови і мають строго фіксовані імена. Зберігаються вони в бібліотечних модулях, що підключаються до програми Uses.
-
Процедури і функції обумовлені користувачем. Ті дії, що потрібно виконувати в різних місцях програми, можна описати у вигляді процедури чи функції, а потім звертатися до них по імені.
Опис процедур і функцій розташовується в розділі описів і має ту ж структуру, що і програма.
Опис процедури:
procedure ім'я (список формальних параметрів);
розділи описів;
розділ операторів;
end;
Опис функції:
function ім'я (список формальних параметрів) : тип результату;
Розділ опису;
Розділ операторів;
end;
Локалізація імен. Імена змінних не повинні збігатися з ім'ям процедури й усередині локального блоку повинні бути унікальні. Змінні усередині блоку називаються локальними. Змінні в глобальному блоці називаються глобальними.
Імена локальних і глобальних змінних можуть збігатися. У цьому випадку ім'я локальної змінної закриває відповідну глобальною змінну.
Параметри процедур і функцій. У списку формальних параметрів вказуються імена параметрів і їхній тип. Перед іменами змінних може бути var. Приклади.
procedure demo (x,y : real; var z : real);
function power (var i,j : integer; real; var c: char) : boolean;
Список формальних параметрів може бути відсутній, тобто припустимі процедури і функції без параметрів. Формальні параметри використовуються в тілі процедури без їхнього попереднього опису в розділі опису процедури.
При звертанні до процедури чи функції формальні параметри заміняються фактичними.
Приклад.
Обчислити ab (вираження ab заміняємо вираженням exp(b ln(a))):
Приклад використання процедури:
var a,b,c : real; {фактичні параметри}
procedure demo (var x,y,z : real);
begin
if x>0 then z := exp(y*ln(x))
else if x<0 then z := exp(y*ln(abs(x)))
else if y = 0 then z := 1
else z := 0;
end;
begin {Основна програма}
writeln(‘Введіть значення a, b:’);
read(a,b);
demo(a,b,c); {при звертанні формальні параметри заміняються} {фактичними}
writeln(‘a^b=’,c:3:2);
end.
Приклад використання функції:
var a,b,c : real;{фактичні параметри}
function demo (var x, y: real) : real;
begin
if x > 0 then demo := exp(y*ln(x))
else if x<0 then demo := exp(y*ln(abs(x)))
else if y = 0 then demo := 1
else demo := 0;
end;
begin {Основна програма}
writeln(‘Dведіть значення a,b:’);
read(a,b);
writeln(‘a^b=’,demo(a,b):3:2);{при звертанні формальні параметри заміняються фактичними}
end.
Виклик функції можна використовувати в списках параметрів оператора Write і Writeln. Для процедур це неможливо.
Як бачимо, імена фактичних параметрів можуть не збігатися з формальними, оголошеними при описі процедури чи функції; важливі їхній порядок і збіг типу.
Параметрі-змінні і параметри-значення. Якщо в списку формальних параметрів процедури чи функції в описі присутнє зарезервоване слово Var, параметр називається параметр-змінної, якщо Var не є присутнім, параметр називається параметром-значенням.
1-і відмінність. При звертанні до процедури чи функції якщо формальний параметр є параметром-змінною, то в якості фактичного параметру, що відповідає даному формальному, може бути використано лише ім'я змінної. Замість параметра-значення при звертанні можна підставляти будь-яке вираження відповідного типу.
Приклад.
function power (var x,y : real) : real;
c := power(a,b); {вірно}
c := power(1,4,b); {не вірно, потрібно тільки ім'я змінної}
Якщо опис такий:
function power(x,y:real) : real;
то
c := power(a,b); {вірно}
c := power(2/*a,b+1,5);{вірно}
2-і відмінність. Якщо формальний параметр описаний як параметр-змінна, то при звертанні до процедури чи функції всі дії, описані в блоці для даного параметра, виконуються безпосередньо над глобальною перемінною, що є відповідно фактичним параметром; у випадку параметра-значення ці дії виконуються не над глобальною перемінною, а над її копією.
Приклад.
var a,b : integer;{фактичні параметри}
procedure double(x : integer; var y : integer);
begin
x := x+x; y := y+y;
writeln(‘Подвоєні: x = ’,x,’ y = ’,у);
end;
begin
a := 1; b := 3;
writeln(‘Вихідні: x = ’,a,’ y = ’,b);
double(a,b);
writeln(‘Після звертання до процедури: x = ’,a,’ y = ’,b);
end.
Результат роботи: Вихідні: x = 1, y = 3
Подвоєні x = 2, y = 6
Після звертання до процедури: x = 1, y = 6
Рекурсивні процедури і функції.
Процедура чи функція називається рекурсивної, якщо у своєму визначенні вона використовує посилання на саму себе.
Наприклад, n-факторіал можна визначити в такий спосіб:
1, якщо n = 0 При n = 1
n! = n(n-1)!, якщо n ≠ 0 1! = 1*0! = 1;
При n = 2
2!=2*1!=2*1*0!
Рекурсивна функція для обчислення факторіала,
function fact(n : word) : word;
begin
if n = 0 then fact := 1 else
fact := fact(n-1)*n;
end;
Поряд із прямою рекурсією можливий непрямий рекурсивний виклик. Наприклад:
procedure A . . . begin . . . B; . . . end; procedure B . . . begin . . . A; . . . end; |
Непряма рекурсія при такому описі порушує основний принцип ТР: будь-який ідентифікатор перед застосуванням повинний бути описаний. Щоб допустити можливість рекурсії в ТР вводиться випереджальний опис. Заголовок функції, на який передбачається посилання до опису, описується звичайним чином, а потім слідом за заголовком указується слово forward, що означає, що тіло даної процедури буде далі. Наприклад.
procedure B; forward; procedure A; . . . procedure B;
|
Питання для контролю:
-
Що таке підпрограма і як вона реалізована в Pascal?
-
Визначення процедури і функції. Відмінність функції від процедури.
-
На які групи поділяються процедури і функції?
-
Опис процедури і функції.
-
Локалізація імен змінних.
-
Параметри процедур і функцій.
-
Параметри-змінні і параметри-значення. Відмінності.
-
Рекурсивні процедури і функції. Пряма і непряма рекурсія. Випереджальний опис.