Алгоритм решения задачи проектируется путем декомпозиции всей за- дачи в отдельные подзадачи. Обычно подзадачи реализуются в виде подп- рограмм.
Подпрограмма - это последовательность операторов, которые опреде- лены и записаны только в одном месте программы, однако их можно вызвать для выполнения из одной или нескольких точек программы. Каж- дая подпрограмма определяется уникальным именем. В языке ПАСКАЛЬ су- ществуют два типа подпрограмм - процедуры и функции.
Процедура и функция - это именованная последовательность описаний и операторов. При использовании процедур или функций ПАСКАЛЬ - прог- рамма должна содержать текст процедуры или функции и обращение к про- цедуре или функции. Тексты процедур и функций помещаются в раздел описаний процедур и функций.
Процедура может содержать такие - же разделы описаний, что и ПАС- КАЛЬ - программа, а именно: разделы описания модулей, меток, конс- тант, типов, переменных, процедур и функций.
ПЕРЕДАЧА ИМЕН ПРОЦЕДУР И ФУНКЦИЙ В КАЧЕСТВЕ ПАРАМЕТРОВ. Во многих задачах, особенно в задачах вычислительной математики, необходимо пе- редавать имена процедур и функций в качестве параметров. Для этого в 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
по методу Симпсона. Вычисление подинтегральной функции реализовать с помощью функции, имя которой передается как параметр. Значение опре- деленного интеграла по формуле Симпсона вычисляется по формуле:
где 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.