infa_1 / 2.Процедурные типы
..doc2. Процедурные типы.
Переменная может являться процедурой или функцией с определенными параметрами; для этого при описании типа указывается заголовок процедуры или функции со всеми параметрами, но без имени.
type
proc = procedure (var x: integer; n: unteger);
func = function (x: real): real;
var
p: proc;
f: func;
procedure proc1 (var m: integer; k: integer);
begin
m:= m*n;
end;
procedure proc2 (var k: integer; pow: integer);
var
i,w: integer;
begin
w:=1;
for i:=1 to pow do
w:= w*k;
k:=w;
end;
function func1 (var x: real): real;
begin
func1:= sin(x)*sqrt(abs(x));
end;
function func2 (var q: real): real;
begin
func1:= ln(sqrt(abs(lg));
end;
В результате переменная p типа proc может принять одно из двух значений proc1 или proc2, для чего требуется написать оператор присваивания p:= proc2.
После этого оператора при вызове p выполняется процедура proc2.
При использовании процедурных типов необходимо помнить:
-
при присваивании переменной процедурного типа какой-либо процедуры или функции необходимо, чтобы число параметров и их типы присваиваемой функции совпадали с описанием процедурного типа;
-
в качестве присваиваемой процедуры или функции не могут быть использованы стандартные;
-
присваиваемые процедуры или функции не могут быть объявлены внутри другой процедуры;
-
в этих подпрограммах не должны содержаться команды, записанные в машинных кодах;
-
эти подпрограммы не должны обрабатывать прерывания.
Процедурные типы обычно используют тогда, когда разработчик из большого числа возможных процедур и функций выбирает те, которые ему необходимы. Обычно в этом случае процедуры или функции помещаются в массив-константу из элементов процедурного типа.
Пример.
program many_fun;
type
func = function (x: real): real;
function f1 (x: real): real;
begin
f1:= x+sin(x);
end;
function f2 (x: real): real;
f2:= sin(x)/(1+sqrt(x))
end;
function f3 (x: real): real;
f3:= x-exp(x);
end;
const
ar_fun: array [1..3];
of func = (f1,f2,f3);
var
x,y: real;
k: integer;
f: func;
begin
writeln (‘Введите х’);
readln (x);
writeln (‘Введите функцию’);
writeln (‘1, y = x+sin(x)’);
writeln(‘2, y= sin(x)/(1-sqrt(x)’);
writeln (‘3, y=x-exp(x)’);
readln(10);
f:=ar_fun[k];
y:=f(x);
writeln(‘Результат’, y);
end.