Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мет_Паскаль_5_6.doc
Скачиваний:
4
Добавлен:
09.11.2019
Размер:
228.86 Кб
Скачать

Процедура exit

Оператор GOTO нельзя использовать для досрочного выхода из подпрограммы. В Паскале для этого используется процедура Exit. Рассмотрим функцию нахождения первого отрицательного элемента массива (см. пример 11).

Пример 11:

function Minus(var Mass) : Real;

var

I : Integer;

begin

for I := 0 to High(Mass) do

if Mass[i] < 0 then begin

Minus := Mass[i];

Exit;

end;

end;

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

Рекурсивные процедуры и функции

В Паскале допускается, чтобы подпрограмма вызвала саму себя (рекурсивное обращение). Эта возможность связана с тем, что при каждом новом обращении к подпрограмме параметры, которые она использует, заносятся в стек, причем параметры предыдущего обращения также сохраняются.

Достоинство рекурсии: в ряде случаев более компактное оформление.

Недостаток: опасность переполнения стека (возрастает объем используемой памяти).

Пример 12:

Program Test;

var

N : Byte;

function Factorial(N : Byte) : LongInt;

begin

if N in [0,1] then Factorial := 1

else Factorial := N * Factorial(N-1);

end;

begin

write('N:');

readln(N);

writeln('N!=',Factorial(N));

end.

В примере 12 реализована рекурсивная функция для вычисление факториала числа.

Директивы подпрограмм

Директивы дают дополнительную информацию транслятору о размещении подпрограмм и условиях компиляции. Рассмотрим только одну из директив - директиву forward.

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

Сначала записывается полный заголовок первой подпрограммы. Тело этой подпрограммы заменяется директивой forward. Затем полностью описывается вторая подпрограмма, а после этого и первая. Причем для последней можно использовать сокращенный заголовок – только слово procedure или function и ее имя.

Пример 13:

Program Test;

var

A, B : Integer;

procedure First(A, B : Integer); forward;

procedure Second(C : Real);

var

X, Y : Integer;

begin

….

First(X, Y);

….

end;

procedure First;

var

Z : Real;

begin

Second(Z);

end;

begin

First(A, B);

end.

В примере 13 процедура First вызывает Second, а Second в свою очередь – First, поэтому здесь необходимо использовать директиву forward.

Директиву forward можно использовать и просто для более удобного размещения подпрограмм: сначала описать все заголовки, а затем – сами подпрограммы. Директиву forward нельзя использовать для подпрограмм, объявленных в интерфейсе модуля.