Использование функций и процедур в качестве параметров, страница 2

После определения процедурного типа появляется возможность описывать переменные и параметры этого типа. Такие переменные называют процедурными переменными.

3. Оформление подпрограмм, передаваемых в качестве параметров. После объявления процедурного типа его можно использовать в описаниях параметров подпрограмм. При этом в программе должны быть запрограммированы и те реальные процедуры и функции, которые будут передаваться как параметры. Их оформление имеет некоторые особенности.

а) Процедуры или функции, которые будут использованы в качестве параметров, должны компилироваться в специальном режиме. Этот режим включается размещением перед текстом подпрограмм директивы компилятора {$F+}, а после текста подпрограмм выключается директивой {$F-}:

{$F+}

Function SE(tt:real):real;

 begin

  se:=Sin(tt)*Exp(tt);

end;

{. . другие подпрограммы, используемые в качестве параметров}

{$F-}

б) нельзя использовать в качестве параметров встроенные функции. При необходимости использования следует составить свою подпрограмму-функцию, переопределяющую встроенную

Function MySin(x:real):real;

Begin

  Mysin:=sin(x);

End;

С учетом сказанного, дополним текст подпрограммы Tabl параметром функционального типа. В тексте программы используем три различные функции и для каждой построим таблицу значений. Конкретная реализация каждой таблицы определяется указанием параметров при вызове подпрограммы Tabl

PROGRAM TablFun3;

{-Вывод на экран таблицы значений функции:

   - с помощью подпрограммы с функциональным параметром

   - использование подпрограммы для нескольких функций}

Uses Crt;

Type  RealFun1= Function(x:real):real;

Var  a,b,h :real;

{$F+}

 Function Alfa(x:real):real;

 begin

  Alfa:=sin(2*x+1)*Cos(x/2);

 end;

   Function NewFun(x:real):real;

   begin

    NewFun:=Exp(-x)*(x*x*x-3*x*x+5*x-1);

   end;

 Function Fun1(x:real):real;

 begin

  Fun1:=sin(2*x)*exp(x);

 end;

{$F-}

Procedure Tabl(a,b,h:real; F:RealFun1);

Var  N,i:integer;   x,y:real;

begin

  N:=Round((b-a)/h);

  Writeln('Таблица значений функции');

  Writeln(' i        x          y');

  Writeln('────────────────────────');

  For i:=0 to N do begin

    x:=a+i*h;  y:=F(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,Fun1);

  Tabl(a,b,h,Alfa);

  Tabl(a,b,h,NewFun);

END.

СОДЕРЖАНИЕ ЗАДАНИЯ

ЗАДАЧА 1. Набрать и выполнить текст программы TablFun1. Убедиться в ее работоспособности.

Выполнить необходимые изменения и дополнения текста программы в соответствии с примером TablFun2. Убедиться в ее работоспособности.

Изменить программу TablFun2 таким образом, чтобы параметры таблицы вводились с клавиатуры с соответствующими пояснениями. Получить на экране таблицу функции для значений a, b, h, выбранных самостоятельно.

ЗАДАЧА 2. Создать новый программный файл, содержащий текст программы TablFun3 (используя предыдущие программы в качестве основы). Убедиться в работоспособности программы.

Включить процедуру Tabl в собственный модуль. Изменить текст программы так, чтобы использовалась процедура Tabl, находящаяся в модуле.

ЗАДАЧА 3. На основе материала предыдущей лабораторной работы составить подпрограмму-процедуру, реализующую автоматический поиск корней нелинейного уравнения, причем параметры a,b,h и имя функции должны быть параметрами процедуры поиска корней. Включить текст процедуры в программу и убедиться в ее работоспособности.

ЗАДАЧА 4. Включить процедуру автоматического поиска корней нелинейного уравнения в собственный модуль. Изменить текст программы так, чтобы использовалась процедура, находящаяся в модуле. Использовать процедуру для поиска корней трех различных нелинейных уравнений (явный вид уравнений получить у преподавателя). Интервалы, содержащие корни, записать в отчет. Учесть, что подпрограммы-функции для всех трех уравнений должны присутствовать в программе. Интервалы, содержащие корни, записать в отчет.

*ЗАДАЧА 5. На основе материала предыдущей лабораторной работы составить подпрограмму-функцию, реализующую вычисление корня нелинейного уравнения с заданной точностью. Границы интервала, содержащего корень, требуемая точность результата и имя функции, определяющей левую часть нелинейного уравнения, являются параметрами функции, вычисляющей корень.

*ЗАДАЧА 6. Включить функцию, реализующую вычисление корня нелинейного уравнения с заданной точностью, в собственный модуль. Изменить текст программы так, чтобы использовалась функция, находящаяся в модуле. Использовать процедуру для вычисления корней трех различных нелинейных уравнений (явный вид уравнений получить у преподавателя). Результаты записать в отчет.

Составил:  Дей Е.А. 2004