Смекни!
smekni.com

Процедури та функції в Turbo Pascal (стр. 2 из 2)

Рис. 3.

На рис. 3 умовно подано:

1. звертання до процедури F1 із тіла програми Pr;

2. звертання до процедури F2 із тіла процедури F1;

3. звертання до процедури F2 всередині самої себе – рекурсія.

Приклад 4.1. Визначити факторіал у рекурсивній формі:

n!= 1, при n= 0;

n! = n(n-1)!, при n>0.

Тут n! визначається через (n!-1), тобто через ту ж саму функцію.

Program FACT (input, output);

var n : integer;

FUNCTION F ( v : integer): integer;

begin

if v = 0 then F := 1

else F := v * F(v-1);

end;

begin

writeln (‘ ввести аргумент n ‘);

read ( n );

if n<0 then writeln (‘факторіал не визначений’);

else writeln (‘факторіал’, n ,’= ’, F(n));

end.

В прикладі 5.1 рекурсивна функція F обчислює факторіал для n>0 за формулою n!=n(n-1)!. Однак, дану функцію можна представити і не рекурсивною:

FUNCTION F( v : integer): integer;

begin

F := 1:

for i := 1 to v do

F := F * i;

end;

Формально у мові Паскаль не дозволяється використовувати конструкції, які ще не описані.

Для виключення таких ситуацій використовують, так званий, випереджальний опис процедур і функцій. При цьому до опису процедури F1 вказується на подальші використання процедури F2. Тоді звертання з F1 до F2 допустимо.

Program Pr…;

Procedure F2 (параметри);

FORWARD;

Procedure F1 (параметри);

F2 (параметри);{звертання до F2 всередені F1}

end;

Procedure F2;{список параметрів відсутній}

end;

begin

end.

Pr містить дві незалежні процедури F1, F2. В F1 є звертання до F2, тому використаний впереджальний опис процедури F2, який складається із заголовка з параметрами і службового слова FORWARD. Тоді сам опис F2 має заголовок без повторення формальних параметрів.

!Особливості:!

1)при наявності у складі програми декількох процедур або функцій, які звертаються одна до одної, то виникає, так звана, непряма рекурсія. У цьому випадку використовують випереджальний опис процедур.

2)Вхід до блоку процедур або функцій тільки через його початок, а вихід по закінченню всіх дій. Таким чином оператори goto – заборонені, тобто всі мітки у блоці належать блоку і описуються у блоці. Поняття локальних і глобальних міток не існує.

3)При необхідності вийти із середини блока можна використавши стандартну процедуру EXIT , яка має форму:

EXIT (аргумент)

(аргумент – ім’я функції, процедури, програми,

службове слово PROGRAM)

Якщо аргументом є ім’я програми або службове слово PROGRAM, то виконання програми достроково завершується. Якщо аргументом є процедура або функція, то вони завершуються і управління передається в той блок, який викликав процедуру або функцію. Тобто оператору, який стоїть після оператору виклику (рис.4).

4)При використанні в процедурах і функціях глобальних змінних, можлива поява так званих побічних ефектів.

Суть: значення глобальних змінних, які отримані у зовнішньому блоці до входа до процедури (функції), можуть бути змінені в процесі виконання процедури (функції), що приведе до помилки при подальшому їх використанні в програмі.

Рис. 4

Приклад:

Program Pr (input, output);

var i, n, k : integer;

T: array[1..100] of real;

FUNCTION SN: real;

begin

SN := 0

for i:=1 to n do SN:=SN+T[i]

end;

begin

i:=34;

r:=SN;

a:=i + k;{i – після виконання функції стала

невизначеною, тому a:=i + k – не має смисла}

end.


Висновки:

Таким чином, в мові Pascal є широкі можливості використання процедур і функцій, що надає більшу наочність, компактність, структурованість програмам; виникають умови для створення складних програмних комплексів групами програмістів; процес програмування стає більш систематичним і цілеспрямованим.