Процедуры и функции
Практически во всех алгоритмических языках имеется возможность программирования функций и процедур - блоков операторов, оформленных в виде подпрограмм. Разработка функций и процедур необходима при многократном использовании в разных местах программы или в нескольких программах блока операторов, выполняющих однотипные действия, например, расчет значений сложной функции при различных значениях аргумента. В Турбо - Паскале имеется также возможность создавать библиотеки (модули), состоящие из специальных процедур и функций, отличных от поставляемых в пакете ( модули System, Crt, Graph).
Процедуры (подпрограммы) и функции, определяемые программистом, приводятся в разделе описания основной программы. Процедуры и функции имеют заголовок, раздел описания и раздел операторов.
Заголовок процедуры состоит из служебного слова
Procedure, имени процедуры и списка параметров,
например:
Procedure Name_P(p1, p2,...: "тип"; Var p3, p4,...: "тип";...);
Заголовок функции состоит из служебного слова Function, имени функции и списка параметров, кроме того указывается тип возвращаемого функцией значения,
например:
Function Name_F("список формальных параметров"):"тип результа-та";
Здесь:
Function и
Procedure - служебные слова,
Name_F, Name_P - имена функции и процедуры соответственно,
p1, p2 - имена формальных параметров-значений,
p3, p4 - имена формальных параметров-переменных,
. . . - многоточие означает возможность перечисления большего числа параметров.
В дальнейшем, если не оговаривается особо, все сказанное к процедуре относится также и к функции.
Тип возвращаемого функцией значения может быть простым, строковым или типом-указателем. Тип формальных параметров может быть любым, но должен указываться только идентификатором (именем типа). Таким образом, имя типа формального параметра - массива должно быть задано предварительно в операторе Type, например: Type M= array[1..100]of real; Затем тип массива может указываться в заголовке процедуры, например: Procedure Name_P(p: M); Тип формальных параметров описывается только в заголовке процедуры. Список формальных параметров может отсутствовать, например. процедура Randomize; не имеет параметров.
Если в результате выполнения нескольких операторов получается одно значение переменной, то эти операторы можно включить в описание функции. Например, функция Sin(x); возвращает значение, которое присваивается переменной Y:=sin(x); (эта, и другие стандартные функции описаны в модуле System, который подключается к программе автоматически).
Если в результате выполнения нескольких операторов производится некоторое действие или расчет нескольких переменных, то эти операторы лучше включить в описание процедуры. Например, процедура ClrScr; из модуля CRT очищает экран.
Вызов процедуры осуществляется в разделе выполнения основной программы или других процедур (вложенные процедуры). Программа (процедура) внутри которой вызывается другая процедура называется внешней по отношению к вызываемой процедуре.
При вызове процедуры вместо формальных параметров подставляются фактические параметры, значения которых используются в процедуре.
Например:
Name_P(p11, p22,..., p33, p44,...); - вызов процедуры Name_P,
Y:= Name_F("список фактических параметров"): - вызов функции Name_F,
Здесь:
p11, p22, . . . - имена или значения переменных,
p33, p44, . . . - имена переменных, значения которых возвращаются в программу.
Y - переменная, которой присваивается значение возвращаемое функцией.
Типы соответствующих формальных и фактических параметров должны совпадать, а имена могут совпадать или быть различными. Вместо параметров-значений можно подставлять имена переменных, значения переменных или выражения, вместо параметров-переменных подставляются имена переменных. Функция и параметры-переменные возвращают во внешнюю программу значения, полученные после окончания работы функции или процедуры. Изменения параметров-значений в процедуре носит локальный характер, во внешней программе соответствующие фактические параметры не изменяются. Если не требуется передавать во внешнюю программу новые значения, то следует использовать параметры-значения, а не параметры-переменные.
В процедуре можно использовать локальные метки, константы и переменные, описав их в разделе описания процедуры. Локальные имена не должны совпадать с именами формальных параметров, а их значения не передаются во внешнюю программу. Метки, константы и переменные, описанные во внешней программе раньше, чем сама процедура, называются глобальными по отношению к вызываемой процедуре. Если локальные и глобальные имена совпадают, то в процедуре используются локальные значения, а во внешней программе - глобальные значения, т. е. локальные и глобальные идентификаторы независимы. Если имя глобальной переменной уникально (в процедуре не описывается переменная с таким же именем) и ее значение в процедуре изменяется, то оно изменяется и во внешней программе. Вызывая в программе процедуру программист использует ее имя и параметры не анализируя, а часто и не зная содержимого процедуры. Поэтому в целях универсальности процедур следует все значения в процедуру передавать через список параметров, а переменные внутри процедуры описывать, т. е. делать их локальными.
Приведем пример процедуры вывода на экран визитной карточки программиста.
Program NP_1;
Var
Dat, Fam: string; { Fam: глобальная переменная }
Procedure VIZ(D_R :string); { D_R - формальный параметр }
Var
S_t: string;{ S_t: локальная переменная }
Begin
Writeln('| --------------------------------------------- |');
Writeln('| Разработчик программы:', Fam:14,' |');
Writeln('| |');
Writeln('| г. Анжеро-Судженск ', D_R:14,' |');
Writeln('| Телефон: 2-99-76 |');
Writeln('| ----------------------------------------------|');
Write(' Комментарий: ');
Readln(S_t)
end;
Begin
Fam:='И.И.Иванов';
Dat:='06.12.95'; {Dat - фактический параметр}
VIZ(Dat); { вызов процедуры }
Readln;
END.
Если процедура описана в другом файле с именем, например, F_PR. pas, то ее можно подключить к программе, указав в разделе описания директиву:
{$I F_PR. pas}
Приведем пример использования стандартных процедур модуля DOS для вывода текущей даты и времени:
uses DOS; { подключение модуля DOS }
Procedure Date_Time;
var y, m, d, d_w:word; h, min, sec, hund: word;{локальные параметры }
begin
GetDate(y,m,d,d_w); {вызов процедуры DOS, возвращающей параметры даты }
GetTime(h,min,sec,hund); { процедура, возвращающая параметры времени }
writeln('сегодня: ' );
writeln('_':10, d, ' число');
writeln('_':10, m, ' месяц');
writeln('_':10, y, ' год' );
writeln('день недели: ', d_w ); { d_w= 0 - воскресенье, и т. д. }
writeln('Время: ' );
writeln('_':6, h, ' часов' );
writeln('_':6, min, ' минут' );
writeln('_':6, sec, ' секунд' ); readln
end;
Begin
Date_Time
end.
В практических задачах часто пишутся процедуры, возвращающие значения элементов массивов. Приведем пример процедуры расчета "N" значений функции, например, Y= 4*Sin(x)+7*Cos(x); в заданном диапазоне x1
.