|
По первому тесту выполнил дважды задания. Результат получается правильный (проверял калькулятором). Пишет, что "Задание не проверено" и предлагает повторить. |
Подпрограммы
4.7 Особенности работы с подпрограммами
Рассмотрим ещё несколько способов передачи параметров в подпрограмму.
4.7.1 Параметры-константы
Параметр-константа указывается в заголовке подпрограммы подобно параметру-значению, но перед его именем записывается зарезервированное слово const, действие которого распространяется до ближайшей точки с запятой. Параметр-константа передаётся в подпрограмму как параметр-переменная, но компилятор блокирует любые присваивания параметру-константе нового значения в теле подпрограммы.
В языке Free Pascal можно использовать параметры-переменные и параметры-константы без указания типа, и тогда фактический параметр может быть переменной любого типа, а ответственность за правильность использования того или иного параметра возлагается на программиста.
4.7.2 Процедурные типы
Процедурные типы были разработаны как средство передачи функций и процедур в качестве фактических параметров обращения к другим процедурам и функциям. Для объявления процедурного типа используется заголовок подпрограммы, в котором пропущено её имя. Существует два процедурных типа: тип-процедура и тип-функция:
type
тип_процедура=procedure (список_формальных_параметров );
тип_функция=function (список_формальных_параметров ) : тип;
Кроме того, в программе могут быть объявлены переменные процедурного типа:
var
имя_переменной_1 : тип_процедура;
имя_переменной_2 : тип_функция;
Например:
type Fun1=function ( x, y : real ) : real; Fun2=function : string; Proc1=procedure ( x, y : real; var c, z : real ); Proc2=procedure ( ); var F1, f 2 : Fun1; p1, p2 : Proc1; mass : array [ 1.. 5 ] of Proc2;
Обращаться к переменным процедурного типа следует по их адресу4Операция взятия адреса (п. 2.5.4):
@имя_переменной
Рассмотрим механизм передачи подпрограмм в качестве параметра на примере следующей задачи.
и
.Вычисление и вывод значений осуществляются с помощью функции VivodFunc. Её параметры:
- a и b — границы интервала изменения аргумента функции;
- n — количество точек, на которые будет разбит интервал (a, b);
- ff — имя функции.
type {Описание процедурного типа func.}
func=function ( x : real ) : real;
function VivodFunc ( a, b : real;N: word; ff : func ) : integer;
var
x, y, hx : real;
f : text;
begin
{Шаг изменения переменной x.}
hx :=(b-a )/N;
x:=a;
while ( x<=b ) do
begin
y:= ff ( x );
writeln ( ’ x= ’, x : 5 : 2, ’ y= ’, y : 7 : 2 );
x:=x+hx;
end;
end;
{Определение функций f и g с описателем far.}
function f ( x : real ) : real; far;
begin
f := exp ( sin ( x ) ) * cos ( x );
end;
function g ( x : real ) : real; far;
begin
g:=exp ( cos ( x ) ) * sin ( x );
end;
begin
{Вызов Vivodfunc с функцией f в качестве параметра.}
VivodFunc ( 0, 1, 7, @f );
writeln;
{Вызов Vivodfunc с функцией g в качестве параметра.}
VivodFunc ( 0, 2, 8,@g );
end.
В языке Free Pascal есть возможность использования в качестве формальных параметров массивов функций.
Модифицируем задачу 4.10. Программа, представленная далее, выводит на экран таблицу значений нескольких функций с помощью функции VivodFunc. Здесь в роли параметров функции выступают:
- интервал (a, b);
- количество узлов n интервала (a, b);
- массив функций ff, в которых необходимо вычислить значения;
- количество функций m в массиве ff.
type
func=function ( x : real ) : real;
{В процедуру VivodFunc передается}
{входной параметр ff - открытый массив функций.}
function VivodFunc ( a, b : real;N: word;
ff : array of func; m: word ) : integer;
var
x, y, hx : real;
i : integer;
begin
hx :=(b-a )/N;
{Цикл по всем функциям.}
for i :=0 to m -1 do
begin
x:=a;
while ( x<=b ) do
begin
{Вычисление значения i-й функции в точке x.}
y:= ff [ i ] ( x );
writeln ( ’ x= ’, x : 5 : 2, ’ y= ’, y : 7 : 2 );
x:=x+hx;
end;
writeln;
end;
end;
function f ( x : real ) : real; far;
begin
f := exp ( sin ( x ) ) * cos ( x );
end;
function g ( x : real ) : real; far;
begin
g:=exp ( cos ( x ) ) * sin ( x );
end;
{Описание массива восьми функций fff.}
var fff : array [ 1.. 8 ] of func;
begin
{Запись реальных функций в массив fff.}
fff [ 1 ] : = @f;
fff [ 2 ] : = @g;
{Вызов процедуры.}
VivodFunc ( 0, 1, 7, fff, 2 );
end.
Несколько подпрограмм можно объединять в модуль и затем использовать в других программах. Рассмотрим процесс создания модуля более подробно.