Алгоритм решения  задачи проектируется путем декомпозиции всей задачи в отдельные подзадачи. Обычно подзадачи реализуются в виде подпрограмм.

   Подпрограмма - это последовательность операторов,  которые определены и   записаны  только  в  одном месте программы,  однако их можно вызвать для выполнения из одной или нескольких точек программы.  Каждая подпрограмма определяется уникальным именем. В языке ПАСКАЛЬ существуют два типа подпрограмм - процедуры и функции.

   Процедура и  функция - это именованная последовательность описаний и операторов.  При использовании процедур или функций ПАСКАЛЬ - программа должна содержать текст процедуры или функции и обращение к процедуре или функции.  Тексты процедур и функций  помещаются  в раздел описаний процедур и функций.

{}

   Процедура может содержать такие - же разделы описаний,  что и ПАСКАЛЬ - программа,  а именно:  разделы описания модулей,  меток, констант, типов, переменных, процедур и функций.

{}

   ПЕРЕДАЧА ИМЕН ПРОЦЕДУР И ФУНКЦИЙ В КАЧЕСТВЕ ПАРАМЕТРОВ.  Во многих задачах, особенно в задачах вычислительной математики, необходимо передавать имена процедур и функций в качестве параметров.  Для этого в TURBO PASCAL   введен новый тип данных - процедурный или функциональный, в зависимости от того, что описывается.

   Описание процедурных и функциональных типов производится в разделе описания типов:

   type

         FuncType = Function(z: Real): Real;

         ProcType = Procedure (a,b: Real; var x,y: Real);

   Функциональный и процедурный тип определяется как заголовок процедуры и функции со списком формальных параметров, но без имени. Можно определить функциональный или процедурный тип без параметров,  например:

   type

         Proc = Procedure;

   После объявления процедурного или функционального типа  его  можно использовать для  описания  формальных параметров  - имен процедур и функций.

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

   Пример. Составить программу для вычисления определенного интеграла

                tk

                       2t

             I= S--------------- dt

                   sqrt(1-sin2t)

                tn

по методу Симпсона. Вычисление подинтегральной функции реализовать с помощью функции, имя которой передается как параметр. Значение определенного интеграла по формуле Симпсона вычисляется по формуле: 

      ISimps=2*h/3*(0.5*F(A)+2*F(A+h)+F(A+2*h)+2*F(A+3*h)+...

                                               +2*F(B-h)+0.5*F(B)) 

где A и B - нижняя и верхняя границы интервала интегрирования,

    N - число разбиений интервала интегрирования,

    h=(B-A)/N, причем N должно быть четным.

 

Program INTEGRAL;

 type

    Func= function(x: Real): Real;

 var

    I,TN,TK:Real;

    N:Integer;

{$F+}

 Function Q(t: Real): Real;

   begin

     Q:=2*t/Sqrt(1-Sin(2*t));

   end;

{$F-}

 Procedure Simps(F:Func; a,b:Real; N:Integer; var INT:Real);

   var

      sum, h: Real;

      j:Integer;

   begin

     if Odd(N) then N:=N+1;

     h:=(b-a)/N;

     sum:=0.5*(F(a)+F(b));

     for j:=1 to N-1 do

       sum:=sum+(j mod 2+1)*F(a+j*h);

       INT:=2*h*sum/3

   end;

 begin

   WriteLn(' ВВЕДИ TN,TK,N');

   Read(TN,TK,N);

   Simps(Q,TN,TK,N,I);

   WriteLn('I=',I:8:3)

 end.