Приклад1 розробки процедури:
Procedure Sum (a, b : real; var y, z : real);
const n=10;
var i : integer;
begin
for i := 1 to n do
begin
y := a + b * i;
z := 4 * y – i;
end;
end.
Тут aі b– вхідні параметри, їх значення передаються із основної програми в цю процедуру. Результати процедури (вхідні параметри)є обчислені значення yі z, які передаються із процедури в основну програму і там можуть бути використані.
b. Методика використання процедури у зовнішньому блоці.
Для використання процедур існує так званий оператор процедури:
<ім’я процедури>_ (список фактичних параметрів)
Ім’я повинноспівпадати з іменем записаної процедури. Параметри у дужках носять назву фактичні. Вони відповідають реальним змінним, над якими виконують операції. Фактичні і формальні параметри повинні відповідати одне одному за містом їх розміщення і типом. Список фактичних параметрів не містить типів даних, бо вони вже вказані у списку формальних параметрів.
Program PR;
…
procedure P(x, y : real; var z : real );
…
end;
begin
…
P(a, b, c);{виклик процедури}
…
end.
Рис.3
Приклад 2: в програмі визначити довжину кола C і площі круга S, обмеженого цим колом; відстань Lцентра кола від початку координат О. Координати центра кола – x, y , радіус кола – R.
Program KOLO ( input, output );
Var R : real; {радіус}
x, y : real:{координати центра}
C : real;{довжина кола}
S : real;{площа круга}
L : real;{відстань від центру}
Procedure KRUG ( R, x, y : real; var C, S, L : real);
Const pi = 3.14;
Begin
C := 2 * pi * R;
S := pi* sqr ( R );
L := sqrt ( sqr(x) + sqr(y));
End;
Begin
Writeln (‘ ввести R, x , y :‘);
Read ( x, y , R);
KRUG ( R, x ,y, C, S, L);
Writeln (‘довжина кола = ’, C : 6 : 2);
Writeln (‘площа кола = ’, S : 6 : 2);
Writeln (‘відстань = ’, L : 6 : 2);
End.
Результат виконання:
Ввести значення R, x, y:
386
довжина кола = 18,84
площа круга = 8,26
відстань = 10,00
Пояснення процесу звертання до процедур:
При виконанні дій, заданих оператором процедури, виконується передача фактичних параметрів, т.б. їх підставка на місце фіктивних. Таким чином в тілі процедури кожен формальний параметр заміняється фактичним. Виникає, так зване, модифіковане тіло процедури, яке безпосередньо реалізується ЕОМ. Після виконання процедури в комірках пам’яті ЕОМ залишаються результати, які поіменовані фактичними параметрами, які відповідають даним результатам.
Суть (трактовка) параметрів-значень і параметрів змінних.
Розглянемо особливості передачі параметрів із зовнішнього блоку до внутрішнього.
1-й спосіб – підстановка на місце формальних параметрів обчислених значень фактичних параметрів. Наприклад:
Sum (3.5, 7.6, y, z);
2-й спосіб – підстановка замість формальних параметрів імен фактичних параметрів:
Sum (x1, x2, y, z);
При цьому результати процедури завжди утримують імена (і не обов’язкого співпадаючи з іменами формальних параметрів). Наприклад:
Sum (x1, x2, С, D);
Розглянемо можливі варіанти опису фактичних параметрів у зовнішньому блоці і відповідне звертання до процедури.
Таблиця 1
І. ProcedureP(x : тип; y : тип; varz : тип);
1 | A – const; B - const; C – var | P (A, B, C) |
2 | A – var; B – var; C – var | A := F1; B := F2; ……………. P (A, B, C); або read (A, B); …………… P (A, B, C); |
3 | C – var; | P (3, 4 ,C); |
ІІ. Procedure P1(var x : тип; var y : тип; var z : тип);
4 | A- var; B- var; C- var; | A := F1; B :=F2; aбо read (A, B); …………………… P1 (A, B, C); |
Коментарій табл.1:
1) фактичні параметри A,B у зовнішньому блоці описані як const і замінюють формальні параметри-значення x, y процедури Р;
2) фактичні параметри А і В обчислюються або вводяться у зовнішньому блоці перед вставленням їх у процедуру;
3) фактичні параметри А і В не об’явлені. Тому замість їх імен вставленні конкретні значення 3 і 4;
4) всі параметри задані змінні, тому при формуванні модифікованого тіла процедури на місце формальних параметрів підставлені імена фактичних параметрів.
7. Процедури без параметрів
В таких процедурах замість формальних параметрів використовують глобальні змінні.
Використання процедур без параметрів потребує уваги і коректності при складанні програм, точного дотримання правил локалізації змінних.
Для приклада 2 – програма обчислення параметрів кола при використані процедури без параметрів буде мати вигляд:
Приклад 2а:
Program KOLO1 ( input, output );
Var R, x, y, С, S, L : real;
Procedure KRUG ( R, x, y : real; var C, S, L : real);
Const pi = 3.14;
Begin
C := 2 * pi * R;
S := pi* sqr ( R );
L := sqrt ( sqr(x) + sqr(y));
End;
Begin
Writeln (‘ ввести R, x , y :‘);
Read ( x, y , R);
KRUG ;
Writeln (‘довжина кола = ’, C : 6 : 2);
Writeln (‘площа кола = ’, S : 6 : 2);
Writeln (‘відстань = ’, L : 6 : 2);
End.
Змінні, яки використані у процедурі описані як глобальні.
8. Особливості використання функцій
За своїм призначенням і способом побудови функція мало чим відрізняється від процедур.
Особливості функцій:
1) має тільки один результат виконання;
2) результат позначається іменем функції і передається в основну програму, тому імені функції присвоюють необхідний тип даних:
3) форма побудови функції відрізняється від процедури тільки заголовком;
4) можна викликати в середині виразу:
F := FAST (M) – FAST (K);
Приклади заголовків функції:
1) FUNCTION f (a, b :real) : real;
А і В – дійсні параметри значення;
F – ім’я функції, яка отримає результат виконання функції типа real/
2) FUNCTION f1 (x : real; var y, z : integer) : real;
x- дійсні параметри значення;
y, z – цілі параметри змінні;
Суть параметрів-значень і параметрів-змінних аналогічна процедурам
3) FUNCTION f2 : real;
без параметрів
Приклад 3; знайти різницю факторіалів F=m! – k!
FUNCTION FACT ( n: real) : real;
Var i :integer:
p : real;
Begin
p :=1:
for i := 1 to n do
p := p * i;
FACT := p;
End;
Тут FACT– ім’я функції, якому присвоюється результат типа real. Формальним параметром є n – параметр-значення типу integer.
(наприк. mik):
F := FAST (M) – FAST (K);
Таким чином, якщо процедури і функції розробляються для багаторазового використання, краще їх використовувати з використанням параметрів, щоб досягнути максимальної незалежності від тієї програми, де вона використовується.
9. Методи звертань до процедур і функцій
Існує 3 варіанти звертання до процедур і функцій:
1) із зовнішнього блоку (цей спосіб розглянули у попередніх питаннях лекції);
2) із сусідньої функції;
3) із самої функції – рекурсія.
Розглянемо на прикладах 3-й і 2-й варіанти звертання:
Функцій (процедура), яка викликає сама себе називається рекурсивною.
Суть рекурсії розглянемо на прикладі4:
Визначити факторіал у рекурсивній формі:
n!=1, при n=0ж
n!=n(n-1)!, при n>0.
Тут n! визначається через (n!-1), т.б. через ту ж саму функцію.
Programa 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.
В прикладі4 рекурсивна функція F можно представити і не в рекурсивною:
FUNCTION F( v : integer) : integer;
Begin
F := 1:
for i := 1 to v do
F := F * i;
End;
Особливість: на реалізацію рекурсивної функції ЕОМ затрачує значний час, хоча її опис більш компактний і наочний. Не рекурсивні функції обчислюються швидко.
Формально у мові Паскаль не дозволяється використовувати конструкції, які ще не описані.
Для виключення таких ситуацій використовують, так званий, випереджальний опис процедур і функцій. При цьому до опису процедури F1 вказується на подальші використання процедури F2. Тоді звертання з F1 до F2 допустимо (рис.5).
ProgramPr…;
Procedure F2 (…);
FORWARD;
Procedure F1 (…);
…
F2 (…);
End;
Procedure F2;
…
end;
begin
…
end.
Рис.5
Pr містить 2-і незалежні процедури F1, F2. В F1 є звертання до F2, тому використаний випереджальний опис процедури F2, який складається із заголовка з параметрами і службового слова FORWARD.
Тоді сам опис F2 має заголовок без повторення формальних параметрів.
Особливості:
1)при наявності у складі програми декількох процедур або функцій, які звертаються одна до одної, то виникає, так звана, пряма рекурсія. У цьому випадку використовують випереджальний опис процедур.
2)Вхід до блоку процедур або функцій тільки через його початок, а вихід по закінченню всіх дій.
Т. ч. оператори goto – заборонені, т.б. всі мітки у блоці належать блоку і описуються у блоці. Поняття локальних і глобальних міток не існує.
3)при необхідності із середини блока можна використати стандартну процедуру EXIT, яка має форму:
EXIT (аргумент)
Якщо аргументом є ім’я програми або службове слово PROGRAM, то виконання програми достроково завершується.
Якщо аргументом є процедура або функція, то вони завершуються і управління передається в той блок, який викликав процедуру або функцію. Т.б. оператору, який стоїть після оператору виклику
Висновки
Таким чином, в Паскалі є широкі можливості використання процедур і функцій, що надає більшу наочність, компактність, структурованість програм; виникають умови для створення складних програмних комплексів групами програмістів; процес програмування стає більш систематичним і цілеспрямованим.