Главная » Free Pascal » Подпрограммы с параметрами процедурного типа Free Pascal

0

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

Для объявления переменных процедурного типа используются конструкции типа заголовков процедур или функций без указания конкретного имени функции или подпрограммы:

var

F : function (x,y:integer): integer;

PS: procedure(const S:String); PV: procedure;

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

function Sum(a,b:integer):integer; begin

Result:=a+b; end;

function Diff(a,b:integer):integer; begin

Result:=a-b; end;

function Mult(a,b:integer):integer; begin

Result:=a*b; end;

Если мы выполним F:=Sum;, то результатом обращения к функции F(i1,i2) будет сумма i1+i2. Если переменной F будет присвоено значение Diff, то резуль- татом обращения к функции F(i1,i2) будет разность i1-i2. После присвоения F:=Mult; функция F(i1,i2) возвратит произведение i1*i2. Таким образом, "пере- менная" F позволяет заменить обращение к нескольким разным функциям, и это расширяет возможности языка программирования подобно тому, как использова- ние обычных переменных предоставляет более широкие возможности, чем упот- ребление констант. В частности, во время выполнения программы можно узнать, какой из функций соответствует текущее значение переменной процедурного типа:

if @F=@Sum then …

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

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

b

y = ò f ( x)dx .

a

Существует довольно много методов приближенного вычисления площади криволинейной трапеции на интервале [a, b], ограниченной кривой y = f(x). Про- стейший их них, известный под названием метода прямоугольников, сводится к разбиению интервала интегрирования на n отрезков (обычно равной длины) и за- мене площади элементарной криволинейной трапеции площадью прямоугольника.

Более качественным является замена площади криволинейной трапеции пло- щадью обычной трапеции

В листинге 9.9 приводится программа вычисления определенного интеграла, в которую включены универсальные функции интегрирования методом прямоуголь- ника (функция prjam) и методом трапеций (функция trap). В качестве подынте- гральной функции выбрана функция f(x)=x. Границы интервала интегрирования [a, b] и количество n элементарных отрезков разбиения вводятся по запросу про- граммы.

Листинг 9.9. Программа integral

program integral; type

fun=function(x : double):double;

var

a,b:double; n:integer;

function prjam(a,b:double;n:integer;f:fun):double; var

h:double;

i:integer; begin

Result:=f(a)+f(b);

h:=(b-a)/n;

for i:=1 to n-1 do Result:=Result+f(a+i*h);

Result:=Result*h;

end;

function trap(a,b:double;n:integer;f:fun):double; var

h:double;

i:integer; begin

Result:=(f(a)+f(b))/2; h:=(b-a)/n;

for i:=1 to n-1 do Result:=Result+f(a+i*h);

Result:=Result*h;

end;

function y(x:double):double; begin

Result:=x; end;

begin

write(‘a = ‘); readln(a);

write(‘b = ‘); readln(b);

write(‘n = ‘); readln(n);

writeln(prjam(a,b,n,y));

writeln(trap(a,b,n,y)); readln;

end.

Результаты ее работы приведены на рис. 9.6 (точное значение интеграла рав- но 0.5).

Рис. 9.6. Вычисление интеграла

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии