Структура подпрограммы-процедуры




Структура подпрограммы-процедуры с параметрами имеет вид

PROCEDURE <имя> (<формальные параметры>);

{ раздел описания (метки, константы, типы, переменные) }

BEGIN

{ операторы подпрограммы }

END;

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

Пример программы для вычисления второй и четвертой степеней числа:

PROGRAM PROS;

VAR X, Y, A, A2, A4: INTEGER; {A – исходная переменная,

A2 - A2, A4 - A4, глобальные переменные}

PROCEDURE STEP24; {процедура без параметров}

BEGIN

A2:=A*A;

A4:=A2*A2;

WRITELN(A:5, A2:5, A4:6);

END;

BEGIN {основная программа}

READ(Y, X);

WRITELN('Число; квадрат; куб');

A:= X;

STEP24; {вызов подпрограммы}

A:= Y;

STEP24; {вызов подпрограммы}

END.

Любой из формальных параметров процедуры может быть либо парамет­ром-значением, либо параметром-переменной. Формальному параметру-зна­чению (обычно для задания исходных данных) может соответствовать фактический параметр - константа, переменная или выражение. Параметру­ переменной может соответствовать только переменная. Обычно параметры-­переменные используются для передачи результатов в вызывающую програм­му. Параметрам-переменным в заголовке функции должно предшествовать слово VAR.


Пример: PROCEDURE P(Y, X: REAL; VAR Z1, Z2: REAL);

где Y, X - параметры-значения, Z1, Z2 - параметры-переменные.

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

Чем меньше параметров объявлено параметрами-переменными и чем меньше используется глобальных переменных, тем меньше возможность по­лучения непредвиденных программистом побочных эффектов в программе.

При наличии одноименных переменных в программе и подпрограмме в подпрограмме будут доступны только локальные переменные.

Передача в подпрограмму массивов и строк

Передача одиночных элементов массивов при вызове подпрограммы не отличает­ся от передачи в неё простых переменных. При передаче всего массива рекомендуется пред­варительно определить его тип, поскольку он не является стандартным. Например:

TYPE ATYPE = ARRAY[1..10] OF REAL;

PROCEDURE R(A: ATYPE);

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

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

PROCEDURE R(A: ARRAY[1..10] OF REAL);

Пере­дача в подпрограмму строки осуществляется аналогичным образом, поскольку строка является фактически массивом из её символов.

Пример описания и передачи строковых переменных:

TYPE INTYPE = STRING[10];

ONTYPE = STRING[30];

FUNCTION R(A: INTYPE): ONTYPE;

Рекурсия в программе

Рекурсия - это способ организации вычислительного процесса, при котором подпрограмма в ходе выполнения своих операторов обращается сама к себе.

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

PROGRAM REKURS;

VAR N: INTEGER;

PROCEDURE REVERS(M: INTEGER);

BEGIN

WRITE(M MOD 10);

IF (M DIV 10)<>0 THEN REVERS(M DIV 10);

END;

BEGIN

READ(N);

REVERS(N);

END.

В ходе выполнения программы процедура рекурсивно обращается сама к себе и выводит на экран при каждом обращении очередную цифру.

Рекурсия может быть прямой или косвенной. В первом случае модуль подпрограммы содержит оператор вызова этой же подпрограммы. Во втором случае один модуль (например, А) вызывается из другого модуля (напри­мер, В), а модуль В – из А. Поскольку по правилам языка каждый иденти­фикатор перед объявлением должен быть описан, то необходимо выполнить опережающее описание подпрограммы В. Для этого объявляется заголовок процедуры В, за которым следует служебные слово FORWARD. Теперь из процедуры А можно обращаться к процедуре В. Например:

PROCEDURE B(I:BYTE); FORWARD;

PROCEDURE A(J:BYTE);

BEGIN

...

B(J);

END;

PROCEDURE B(I:BYTE);

BEGIN

...

A(I);

END;

Вложенные подпрограммы

В разделе описаний любой подпрограммы могут встречаться описания других подпрограмм, тогда говорят, что одна подпрограмма вложена в другую.

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

Переменные, описанные в разделе описания основной программы, на­зываются глобальными. Область действия глобальных переменных - основ­ная программа и ее подпрограммы.

Имена называются нелокальными, если они описаны не в самой подпрограмме, а в охватывающем ее блоке (или во внешней подпрограмме).

Все имена в пределах подпрограммы должны быть уникальными и не могут совпадать с именем самой подпрограммы. При входе в подпрограмму низшего уровня становятся доступными не только объявленные в ней име­на, но и сохраняется доступ ко всем именам внешних уровней.

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

Процедуры EXIT и HALT

Процедура EXIT; осуществляет выход из программного модуля - под­программы или основной программы. Из подпрограммы управление передает­ся этой процедурой в вызывающую программу к следующему за ее вызовом оператору. В программе EXIT приводит к завершению ее работы.

Процедура HALT(Cod); прекращает выполнение программы, вызывает в случае необходимости подпрограмму завершения и осуществляет выход в операционную систему. Cod - необязательный параметр, определяющий код завершения программы.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-06-11 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: