Алгоритмический язык Pascal |
Процедуры и функцииПрактически во всех алгоритмических языках имеется возможность программирования функций и процедур - блоков операторов, оформленных в виде подпрограмм. Разработка функций и процедур необходима при многократном использовании в разных местах программы или в нескольких программах блока операторов, выполняющих однотипные действия, например, расчет значений сложной функции при различных значениях аргумента. В Турбо - Паскале имеется также возможность создавать библиотеки (модули), состоящие из специальных процедур и функций, отличных от поставляемых в пакете ( модули 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<=x<=x2, при N<=100 и равномерной разбивке диапазона. type r_1000= array[1. . 1000] of real; { задается тип r_1000 } var Z: r_1000; x1, x2: real; n: word; Procedure Mas_Y(var Y:r_1000; x1,x2:real; n:word); {Y - параметр-перемен-ная} var i: word; x, dx: real; { локальные параметры } begin If (n>1000) or (n<2) then begin writeln('Длина массива >1 и не должна превышать 1000'); Readln; Halt end; i:=0; x:=x1; dx:=(x2-x1)/(n-1); { dx - шаг изменения аргумента } If dx<= 0 then begin writeln('x2 должно быть больше x1'); Readln; Halt end; While x |
Нет комментариев. Оставить комментарий: |