ЛАБОРАТОРНАЯ РАБОТА II-1- 05
ИСПОЛЬЗОВАНИЕ ФУНКЦИЙ И ПРОЦЕДУР
В КАЧЕСТВЕ ПАРАМЕТРОВ
Цель работы: изучение принципов использование процедур и функций в качестве параметров при программировании численных методов.
1. Библиотечные подпрограммы и численные методы. Подпрограммы, выполняющие решение часто повторяющихся задач, удобно хранить в собственном модуле. Такие подпрограммы называют библиотечными, а набор подпрограмм (модуль) – библиотекой подпрограмм. Значение библиотечных подпрограмм в том, что их можно использовать затем в новых программах, не тратя время на повторное программирование.
При этом важно таким образом оформить библиотечную подпрограмму, чтобы при использовании ее для решения новой задачи не нужно было переделывать сам текст подпрограммы. Настроить подпрограмму на решение новой задачи можно только с помощью нужных значений ее параметров.
Большинство численных методов направлено на обработку заданных функций и получение значений тех функций, которые неизвестны. Это означает, что при решении новой задачи изменяется вид функции, а в программе – имя функции. Возникает необходимость передачи имени функции (или процедуры) в обрабатывающую подпрограмму в качестве параметра.
Например, программа, реализующая вывод на экран таблицы значений функции, может иметь достаточно простой вид
PROGRAM TablFun1; {Вывод на экран таблицы значений функции}
Uses Crt;
Var N,i :integer; a,b,h :real; x,y:real;
Function Fun1(x:real):real;
begin
Fun1:=sin(2*x)*exp(x);
end;
BEGIN
ClrScr;
a:=1; b:=4; h:=0.2;
N:=Round((b-a)/h);
Writeln('Таблица значений функции');
Writeln(' i x y');
Writeln('────────────────────────');
For i:=0 to N do begin
x:=a+i*h; y:=Fun1(x);
Writeln(i:2,' ',x:8:4,' ',y:8:4);
end;
Writeln('────────────────────────');
Readln;
END.
Для того, чтобы выводить таблицы значений функции и в других программах, оформим необходимые действия в виде подпрограммы-процедуры. В качестве параметров процедуры укажем те переменные, которые можно задавать по-разному для одной и той же функции (пределы a,b и шаг h). В этом случае программа будет иметь следующий вид:
PROGRAM TablFun2; {Вывод таблицы функции с помощью подпрограммы}
Uses Crt;
Var a,b,h :real;
Function Fun1(x:real):real;
begin
Fun1:=sin(2*x)*exp(x);
end;
Procedure Tabl(ta,tb,th:real);
Var N,i:integer; x,y:real;
begin
N:=Round((tb-ta)/th);
Writeln('Таблица значений функции');
Writeln(' i x y');
Writeln('────────────────────────');
For i:=0 to N do begin
x:=a+i*th; y:=Fun1(x);
Writeln(i:2,' ',x:8:4,' ',y:8:4);
end;
Writeln('────────────────────────');
Readln;
end;
BEGIN
ClrScr;
a:=1; b:=4; h:=0.2;
Tabl(a,b,h);
Tabl(0,1,0.1);
Tabl(5,9,0.4);
END.
Отметим, что параметры процедуры имеют свои имена, которые не обязаны совпадать с именами переменных в программе. Но переменные программы, используемые для указания значений параметров при вызове, должны иметь тот же тип, что и параметры подпрограммы.
Процедура Tabl(ta,tb,th) позволяет получать на экране таблицы для любых приемлемых интервалов изменения аргумента с любым шагом. Однако, ее нельзя считать библиотечной процедурой и включать в собственный модуль, потому что она обрабатывает только одну фиксированную функцию. Для обработки другой функции придется изменять строку y:=Fun1(x), что недопустимо для текста подпрограммы, находящейся в модуле.
2. Функциональные и процедурные типы. Язык программирования Турбо-Паскаль позволяет интерпретировать процедуры и функции как элементы, значение которых можно присваивать переменным и передавать в качестве параметров другим подпрограммам. Это особенно важно при программировании алгоритмов обработки функций и численных методов.
При описании параметров необходимо указывать их тип. Так как функциональные типы не являются стандартными, их необходимо описать в программе в разделе Type.
Описание функционального типа во многом совпадает с записью заголовка процедуры или функции, используемой как параметр, но при этом:
- имя процедуры или функции не ставится;
- перечисляются типы параметров;
- имена параметров могут быть произвольными;
Приведем некоторые примеры описаний функционального типа:
Type
RealFunctionType = function(a:real):real;
Proc2Param = procedure(X,Y:integer);
NumericalProc = procedure(N:byte; var x,y:mas);
WorkFun = function(A,B:real;F:MathFunc);
Имена параметров в описании процедурного типа играют чисто формальную роль и могут быть выбраны любыми.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.