Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
программирование на паскале2.doc
Скачиваний:
144
Добавлен:
31.03.2015
Размер:
935.94 Кб
Скачать

2.5. Использование подпрограммы в качестве параметра другой подпрограммы

Использование параметра-подпрограммы необходимо, когда некоторый алгоритм, описанный как подпрограмма, применим к множеству алгоритмов, каждый из которых также задается подпрограммой.

Классические примеры таких ситуаций дают численные методы. В подпрограммах численных методов (вычисления определенного интеграла, нахождения экстремумов и нулей функций, вывода графиков, линий уровня, таблиц функций) обрабатываемые функции задаются как параметры. Средства для использования параметров-подпрограмм имеются во всех алгоритмических языках, предназначенных для решения вычислительных задач (СИ, Фортран, ПЛ/1).

В рассматриваемых версиях Паскаля процедура-формальный параметр должна быть описана с помощью ранее объявленного процедурного (функционального) типа. При объявлении этого типа описывается структура заголовка подпрограммы, т.е. дается заголовок без имени подпрограммы. Примеры процедурных типов:

TYPE PROC1=PROCEDURE(a,b,c:real; var d:integer);

FUNC1=FUNCTION : REAL;

G=FUNCTION (x,y,z:real);

Подпрограмма-фактический параметр должна соответствовать процедурному типу формального параметра, т.е. иметь такой же заголовок с точностью до обозначений.

Замечания

  1. Имена стандартных подпрограмм нельзя использовать в качестве фактических параметров.

  2. В языках BorlandPascalиTurboPascalподпрограммы, используемые как фактические параметры, должны компилироваться с использованием "дальней модели памяти" , поэтому в программу надо включить директивы компилятора {$F+} и {$F-} или поставить стандартную директиву far (для версий начиная сTurboPascal6.0) cразу за заголовком подпрограммы.

Пример 1.Решение двух уравнений на отрезке [0,3] c погрешностью 0.0001.

program primer2_5;

Type fn=function(x:real):real;{функциональный тип, задающий

вид уравнения}

Var r1,r2:real; {коpни уpавнений}

{$F+} {опция дальнего вызова, в ObjectPascalне надо}

function fx1(x:real):real; {fx1 задает первое уравнение}

begin

fx1:=1.0/(1.2*sin(x)/cos(x)+sqrt(x+1));

end;

function fx2(x:real):real; {fx2 задает второе уравнение}

begin

fx2:=(exp(-x)-sqrt(exp(x))+3.7)/3.0;

end;

{$F-} { В Object Pascal не надо }

{root– подпрограмма вычисления корня}

{уравнения fx(x)=0 на [a,b] c погрешн.е методом простых итераций}

function root(fx:fn; a,b,e:real):real;

{fx - функция – формальный параметр}

var x,x0:real;

begin

x0:=(a+b)/2; x:=fx(x0);

while abs(x-x0)>e do

begin

x0:=x; x:=fx(x0);

end;

root:=x;

end;

begin

r1:=root(fx1,0,3,1.0e-4);{fx1 - функция - факт. параметр}

r2:=root(fx2,0,3,1.0e-4);{fx2 - функция - факт. параметр}

writeln('Коpень пеpвого уpавнения r1=',r1:7:4);

writeln('Коpень втоpого уpавнения r2=',r2:7:4);

end.

Пример 2. Предположим, что функцияrootрешения уравнения из примера 1 является библиотечной подпрограммой и не подлежит изменению. Пусть надо решить уравнение, заданное с точностью до параметраp,например, p задается вводом:

xp cosx=0.

В программе надо обратиться к root, подставив вместо формального параметраfxфактический

g(x,p)= xp cosx.

Но g имеет два аргумента, аfx один. Выход из этой ситуации состоит в том, чтобы параметрр считать глобальным. Программа решения уравнения приведена ниже; предполагается, что типfn и функцияrootимеются в подключенной к программе библиотеке.

Varp{глобальная переменная для функцииg},

E{погрешность решения уравнения},A,B{границы отрезка}:real;

function g(x:real):real;

begin

g:=x-p*cos(x)

end;

begin

writeln(‘Введите p,A,B,E’);

readln (p,A,B,E );

writeln(‘ корень уравнения равен ‘,root(g,A,B,E));

readln

end.