
- •Процедури та функції споживача
- •Блочна структура програми
- •Опис функціЇ
- •1) Параметр-значення:
- •2) Параметр-змінна:
- •3) Нетипізовані параметри-змінні
- •Правила локалізації
- •Рекурсивний виклик функцій та процедур
- •Перехрестна рекурсія
- •Процедури
- •Типізовані константи у процедурних блоках
- •Примусовий вихід із процедури чи функції
- •Завдання
2) Параметр-змінна:
var <ідентифікатор>:<тип> - змінене в середені програми значення цього параметру повертається до блоку, що викликає функцію.
3) Нетипізовані параметри-змінні
var <ідентифікатор> - таке описування формального параметру дозволяє виконати посилання на змінну будьякого типу. При цьому тип змінної відсутній, тобто не співпадає ні з жодним із типів до операції приведення типів.
<тип> - в заголовку безпосередньо може бути визначенийтільки простий тип. Будьякий стуктурований тип визначається тільки через ідентифікатор типу.
Приклад:
неприпустимо: function f(а,в:array[1..10] of real):integer;
повинно бути: type t=array[1..10] of real;
function f(а,в:t):integer;
але для окремого елементу:
function f1(а,в:real):boolean;
begin
if a>b then f1:=true
else f1:=false;
end;
{виклик для і-тих елементів масивів}
writeln(f1(a[i],b[i]));
Приклад: возведення у цілий степінь
var a:real;
function power(factor:real;expo:integer):real;
var count:integer;
rez:real;
begin
if expo=0 then power:=1
else begin
rez:=factor;
for count:=2 to abs(expo) do
rez:= rez*factor;
if expo<0 then power:=1/rez
else power:=rez
end
end;
{ головна програма }
begin
:
{обчислити x=2a**5+a**3+1}
x:=2*power(а,5)+power(a,3)+1;
:
end.
Приклад: функція повертає номер символа, з якого починається n-те входження підрядка subs у рядок s. Одночасово повертається загальне число входжень count. При невдалому пошуку повертається значення 0.
program example;
var c:byte; { загальне число входжень підрядка у рядок }
function posN(subs,s:string;n:byte;var count:byte):byte;
var p,pn:byte;
begin
count:=0;
pn:=0;
repeat
p:=pos(subs,s);
if count<n then inc(pn,p);
inc(count);
delete(s,1,p);
until p=0;
dec(count);
if N<=count then posN:=pn
else posN:=0;
end;
{ головна програма }
begin
writeln('3-я позиція noo у Boonoonoonoos починається з символа',
PosN('noo','Boonoonoonoos',3,С):3);
writeln(' Всього знайдено входжень:',С);
readln;
end.
Приклад: розробити функцію, що обчислює кількість елементів в одновимірному масиві, що перевищують надане Р, та змінює їх на 0.
Program help;
Type vec=array[1..50] of real;
Var v:vec;
I,n:byte;
P:real;
Function sump(n:byte;var a:vec):byte;
Var i,s:byte;
Begin
S:=0;
For i:=1 to n do
If a[i]>p then begin
S:=s+1;
A[i]:=0;
End;
Sump:=s;
End;
Begin
{введення елементів масиву}
REPEAT
WRITE('Введіть вимірність масиву <=100');
READLN(n);
UNTIL n<=100
WRITELN('Введіть ',n,'елементів масиву');
FOR i:=1 TO n DO READLN(v[i]);
{виведення кількості елементів, що перевищують надане значення}
writeln(‘кількість елементів = ’,sump(n,v));
{виведення нового вектору}
for i:=1 to n do
writeln(v[i]:5:1);
end.
Правила локалізації
Ідентифікатор визначено тільки в межах блоку, в якому його описано.
Один і той самий ідентифікатор може бути по-різному визначено в різних блоках.
Якщо у операторі використовується ідентифікатор, що був описаний у ряді вкладених блоків, то він інтерпретується у відповідності до описування самого внутрішнього із вкладених блоків, що містить наданий оператор.
На рівні блока ідентифікатор може бути описаний тільки один раз.
П
риклад
program ident_interp;
var i: char;
f
unction
first;
var
i:boolean;
function second;
var i:longint;
function
third;
var i:real;
begin
:
i:=0.5; 4 3 2 1
:
end;
begin
:
i:=348;
:
end;
begin
:
i:=false;
:
end;
begin
:
i:=’r’;
:
end.
Аналогічно при вкладеному виклику процедур чи функцій