- •Подпрограммы – параметры других подпрограмм
- •ПАСКАЛЬ: ОПИСАНИЕ ПРОЦЕДУР
- •ПАСКАЛЬ: ОПИСАНИЕ ФУНКЦИЙ
- •ПАСКАЛЬ: список формальных параметров подпрограммы
- •В каких задачах используются процедуры- параметры?
- •Средства паскаля для работы с подпрограммами-параметрами
- •Некоторые особенности использования подпрограмм-фактических параметров
- •Пример 1. Решение двух уравнений на отрезке [0,3] c погрешностью 0.0001.
- •Продолжение примера 1
- •Продолжение примера 1
- •Ситуация, в которой рекомендуется использовать глобальные переменные
- •Пример 2: параметр уравнения передается как глобальная переменная; предполагается, что тип fn и
Подпрограммы – параметры других подпрограмм
ПАСКАЛЬ: ОПИСАНИЕ ПРОЦЕДУР
Заголовок; |
|
|
|
procedure ИмяПроцедуры [(CписокФормальныхПараметров)] |
|
|
|
|
|||
Блок |
|
|
|
|
|
|
|
|
|
||
|
|
Описания (Const… Type… Var… |
|
||
|
|
|
|
|
|
|
|
||||
|
|
|
|
процедуры и функции) |
|
|
|
|
|
begin |
|
|
|
|
|
Операторы |
|
|
|
|
|
end; |
|
«вход» и «выход» процедуры
ПАСКАЛЬ: ОПИСАНИЕ ФУНКЦИЙ |
||||
Заголовок; |
function ИмяФункции [(CписокФормалПарам)] :ТипФункции |
|||
Блок |
Описания (Const… Type… Var… |
|||
|
||||
|
процедуры и функции) |
|
||
|
begin |
|
|
|
|
Операторы |
|
|
|
|
ИмяФункции :=результат |
|
||
|
end; |
|
|
|
Не разрешены операторы |
|
Основное выходное значение |
||
накапливания: |
|
|||
вход и неосновные результаты |
||||
ИмяФункции:= ИмяФункции+… |
||||
|
|
ПАСКАЛЬ: список формальных параметров подпрограммы
Секция1; Секция2;...;СекцияN Секция имеет вид:
[VAR] CписокПеременных :Тип;
если VAR имеется, то передача по ссылке (параметр-переменная); иначе
– по значению (параметр-значение)
стандартный или имя нестандартного
Секция
параметров-значений параметров-переменных параметров-подпрограмм
В каких задачах используются процедуры- параметры?
•Использование параметра-подпрограммы необходимо, когда некоторый алгоритм, описанный как подпрограмма, применим к множеству алгоритмов, каждый из которых также задается подпрограммой.
•Классические примеры таких ситуаций дают численные методы. В подпрограммах численных методов (вычисления определенного интеграла, нахождения экстремумов и нулей функций, вывода графиков, линий уровня, таблиц функций) обрабатываемые функции задаются как параметры.
•Средства для использования параметров- подпрограмм имеются во всех алгоритмических языках, предназначенных для решения вычислительных задач (СИ, Фортран, MatLab).
Средства паскаля для работы с подпрограммами-параметрами
•Процедура-формальный параметр должна быть описана с помощью ранее объявленного процедурного (функционального) типа. При объявлении этого типа описывается структура заголовка подпрограммы, т.е. дается заголовок без имени подпрограммы. Примеры процедурных типов:
TYPE PROC1=PROCEDURE(a,b,c:real; var d:integer); FUNC1=FUNCTION : REAL;
G=FUNCTION (x,y,z:real);
•Подпрограмма-фактический параметр должна соответствовать процедурному типу формального параметра, т.е. иметь такой же заголовок с точностью до обозначений.
Некоторые особенности использования подпрограмм-фактических параметров
•Имена стандартных подпрограмм нельзя использовать в качестве фактических параметров.
Function sn(x:real):real; begin sn:=sin(x) end;
•В языках Borland Pascal и Turbo Pascal подпрограммы, используемые как фактические параметры, должны компилироваться с использованием "дальней модели памяти" , поэтому в программу надо включить директивы компилятора {$F+} и {$F-} или поставить стандартную директиву far (для версий начиная с Turbo Pascal 6.0) cразу за заголовком подпрограммы.
Пример 1. Решение двух уравнений на отрезке [0,3] c погрешностью 0.0001.
program primer2_5;
Type fn=function(x:real):real;{функциональный тип, задающий вид уравнения}
Var r1,r2:real; {коpни уpавнений}
{$F+} {опция дальнего вызова, в Object Pascal не надо} 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 не надо }
Продолжение примера 1
{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;
Продолжение примера 1
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.