Главная страница / 29. Структурное программирование: 29.6. Подпрограммы, проце...

29.6. Подпрограммы, процедуры и функции

Навигация по разделу:

29.6.1. Основные понятия и терминология
29.6.2. Локальность
29.6.3. Параметры процедуры

29.6.1. Основные понятия и терминология

↑ Наверх

Часто некоторую последовательность инструкций требуется повторить в нескольких местах программы. Чтобы программисту не приходилось тратить время и усилия на копирование этих инструкций, в большинстве языков программирования предусматриваются средства для организации подпрограмм. Таким образом, программист получает возможность присвоить последовательности инструкций произвольное имя и использовать это имя в качестве сокращенной записи в тех местах, где встречается соответствующая последовательность инструкций. Такую именованную последовательность инструкций будем называть процедурой. Если процедура дает одно результирующее значение и, следовательно, может использоваться в выражениях, то такая процедура называется функцией. Определение сокращенной записи называется описанием процедуры или описанием функции. Использование этого сокращения в программе называется оператором процедуры или вызовом процедуры. Функция, если она встречается в выражении, называется указателем функции, или обращением к функции [21].

Пример. Описание и оператор процедуры

Для последовательности инструкций

t := r; r := q; q := t

можно ввести сокращение, описав процедуру следующим образом:

procedure P;
begin t: = r; r := q; q := t end

И теперь всякий раз, когда в программе встречается эта последовательность инструкций, ее можно заменить оператором процедуры P. Описание процедуры состоит из двух частей: заголовка процедуры и тела процедуры. Заголовок (первая строка) содержит идентификатор процедуры. Тело (вторая строка) состоит из одной или нескольких инструкций, для которых вводится сокращение.

29.6.2. Локальность

↑ Наверх

Если объект (константа, переменная, процедура, функция или тип) имеет смысл только в пределах некоторой части программы, то этот объект называется локальным. В таком случае этой части программы можно присвоить имя (т. е. оформить ее как процедуру). Локальные объекты процедуры описываются в ее заголовке.

Пример. Описание процедуры с описанием локальной переменной

procedure P;
var t: integer;
begin t := r; r := q; q := t end;

В теле процедуры используются объекты двух сортов: локальные (в примере – t) и нелокальные объекты. Последние определены в контексте, являющемся средой для описания процедуры. Если они определены в главной программе, то такие объекты называются глобальными; если же они определены в самом языке (т. е. в контексте, в который «погружается» программа), то они называются стандартными объектами [21]. Областью существования локального объекта является весь текст процедуры. Это означает, что после окончания процесса, описанного процедурой, пространство в памяти, занятое локальными переменными, становится снова свободным и его можно использовать для других переменных. Очевидно, при повторном вызове той же самой процедуры значения ее локальных переменных снова не определены, точно так же как они не были определены при первом вызове процедуры.

При идентификации локальных объектов существенно то, что мы можем выбирать их имена вне зависимости от среды. Главную программу удобно рассматривать как процедуру без имени. Ее средой является операционная система вычислительной машины, где предварительно определены все стандартные объекты. Таким образом, ясно, почему идентификаторы можно выбирать, не считаясь со стандартными именами. Если стандартный объект не используется в программе, то употребление (случайное или преднамеренное) его идентификатора в качестве имени локального объекта не вызовет каких-либо нежелательных эффектов [21].

29.6.3. Параметры процедуры

↑ Наверх

Если некоторая последовательность операций применяется к различным операндам в разных частях программы, то такая последовательность оформляется как процедура, а ее операнды становятся параметрами.

Идентификаторы, введенные в заголовке процедуры для обозначения операндов, называются формальными параметрами.

Они используются только в теле процедуры и локальны по отношению к ней.

Объекты, подставляемые вместо формальных пapaметров при вызове процедуры, называются фактическими параметрами.

Они задаются в каждом операторе процедуры или указателе функции. Тип фактического параметра определяется типом формального параметра, который специфицируется в заголовке процедуры. Помимо спецификации типа параметра необходимо также указать желаемый способ подстановки, поскольку вместо формального параметра можно подставить текущее значение либо имя фактической переменной или выражение. Наиболее часто используют два способа подстановки параметров.

  1. Фактический параметр вычисляется, и полученное значение подставляется вместо соответствующего формального параметра. Этот способ называется подстановкой значения и имеет наибольшее распространение.
  2. Фактический параметр есть переменная. Определенная таким образом переменная заменяет соответствующий формальный параметр. Этот способ называется подстановкой переменной (ссылки) и используется в тех случаях, когда параметр вычисляется в процедуре и является ее результатом.

Пример. Описание процедуры с параметрами

var a, b: integer; //глобальные переменные
procedure P(var r,q: integer); //формальные параметры-переменные r,q; они же – локальные переменные процедуры
var t: integer; //локальная переменная
begin t := r; r := q; q := t end;
begin
P(a,b);
//Вызов процедуры с фактическими параметрами a,b
end

В этом примере приведено описание процедуры P с двумя формальными параметрами-переменными r, q и локальной переменной t. Эта процедура вызывается в разделе операторов, и на места формальных параметров подставляются по ссылке (по адресу) глобальные переменные a, b. При выполнении кода процедуры операции будут выполняться над переменными a, b. Поэтому после еe завершения результат её работы останется в переменных a, b. Они обменяются значениями.

При вызове функции, ей передаются в качестве фактических параметров копии значений глобальных переменных a,b. Результат работы функции при первом вызове будет выведен на монитор, при втором – сохранeн в глобальной переменной s.

Ниже приведен пример функции с двумя формальными параметрами-значениями n, p.

img295c