
- •Процедури та функції споживача
- •Блочна структура програми
- •Опис функціЇ
- •1) Параметр-значення:
- •2) Параметр-змінна:
- •3) Нетипізовані параметри-змінні
- •Правила локалізації
- •Рекурсивний виклик функцій та процедур
- •Перехрестна рекурсія
- •Процедури
- •Типізовані константи у процедурних блоках
- •Примусовий вихід із процедури чи функції
- •Завдання
Рекурсивний виклик функцій та процедур
Процедура чи функція може бути викликана:
Із тіла головної програми
Із тіла іншої процедури та функції
Із тіла тої ж самої процедури та функції - рекурсія
Приклад: Обчислити хn, n0, ціле за допомогою рекурсії.
program help;
function power(x:real;n:integer):real;
begin
if n=0 then power:=1
else power:=power(х,n-1)*x
end;
{ головна програма }
begin
:
y:=power(4,8);
:
end.
Приклад: обчислити n!.
Program;
var number:integer;
function factorial(value:integer):integer;
begin
if value=0 then factorial:=1
else factorial:=factorial(value-1)*value
end;
begin
readln(number);
if number<0 then writeln(' нема фекторіалу від'ємного числа')
else writeln('факторіал ',number,' дорівнює ',factorial(number))
end.
Приклад: перевести десятькове число у вісімкове шляхом ділення та виведення остач у зворотньому порядку.
Var z:integer;
Procedure convert(z:integer);
Begin
If z>1 then convert(z div 8);
Write(z mod 8:1);
End;
Begin
Readln(z);
Convert(z);
End.
Перехрестна рекурсія
Виникає, якщо обчислюються взаємно пов'язані функції
f(х)=p(х,g(х))
g(х)=t(х,f(х))
Виникає конфлікт: як звернутись до функції, яка буде описана після тої, що її викликає (звернення, що передує описуванню, неможливе у мові Паскаль). Конфлікт вирішується за допомогою випереджаючого описування, якe містить заголовок функції, після якого вживається службове слово forward:
{випереджаюче описування: }
function <ім'я>(<формальні параметри>):<тип результату>;forward;
<iнші процедури та функції>
{ саме описування функції }
function <ім'я>;
<тіло функції>
Приклад: Знайти всі прості числа, що передують наданому n
program;
function next(i:integer):integer;forward;
function prin(j:integer):boolean;
{ prim=true, якщо j - просте; інакше - false }
var k:integer;
begin
k:=2;
while (k*k<=j)and(j mod k<>0) do
k:= next (k);
{ k пробігає прості числа від 2 до j, перевіряючи, чи є це число дільником }
if j mod k=0 then prim:=false
else prim:=true
end;
function next;
var l:integer;
begin
l:=i+1;
while not prim(l) do l:=l+1;
next:=l;
end;
{ головна програма }
begin
readln(n);
for i:=2 to n do
if prim(і) then writeln(i:10)
else writeln(i:3)
{ виведення у два стовпчики }
end.
Процедури
<заголовок>:
procedur <ім'я> [(<список формальних параметрів>)];[forward;]
<тіло процедури>
Правила описування формальних параметрів та використання випереджуючого описування при організації рекурсії такі ж самі, як і для функції.
Різниця:
- у зверненні
- у випадку використання процедури як початкові данні так і результати повинні бути передані як парамети.
Приклад: визначити середнє
а) за допомогою функції
program first;
var x,y:real;
function midle(a,b:real):real;
begin
midle:=(a+b)/2;
end;
begin
readln(x,y);
writeln(midle(x,y):8:2);
end.
в) за допомогою процедури
program second;
var x,y,m:real;
procedure midle(a,b:real;var mi:real);
begin
mi:=(a+b)/2;
end;
begin
readln(x,y);
midle(x,y,m);
writeln(m:8:2);
end.
Приклад:виконати множення матриць A(m,n),B(n,k), введення, виведення та множення оформити у вигляді процедур.
Program mul;
Type mat=array[1..50,1..50] of real;
Var a,b,c:mat;
m,n,k,i,j:byte;
Procedure inpm(var x:mat:m,n:byte);
{введення матриці}
Var i,j:byte;
Begin
{введення розміру матриці та її елементів}
write(‘введіть розмірність, m,n ‘);
readln(m,n);
{введення матриці по рядках}
for i:=1 to m do
begin
for j:=1 to n do
read(x[i,j]);
readln;
end;
end;
procedure outpm(x:mat;m,n:byte);
{виведення матриці}
var i,j:byte;
begin
for i:=1 to m do begin
for j:=1 to n do
write(x[i,j]:7:2);
writeln;
end;
end;
procedure mul(m,n,k:byte;a,b:mat;var c:mat);
{множення A(m,n)*B(n,k)=C(m,k)}
var i,j,p:byte;
begin
for i:=1 to m do
for j:=1 to k do begin
c[i,j]:=0;
for p:=1 to n do
c[i,j]:=c[i,j]+a[i,p]*b[p,j];
end;
end;
{головна програма}
begin
inpm(a,m,n);
inpm(b,n,k);
mul(m,n,k,a,b,c);
outpm(c,m,k);
end;