Пример использования подпрограмм
Поскольку процедурные типы можно использовать в любом контексте, то можно описывать процедуры и функции, параметрами которых являются процедурные переменные. В качестве примера рассмотрим вычисление суммы двух интегралов, причем интеграл вычисляется с использованием подпрограммы по методу трапеций:
.
Вычисление производится по формуле
,
где , ,
количество отрезков разбиения площади интегрирования определяется по заданной точности e = 10-3. Сначала интеграл представляется в виде одной трапеции, потом двух, потом четырех и т.д., то есть шаг интегрирования в каждом цикле уменьшается в два раза.
Program SumInt;
{ Демонстрационная программа на использование функций: вычисление суммы двух интегралов методом трапеций с заданной точностью }
Const EPS=1E-3; { Точность зададим константой }
Type Func=Function(x:real):real; { процедурный тип }
Var SI:Real; { Результат: сумма интегралов }
{ Сначало опишем подпрограммы с использованием дальнего вызова, которые будут передаваться в подпрограмму как параметры }
{$f+}
Function F1(x:real):real;
Begin
F1:=exp(-x)*(x*x+7*x+9)
End;
Function F2(x:real):real;
Begin
F2:=sin(x)*(x*x*x+3)
End;
{$f-}
{ В функцию передаем границы (вещественные) и последовательность вычислений – процедурный тип }
Function IntTrap(A,B:Real;F:Func):real;
Var IntAlt,IntNew, { старое и новое значение интеграла }
H,S,x,
v:real; { вспомогательная переменная }
Begin
H:=B-A;
v:=F(A)+F(B); { для сокращения вычислений }
IntNew:=H/2*v; { Первый интеграл из одной трапеции }
Repeat
IntAlt:=IntNew; { Старим предыдущее значение }
H:=H/2; { Уменьшаем шаг в 2 раза }
S:=0; x:=A;
Repeat
x:=x+H;
S:=S+F(x)
Until x>=B;
IntNew:=H/2*(v+2*S);
Until Abs(IntAlt-IntNew)<EPS; { Проверка, насколько мала разность интегралов, вычисленных с разным шагом }
IntTrap:=IntNew;
End;
{ Раздел операторов – непосредственно сама программа }
Begin
{ Очень важно соблюдать типы и последовательность параметров при обращении к функциям}
SI:=IntTrap(0.0,2.0,F1)+IntTrap(0.0,2.0,F2);
Writeln('Сумма интегралов=',SI:7:3)
End.
Контрольные вопросы
1. Для каких целей применяют подпрограммы?
2. Что такое подпрограмма?
3. Какова общая структура подпрограммы-функции?
4. Что такое формальные параметры, и где они используются?
5. Зачем в заголовке функции указывать ее тип?
6. Когда применяются и как описываются параметры-значения?
7. Когда применяются и как описываются параметры-переменные?
8. Какова общая структура подпрограммы-процедуры?
9. Каковы отличия процедур от функций?
10. Каково должно быть соответствие формальных и практических параметров (аргументов)?
11. Что такое вложенные подпрограммы?
12. Что такое локальные переменные?
13. Что такое глобальные переменные?
14. Какая процедура используется для завершения подпрограммы или всей программы?
15. Что такое «рекурсия»?
16. Где используется рекурсия?
17. Какая директива присутствует в стандартном Паскале?
18. Когда применяется директива external?
19. Когда применяется директива inline?
20. Когда применяется директива assembler?
21. Когда применяется директива interrupt?
22. Когда применяется процедурный тип?
23. Как описывается процедурный тип?
24. В каком режиме выполняется трансляция подпрограмм, присваиваемых процедурной переменной?
Дата добавления: 2016-06-29; просмотров: 1605;