Подпрограммы
Нередко при проектировании алгоритмов можно выявить похожие и повторяющиеся его участки, выполняющие некоторую типичную операцию. Например, такой операцией может быть ввод-вывод или сортировка массива. Язык Pascal позволяет каждый раз по мере необходимости повторять в программе набор операторов, который позволяет выполнять такие действия. Однако есть более элегантное решение. Оно состоит в использовании подпрограмм – имеющих свой самостоятельный и законченный смысл участков программного кода, описанных отдельно от основной программы и вызываемых по мере необходимости.
Подпрограммы в языке Pascal представлены функциями (Function) и процедурами (Procedure). Функции, в отличие от процедур, возвращают некоторое значение и могут быть вызваны при вычислении выражения.
Для придания подпрограммам универсальности предусмотрен механизм передачи параметров. Параметры – данные, при помощи которых конкретизируются действия при каждом вызове подпрограммы. Например, функция cos(X)
позволяет рассчитать значение косинуса от конкретного углового значения. Само же угловое значение передаётся в качестве параметра X.
Синтаксис объявления подпрограмм в языке Pascal схож с синтаксисом описания основной программы и представлен ниже:
<заголовок подпрограммы>
[Const <описание_констант>;]
[Type <описание_типов>;]
[Var <описание_переменных>;]
Begin
<Операторы_тела_подпрограммы>;
End;
В секциях Const, Type и Var объявляются константы, типы и переменные, используемые только внутри подпрограммы. Если эти идентификаторы заняты некоторыми внешними объектами, объявленными на уровне программы, то внешние объекты становятся недоступными. В этом случае говорят о конфликте имён или перекрытии объектов программы по идентификатору.
Если переменные основной программы объявлены до описания подпрограмм, то они являются глобальными. Глобальные переменные и константы доступны также и для операторов в теле подпрограммы. Однако следует помнить, что использование глобальных переменных для передачи данных в подпрограмму (в обход параметров) снижает её универсальность и может стать причиной возможных ошибок, трудно диагностируемых в процессе отладки.
Заголовок процедуры и функции представлен ниже:
Procedure <Идентификатор> [(<параметры>)];
Function <Идентификатор> [(<параметры>)] : <тип>;
Параметры в обоих случаях являются необязательным элементом синтаксиса. Если же возникла необходимость их описания, применяют запись, состоящую из элементов следующего вида:
[var] <идентификатор> : <идентификатор_типа>
и разделённых точкой с запятой.
Каждый из параметров является псевдопеременной, доступной как на чтение, так и на запись в любом операторе подпрограммы. Отличие от простой переменной состоит в том, что к моменту начала выполнения подпрограммы параметры проинициализированы значениями, которые им переданы из вызывающей программы.
Указание слова var означает, что данный параметр является ссылкой на переменную. Все изменения его значения, произошедшие в ходе выполнения подпрограммы, передаются в вызвавшую программу.
Следует обратить внимание на то, что при указании типа можно указывать лишь его идентификатор. Если требуется передать значение пользовательского или сложного типа, то требуется предварительно объявить идентификатор этого типа в секции type основной программы.
Если несколько параметров имеют одинаковый статус «var» и тип, допустимо их группировать в пределах одной записи, например,
Procedure PutPoint(X,Y,Z:Real; Var A,B:Integer);
При описании функции следует учитывать, что в ней присутствует доступная только на запись псевдопеременная, одноимённая с функцией. Возвращаемое функцией значение должно быть присвоено этой псевдопеременной.
При вызове подпрограммы из основной программы следует записать её идентификатор, за которым в скобках перечислить выражения или переменные, соответствующие по типу и порядку ранее объявленным параметрам.
<Идентификатор> (<выражение1>,…,<выражениеn>);
В момент вызова произойдёт вычисление значений выражений, проверка соответствия типов и подстановка этих значений параметрам подпрограммы в порядке их перечисления в заголовке.
Если параметр является переменным, то есть, объявленным со словом Var, то он может быть связан только с переменной того же типа.