Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
выш.мат. методичка.DOC
Скачиваний:
32
Добавлен:
13.02.2015
Размер:
1.71 Mб
Скачать

10.3.6. Параметры-процедуры и параметры-функции

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

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

Для параметров-процедур и параметров-функций существуют те же правила, что и для других переменных процедурного типа: подпрограммы должны компи­лироваться с ключом {$F+} или иметь директиву far, не должны быть стан­дартными подпрограммами, не должны объявляться внутри других подпрограмм, не иметь директив inline или interrupt.

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

Program Example;

type

Func = function(X,У:Integer):Integer;

{$F+}

function Аdd(Х,У: Integer):Integer;

Аdd:= Х + У;

end;

function Multiplay(Х,У: Integer):Integer;

Multiplay := Х*У

end;

{$F-}

procedure РrintTable(A, В: Integer; Ореrаtion: Func);

{процедура печати таблицы}

var i, j: integer;

begin

for i:=1 to A do

begin

for j:=1 to B do

Write(Operation(i,j):5);

WriteLn

end;

WriteLn

end;

begin {начало основной программы}

РrintTable(10, 10, Add);

РrintTable(10, 10, Multiplay)

end

10.4. Процедура еxit

Как указывалось раньше, оператор GОТО нельзя использовать для досрочного выхода из подпрограммы. В Turbo Pascal с этой целью использу­ется процедура Ехit.

Пример. Функция, определяющая первое отрицательное число в массиве.

Function Minus(var Massiv; N:integer): Real;

{Маssiv - параметр без типа}

tyре Т = аrrау[1..1000] оf Reа1;

vаr i: Integer;

begin

Minus:=0;

for i:=1 to N do

if(Маssiv)[i]<0 then {преобразование типа}

begin

Мinus:= Т(Маssiv)[i];

Ехit {досрочный выход из функции}

end

end;

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

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

10.5.1. Директива forward

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

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

Пример. Процедура First вызывает процедуру Second, а та, в свою очередь процедуру First

рrocedure First(А, В: Integer); forward; {заголовок первой процедуры}

рrocedure Sесоnd(С:Rеа1); {вторая процедура}

var X, У: Integer;

begin

:

First(X,Y);

:

end;

рrосеdure First; {первая процедура}

vаr Z: Rеа1

begin

:

Second(Z);

:

end;

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