При решении многих задач возникает необходимость повторять одни и те же вычисления при различных значениях параметров. При этом для уменьшения размера программ целесообразно выделить эти операторы в отдельную процедуру (подпрограмму). Кроме того, использование процедур и функций позволяет реализовать принципы структурного программирования.
Процедуры используются п тех случаях, когда необходимо в подпрограмме получить несколько результатов. Процедура определяется в разделе описания процедур и функций. Описание процедуры включает в себя заголовок процедуры, разделы описаний (меток констант, типов, переменных, а также дополнительных процедур, являющихся локальными по отношению к описываемой процедуре), тело процедуры. Синтаксическая диаграмма раздела описания процедур и функций приведена на рис. 1.27.
В заголовке процедуры за ключевым словом PROCEDURE указывают имя процедуры, а в скобках — список параметров со своими описаниями.
Имя процедуры выбирается пользователем в соответствии с правилами образования имен. Описание необходимых Шествий в процедуре осуществляется с помощью формальных параметров, которые используются только в теле процедуры и локальны по отношению к ней. Напрцмер, сложение дробей, записанных в общем виде: H/Z = H1/Z1 + Н2/Z2, можно описать процедурой:
|
|
FROCEDURE DROB(VAR H,Z,Hl,H2,Z1,Z2:INTEGER);
BEGIN
H:=H1*Z2+H2*Z1
Z:=Z1-Z2
END
Блок процедуры заканчивается символом - точка с запятой.
Обращение к процедуре осуществляется оператором процедуры; в нем записываются имя процедуры и фактические параметры, которые должны соответствовать формальным по количеству, типу и месту расположения. Оператор записывается в блоке программы.
Пример 1.26. Составить программы для вычисления используя процедуру
Программа имеет вид:
PROGRAM FUN1(INPUT,OUTPUT);
VAR A,B,Z,C,D,T1, T2, T3:REAL;
PROCEDURE TH(VAR X,R:REAL);
VAR E:REAL;
BEGIN
E:=EXP(2.0*X);
R:=(E-1)/(E+1);
END;
BEGIN
READ(A,B);
TH(A, T1);
C:=A-B;
TH(C, T2);
D:=SQR(A)-SQR(B);
TH(D, T3);
Z:=(T1-SQR(T2))/SQRT(T3);
WRITELN(' Z=', Z:10:3);
END.
В программе имеются три оператора обращения к процедуре с фактическими параметрами (A, T1), (С, Т2), (D, ТЗ), d результате получаются промежуточные результаты с именами ТI, Т2, ТЗ, которые применяются в программе.
В тех случаях, когда в процедуре н главной программе используются один и те же имена параметров (процедура связана с главной программой посредством глобальных переменных), процедуру можно организовать без параметров.
Пример 1.27, Составить программу с процедурой без параметров для вычисления полярных координат и по прямоугольным x и y ().
Программа имеет вид:
PROGRAM PREOPR1(INPUT, OUTPUT);
VAR X,Y,R,F:REAL;
I,H:INTEGER;
PROCEDURE FOLAR;
BEGIN
R:=SQRT(X*X-Y*Y);
F:=ARCTAN(Y/X);
END;
BEGIN
|
|
READ (N);
FOR I:=1 TO N DO
BEGIN
READLN(X,Y);
POLAR;
WRITELN (R,F);
END;
END.
Пример 1.28 составить программу с процедурой без параметров для вычисления значений ; где r, f - полярные
координаты вектора с прямоугольными координатами: ; . Программа имеет вид:
PROGRAM PRE0BR2 (INPUT,OUTPUT);
VAR X, Y, R, F, D, S:REAL;
I, H: INTEGER
PROCEDURE FOLAR;
BEGIN
H:=SQiRT(X*X+Y*Y);
F:= ARCTAN(Y/X);
END;
BEGIN
D:=1.0;
S:=0;
READ (N);
FOR I: =1 TO N DO
BEGIN
X:= I/(1+I*I);
Y:=1/I;
FOLAR;
D:=D*R;
S:=S*F;
END;
WRITE (D,S);
END.
Функции представляют собой последовательность операторов, в результате выполнения, которых вычисляется одно значение, присваиваемое имени функции. Синтаксические диаграммы раздела описания функций приведены на рис. 1.27, заголовка функции - на рис. 1.30. Заголовок функции оформляется аналогично заголовку процедуры. В отличие от процедуры в заголовке должен быть определен тип результата, возвращаемого функцией посредством имени функции. Как правило, окончательный результат присваивается в конце тела функции.
Функция может иметь собственные локальные константы, типы, переменные и вспомогательные процедуры и функции.
|
Обращение к функции осуществляется в правой части оператора присваивания, при этом в выражении записывается имя функции и фактические параметры. После выполнения функции вычисленное значение присваивается имени функции и передается в выражение.
Пример 1.29. Составить программу для определения числа сочетаний, используя функцию при вычислении факториала.
Программа имеет вид:
PROGRAM KOL (INPUT,OUTPUT);
VAR NCH, N, M, L:INTEGER;
FUNCTION FACT (K: INTEGER):INTEGER;
VAR P, I:INTEGER;
BEGIN
P: = 1;
FOR I: = 1 TO К DO P:=P*I;
FACT:=P;
END;
BEGIN
READ(N,H);
L:=N-M;
NCH:=FACT(N)/FACT(M)/FACT(L);
WRITELN(‘ЧИСЛО СОЧЕТАНИИ С ИЗ N ПО M =', NCH);
END.
Пример 1.30. Составить программу для решения примера 1.26, используя подпрограмму функцию.
Программа имеет вид:
PROGRAH FUN2 (INPUT i OUTPUT)ж
VAR A, B, Z:REAL;
FUNCTION TH(X:REAL):REAL;
VAR С:REAL;
BEGIN
C:=EXP(2.0*X);
TH:=(C-I)/(C+1);
END;
BEGIN
READ (A,B);
Z:=(TH(A) +SQR(TH(A—B)))/SQRT(TH(A*A-B*B));
WRITE(Z);
END.
При использовании функции число формальных параметров сокращено на один, так как результат вычисления присваивается имени функции. Три обращения к функции записаны, а одном операторе присваивания.
Формальные и фактические параметры в процедурах и функциях обрабатываются аналогично. Каждый параметр помещается в список с указанием типа.
Примеры записи:
PROCEDURE SUMMA (Х, Y,Z:REAL);
PROCEDURE SCALYR (А,B:REAL;N:INTEGER);
PROCEDURE TH (VAR X,R:REAL);
FUNCTION SLED (B:REAL; I,J:INTEGER);
FUNCTION SPOK(A, B, С:BOOLEAN);
Если два или более формальных параметров одного и того же типа указаны последовательно в списке, то их можно объединить в одном описании следующим образом:
PROCEDURE SUMMA (Х:REAL; Y:REAL; Z:REAL);
PROCEDURE SCALYR (А:REAL; B:REAL; N:INTEGER);
PROCEDURE TH (VAR X:REAL; VAR R:REAL);
FUNCTION SLED (B:REAL; I:INTEGER; J:INTEGER);
FUNCTION SPOK(A:BOOLEAN; B:BOOLEAN; С:BOOLEAN);
Формальные параметры можно указывать п списке в любом порядке, а параметры одного типа не обязательно группировать в одном месте. При обращении к процедуре или функции фактические параметры следует записывать е той же последовательности, что и формальные.
При выборе имен в программах, содержащих процедуры, и функции, желательно, чтобы имена локальных и глобальных параметров не совпадали. Это делает программу нагляднее. Правилами определения области действия допускается использование одного имени для глобального н формального параметров. В этом случае глобальный параметр теряет свое значение внутри блока процедуры или функции, так как с этим именем связан локальный параметр