7.5. Параметры-значения и параметры-переменные в подпрограммах
Параметры подпрограмм делятся на параметры-значения и параметры-переменные.
Параметр-значение не снабжается спецификацией VAR. Фактическим параметром в этом случае является выражение (в частности, константа или переменная). Значение этого выражения вычисляется один раз, при входе в подпрограмму, и не может быть изменено при выходе из нее.
Параметр-переменная снабжается спецификацией VAR. Фактическим параметром может быть только переменная. Значение этой переменной может изменяться подпрограммой, поэтому параметры-переменные используются для выдачи результата работы процедуры.
Параметрам-значениям при обращении к подпрограмме отводится спе-циальное место в памяти ЭВМ, куда копируется текущее значение парамет-ра. При выходе из подпрограммы это место освобождается.
Параметрам-переменным дополнительного места в памяти не отводится и копирование данных при обращении к подпрограмме не производится. По-этому с целью экономии памяти и времени при передаче подпрограмме боль-ших объемов данных (например, массивов) рекомендуется использовать параметры-переменные даже если не предусматривается их модификация.
7.6. Процедурные типы
Использование подпрограмм в качестве параметров подпрограмм в языке Турбо Паскаль реализовано с помощью процедурного типа. Объявле-ние процедурного типа состоит из заголовка подпрограммы без ее имени, например:
TYPE proc = PROCEDURE (x,y:real; VAR z:integer);
func = FUNCTION (x,y:real) : Boolean;
fupr = FUNCTION (c:char; b:proc; a:func) : real;
Тип proc включает в себя множество процедур с тремя параметрами, первые два из которых - параметры-значения вещественного типа, а третий - параметр-переменная целого типа. Тип func - это множество булевых функ-ций с двумя вещественными параметрами, а тип fupr - множество веще-ственных функций, у которых первый параметр - символьного типа, второй и третий - процедурного.
Продемонстрируем использование процедурного типа.
Пример 7.6.1. Разработать функцию, вычисляющую определенный интеграл от любой функции. Вычислить
.
Для вычисления интеграла используем формулу прямоугольников:
,
где a,b - границы интегрирования; n - количество интервалов интегрирования; h = (b-a)/n - шаг интегрирования. PROGRAM Fint;
TYPE fun = FUNCTION(x:real):real;
FUNCTION Fs(x:real):real; FAR;
BEGIN
Fs:=x*x + 2.4*Cos(x)
END;
FUNCTION Integral(Fx:fun; a,b:real; n:integer):real;
VAR h,sum : real;
k : integer;
BEGIN
sum:=0;
h:=(b-a)/n;
FOR k:=0 TO n-1 DO
sum:=sum + Fx(a+k*h);
Integral:=h*sum
END;
BEGIN
WriteLn('Интеграл = ', Integral(Fs, 1.5, 3.2, 100))
END.
Отметим следующее:
Для того, чтобы подпрограмму можно было использовать в качестве параметра подпрограммы, после ее заголовка в описании необходимо записать служебное слово FAR (дальняя модель вызова);
Cтандартные подпрограммы языка не могут непосредственно исполь-зоваться в качестве параметров подпрогамм.
Задачи
7.6.1. Разработать функцию, определяющую наибольшее значение произвольной функции на отрезке.
7.6.2. Разработать функцию, определяющую размах значений произ-вольной функции на заданном отрезке.
7.6.3. Разработать процедуру, определяющую все корни произвольной функции на заданном отрезке.