Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие Алгоритмизация и программирование.doc
Скачиваний:
57
Добавлен:
11.03.2015
Размер:
796.67 Кб
Скачать

28. Процедурные и функциональные типы

TP позволяет рассматривать процедуры и функции как объекты, которые могут быть присвоены переменным или переданы в качестве параметра подпрограммам. Такие переменные должны иметь процедурный или функциональный тип. Далее будем называть любой из этих типов процедурным. Описание процедурного типа представляет собой описание заголовка подпрограммы, но без указания имени подпрограммы, например:

Type proс=procedure; {тип используется для процедур без параметров }

swap_proс =procedure(var a,b:real);

math_func =function(x:real):real;

Имена параметров играют только иллюстративную роль. Можно описывать переменные процедурных типов, компоненты структурированных типов могут иметь процедурные типы. Например,

Var f:math_func;

f_arr: array[1..3] of math_func;

psw: swap_proс;

p_sort2: procedure (var x, y:real);

Для совместимости по присваиванию процедурных типов необходимо, чтобы подпрограммы имели одинаковое количество параметров, соответствующие параметры имели тождественные типы и типы возвращаемых функциями значений были одинаковыми. Процедурный тип по сути является ссылочным типом, его значениями являются адреса кодов подпрограмм. Переменной процедурного типа может быть присвоено значение уже инициализированной другой переменной или имя подпрограммы. Имя подпрограммы рассматривается как константа процедурного типа. Для обеспечения совместимости по присваиванию процедура или функция, если ее нужно присвоить переменной или передать в качестве параметра подпрограмме, должна удовлетворять следующим условиям:

  1. компилироваться с дальним типом вызова ( {$F+} );

  2. не должна быть вложенной;

  3. не должна быть стандартной;

  4. не должна быть процедурой прерывания или типа inline.

Для обеспечения первого условия перед описанием подпрограммы или подпрограмм можно указать директиву компилятора {$F+}, а после описания {$F} (пример 1), или после заголовка подпрограммы указать директивуFAR(пример 2).

Если стандартную подпрограмму нужно передать в качестве параметра или присвоить переменной, то требуется создать некоторую «надстройку» (пример 2).

Пример 3. Программа нахождения корней трех уравнений на промежутке [a,b] с точностью:

Type t_math_func=function (x:real):real;

var f: array[1..3] of t_math_func;

a,b,eps:real;

i:byte;

function root(a, b, eps: real; f:t_math_func):real;

{функция нахождения корня уравнения f(x)=0 методом половинного деления}

var c: real;

begin

while abs(ba)> eps do

begin

c:=(a+b)/2;

if f(a)*f(c)<0 then b:=c else a:=c;

end;

root:=(a+b)/2

end;

{$F+}

function f1(x: real): real;

begin f1:=sin(x) 0.1

end;

function f2(x: real): real;

begin f2:= sin(x)/cos(x)+0.1

end;

function f3(x: real): real;

begin f3:= exp(x) 1/2

end;

{$F-}

Beginwrite(‘Введите промежуток и точность’);

read(a,b,eps);

f[1]:=f1; f[2]:=f2; f[3]:=f3;

for i:=1 to 3 do

writeln(‘Уравнение ‘, i, ‘: x=’, root(a, b, eps, f[i]))

end.

29. Модули в tp

TP содержит библиотеку подпрограмм, которая хранится в файле turbo.tpl. Все подпрограммы разбиты на несколько групп, называемых модулями. В каждом модуле содержатся описания констант, типов, переменных, процедур и функций. Один из модулей, модульGraph, находится в отдельном файлеGraph.tpu.