Описание и вызов процедур и функций

Структура описания процедур и функций до некоторой степени похожа на структуру Паскаль - программы: у них также имеются заголовок, раздел описаний и исполняемая часть. Раздел описаний содержит те же подразделы, что и раздел описаний программы: описания констант, типов, меток, процедур, функций, переменных. Исполняемая часть содержит собственно операторы процедур. Формат описания процедуры имеет вид:

procedure имя процедуры (формальные параметры);

раздел описаний процедуры

Begin

исполняемая часть процедуры

end;

Формат описания функции:

function имя функции (формальные параметры): тип результата;

раздел описаний функции

Begin

исполняемая часть функции

имя функции:=результат;

end;

Формальные параметры в заголовке процедур и функций записываются в виде:

var имя параметра: имя типа;

и отделяются друг от друга точкой с запятой. Ключевое слово var может отсутствовать для входных параметров, а для выходных должен быть обязательно. Если параметры однотипны, то их имена можно перечислять через запятую, указывая общее для них имя типа. При описании параметров можно использовать только стандартные имена типов, либо имена типов, определенные с помощью команды Type вызывающей программы.

Список формальных параметров может отсутствовать.

Вызов процедуры производится оператором, имеющим следующий формат:

имя процедуры (список фактических параметров );

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

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

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

имя функции:= результат;

При вызове процедур и функций необходимо соблюдать следующие правила:

- количество фактических параметров должно совпадать с количеством формальных;

- соответствующие фактические и формальные параметры должны совпадать по порядку следования и по типу.

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

Глобальные – это те константы, типы и переменные, которые объявлены в программе вне описания процедуры и функции и до их описания. Они доступны вызывающей программе и вызываемой подпрограмме.

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

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

var

x,y,m,n:integer;

procedure MaxNumber(a,b:integer;var max:integer);

{в заголовке процедуры a,b-входные параметры, max-выходной параметр};

begin {начало процедуры}

if a>b then max:=a еlse max:=b;

end;{конец процедуры}

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

write('Введите х,у ');

readln(x,y);

MaxNumber(x,y,m);{формальный параметр a-получает значение х, b- получает значение y при вызове процедуры, m- получает значение результата из процедуры через параметр max};

MaxNumber(2,x+y,n);

writeln('m=', m, 'n=', n);

end. {Конец основной программы}

Аналогично задачу, но уже с использованием функций, можно решить так:

var x,y,m,n:integer;

function MaxNumber(a,b:integer):integer;

var max:integer;

begin {начало функции}

if a>b then max:=a else max:=b;

MaxNumber:=max;

{имя функции получает значение результата целого типа};

end; {конец функции}

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

write('Введите х,у ');

readln(x,y);

m:=MaxNumber(x,y);

{в основной программе результат функции копируется в переменную m};

n:=MaxNumber(2, x+y);

writeln('m=', m, 'n=', n);

end.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: