По первому тесту выполнил дважды задания. Результат получается правильный (проверял калькулятором). Пишет, что "Задание не проверено" и предлагает повторить. |
Подпрограммы
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.
Несколько подпрограмм можно объединять в модуль и затем использовать в других программах. Рассмотрим процесс создания модуля более подробно.