Підпрограми
Підпрограми призначені для
реалізації алгоритмів опрацювання окремих частин деякої складної задачі. Вони
дають змогу реалізовувати концепцію структурного програмування, суть якого
полягає в розкладанні складної задачі на послідовність простих підзадач і в
складанні для алгоритмів розв’язування кожної підзадачі відповідних підпрограм.
Розрізняють два види підпрограм — підпрограми-процедури та підпрограми-функції. Підпрограми
поділяються на: стандартні та підпрограми
користувача.
Стандартні
підпрограми
створювати не потрібно — вони містяться у стандартних модулях System, Crt, Dos,
Graph тощо.
Підпрограма
користувача
— це пойменована група команд, яку створюють і описують в основній програмі в
розділах procedure або function і до якої звертаються з будь-якого місця
програми потрібну кількість разів.
1. Процедури (procedure). Загальний
опис процедури:
procedure <назва>
(<список формальних параметрів>);
<розділи описів і оголошень
процедури>;
begin
<розділ команд процедури>
end;
|
У списку формальних параметрів перераховують змінні разом із зазначенням їхніх типів.
Розрізняють параметри-аргументи
(інший термін: параметри-значення) —
вхідні дані для процедури, і параметри-результати
(інший термін: параметри-змінні),
через які можна повертати результати роботи процедури в основну програму. Перед
списками параметрів-результатів кожного
типу записують слово var.
Зауважимо, що масиви фіксованих
розмірів у списках формальних параметрів не можна описувати за допомогою слова array (див. зразки програм).
Розділи
описів і оголошень у підпрограмах мають таку саму структуру як і в основній
програмі.
Приклад1.
Розглянемо процедуру з назвою Cina,
яка визначає с — вартість k хвилин телефонної розмови з похвилинною оплатою 0.6
грн. + 20% ПДВ.
procedure Cina(k:integer; var
c:real);
begin
c:=k*0.6; c:=c+0.2*c;
end;
У наведеному прикладі k є
формальним параметром-аргументом, с —
формальним параметром-результатом.
До процедури звертаються
з розділу команд основної програми або іншої підпрограми.
Звернення
до процедури:
<назва
процедури> (<список фактичних параметрів>);
|
Параметри, які записують
у команді виклику процедури, називаються
фактичними. Фактичними параметрами-аргументами можуть бути сталі, змінні,
вирази, а параметрами-результатами — лише змінні. Типи даних тут не зазначають.
Між
фактичними і формальними параметрами має бути відповідність за кількістю й
типами. Зверніть увагу, відповідні фактичні та формальні параметри можуть мати
різні імена.
Команда виклику
функціонує так: значення фактичних параметрів присвоюються відповідним
формальним параметрам процедури, виконується процедура, визначаються
параметри-результати, значення яких надаються (повертаються) відповідним
фактичним параметрам у команді виклику.
Змінні, описані в розділі
описів основної програми, називаються
глобальними. Вони діють у всіх підпрограмах, з яких складається програма.
Змінні, описані в розділі описів конкретної процедури, називаються локальними. Вони діють тільки в межах даної процедури.
Процедури можуть
отримувати і повертати значення не тільки через параметри-результати, але й
через глобальні змінні. Тому списків параметрів у процедурі може і не бути.
2. Функції (function). Функція, на відміну від процедури, може
повертати в місце виклику лише один результат простого стандартного типу.
Загальний
опис функції:
function
<назва>(<список формальних параметрів>) : <тип функції>;
<розділи
описів і оголошень функції>;
begin
<розділ команд функції, де має бути
така команда: назва:=вираз>
end;
|
У розділі команд функції
має бути команда присвоєння значення деякого виразу назві функції. Результат
функції повертається в основну програму через її назву (як і випадку
використання стандартних функцій, таких як sin, cos).
Звернення
до функції:
<назва>
(<список фактичних параметрів>).
|
Приклад1. Створимо функцію для
обчислення tg(x) та обчислимо значення виразу tg(x)+ctg(x)+tg2(x).
program Myfunc;
uses Crt;
var x,y:real;
function tg(x:real):real;
begin
tg:=sin(x)/cos(x)
end;
begin clrscr;
writeln('Введіть
х');
readln(x);
y:=tg(x)+1/tg(x)+sqr(tg(x));
writeln('y=',
y:5:2); readln
end.
3. Рекурсивні функції. Рекурсією
називається алгоритмічна конструкція, де
підпрограма викликає сама себе. Рекурсія дає змогу записувати циклічний
алгоритм, не використовуючи команду циклу. Розглянемо спочатку поняття стеку.
Стек — це структура даних в
оперативної пам’яті, де дані запам’ятовуються і зберігаються за принципом «перший прийшов — останнім пішов».
Аналогом у військовій справі є ріжок для набоїв до автомата.
Приклад1. Рекурсивна функція
обчислення суми цілих чисел від a до
b має вигляд:
function
Suma(a,b:integer):integer;
begin
if
a=b then Suma := a {Це стоп-умова рекурсії}
else Suma := b + Suma(a, b–1) {Це неявний цикл}
end;
Приклад2. Скласти рекурсивну
функцiю Factorial для обчислення факторіала числа n! = 1·2·3·...·n, (0! = 1, 1!
= 1), яка грунтується на багаторазовому (рекурсивному) застосуваннi формули n!
= n·(n – 1)!.
function Factorial(n : integer) :
integer;
begin
if n = 0 then Factorial := 1 {Це стоп-умова}
else Factorial := n * Factorial(n–1)
end;
Зауваження. Застосовуючи рекурсію, потрібно правильно складати стоп-умови, які забезпечують закінчення
циклічних обчислень.
Немає коментарів:
Дописати коментар