Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПРОЦЕДУРЫ И ФУНКЦИИ.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
348.67 Кб
Скачать

Механизм передачи параметров

Как было показано в приведенных выше примерах программ с использованием процедур и функций, в заголовке процедуры или функции может быть задан спи­сок параметров, которые называются формальными. Название "формальные" эти параметры получили в связи с тем, что в этом списке заданы только имена для обо­значения исходных данных и результатов работы процедуры, а при вызове подпро­граммы на их место будут подставлены конкретные значения (выражений) й имен. Этот список указывается после имени подпрограммы и заключается в круглые скобки.

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

  • параметры-значения;

  • параметры-переменные, перед которыми должно стоять служебное слово var и за которыми указывается их тип;

  • параметры-процедуры, перед которыми должно стоять служебное слово procedure;

  • параметры- функции, перед которыми должно стоять служебное слово function и после которых указывается тип значения, возвращаемого функцией в ос­новную программу;

  • нетипизированные параметры, перед которыми должно стоять служебное слово var и отсутствует указание типа.

Параметры-значения

Заголовок процедуры с описанными параметрами-значениями имеет та­кой вид:

procedure MyProc ( Parl, Par2 : Typel; РагЗ, Раг4 : Туре2 );

Механизм работы параметров-значений упрощенно можно представить такой схемой:

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

Параметры-переменные

Заголовок процедуры с описанными параметрами-переменными имеет такой вид:

procedure MyProc ( var Parl, Раг2 : Typel; var РагЗ, Раг4 : Туре2 );

Механизм работы параметров-переменных упрощенно можно предста­вить такой схемой:

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

Параметры-процедуры и параметры-функции. В качестве расширения стандартного Паскаля, Турбо Паскаль позволяет рассматривать процедуры и функции как, объекты, которые можно присвоить переменным и которые могут вы­ступать в качестве параметров; процедурные типы делают это возможным.

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

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

  • Они должны быть объявлены с директивой far (использование дальнего типа вызова подпрограмм) и откомпилированы в состоянии {$F+};

  • Они не должны быть:

    • стандартной процедурой или функцией;

    • вложенной процедурой или функцией;

    • inline процедурой или функцией;

    • interrupt процедурой или функцией.

При использовании параметров-процедур или параметров-функций в списке перед соответствующими формальными параметрами указывается зарезервирован­ное слово procedure или function, например:

procedure Exampl (К,L: integer; var M : real; procedure Prob; function Step: real) ;

В списке формальных параметров процедуры Exampl: К, L — параметры-значения; М — параметр-переменная; Prob — параметр-процедура; Step — параметр-функция, результатом выполнения которой будет значение вещественного типа.

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

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

program Demo_Tabl;

(Описание процедурного типа Func — целой функции двух аргументов целого типа}

type

Func = function(X,X : integer) : integer;

{$F+} {Директива компилятору на использование дальнего типа вызо­ва подпрограмм}

{Описание функции сложения двух целых чисел}

function Add(X,Y : integer) : integer;

begin

Add:=X +Y;

end;

{Описание функции умножения двух целых чисел)

function Mult(X,Y : integer) : integer;

begin

Mult:=X*Y;

end;

{Описание функции умножения суммы на разность двух целых чисел)

function Funny(X,У : integer) : integer;

begin

Funny : = (X+Y) * (X-Y) ,• end;

{$F-}

{Описание процедуры вывода на экран таблицы для двух чисел от 1 до 10, вид арифметической операции задается значением параметра-функ­ции Operation)

procedure Type_Tabl(W,H : integer; Operation': Func);

var

X,Y : integer;

begin

for Y:=l to H do

begin

for X:=l to W do

Write(Operation(X,Y):5);

Writeln;

end;

end;

Begin

{Начало главной программы)

Туре_Таbl(10,10,Add) ; {Вызов процедуры для печати таблицы сло­жения }

Туре_Таbl(10,10,Mult) ; {Вызов процедуры для печати таблицы ум­ножения)

Туре_Таbl(10,10,Funny);{Вызов процедуры для печати таблицы про­изведений суммы чисел от 1 до 10 на их разность)

end.

Примечание. {SF+} — указание (директива) компилятору Турбо Паскаль на использо­вание дальнего (for) типа вызова для корректной обработки вызова процедуры ТуреТаbl параметрами-функциями.

В данной программе процедура ТуреТаbl представляет собой общее действие, выполняемое над параметрами-функциями Add, Mult, Funny. После запуска про­граммы сначала вызывается процедура ТуреТаbl для фактических параметров 10, 10 и Add, в результате чего формальным параметрам X и Y присваиваются значе­ния чисел 10 и 10, а формальному параметру Operation процедурного типа Func присваивается имя фактической функции Add. В результате этого на экран будет выведена таблица сложения от 1 до 10. Затем процедура ТуреТаbl вызывается к исполнению для фактических параметров 10, 10 и'параметра-функции Mult, в ре­зультате чего на экран будет выведена таблица умножения от 1 до 10. Аналогично вызов процедуры Туре_Таbl с параметрами 10, 10 и Funny даст в результате на эк­ране таблицу произведения суммы на разность чисел от 1 до 10.