double arrow

Параметры и переменные в подпрограммах

 

Параметры, описанные в подпрограммах, могут иметь любой тип. Следует различать формальные и фактические параметры. Параметры, описанные в заголовке подпрограммы при ее определении, называются формальными. Например, Procedure Sort(A:integer; B:real, var S:real); А, В и S – формальные параметры.

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

Например, SORT(A1,B1,S1); – А1, В1 и S1 – фактические параметры – значения переменных.

SORT(14,25); – 14 и 25 – фактические параметры – непосредственные значения;

SUM; – фактические параметры не указаны, т.к. в вызываемой процедуре нет формальных параметров.

Когда параметры передаются по значениям, формальный параметр является переменной, локальной в блоке. Фактический параметр может быть любым выражением, переменной или идентификатором того же типа, что и соответствующий ему формальный параметр. Такие параметры называются параметрами-значениями. Их главная отличительная черта заключается в том, что изменение формального параметра не влечет за собой изменения фактического. Если же любое изменение формального параметра влечет за собой изменение фактического, то такие параметры называются параметрами-переменными. Для их описания служит зарезервированное слово Var.

Между фактическими параметрами в операторе вызова процедуры и формальными параметрами в заголовке описания процедуры устанавливается взаимнооднозначное соответствие в результате их перебора слева направо. Количество и тип формальных параметров соответственно равны количеству и типу фактических параметров.

Если процедура возвращает в программу какие-то значения, соответствующие переменные должны быть описаны как параметры-переменные с использованием слова Var.

Например, Procedure One(X:integer; var Y:real);

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

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

Например, Procedure One(X:integer; var Y:real);

Begin

Y:=X*Sin(X);

End;

Вызов: One(2.5, Z);

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

Различные особенности описания процедур и способы их использования рассмотрим на примере следующей задачи [3].

Пример 1. По задаваемым вещественным значениям x и y вычислить

U = max(x+y, x*y), V = max(0.5, U).

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

Program Max_А;

Var x,y,u,v:real;

Begin

Writeln('Введите x,y');

Readln(x,y);

If x+y>x*y Then U:=x+y Else U:=x*y;

If 0.5>U Then V:=0.5 Else V:=U;

Writeln('U=',U:3:1,' V=',V:3:1);

End.

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

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

1. Каждый идентификатор должен быть описан перед тем, как он будет использован.

2. Областью действия идентификатора является блок, в котором он описан.

3. Идентификаторы в блоке должны быть уникальными.

4. Один и тот же идентификатор может быть по-разному определен в каждом отдельном блоке.

5. Если процедура или функция пользователя совпадает по имени со стандартной процедурой или функцией, то будет выполняться подпрограмма пользователя, а стандартная игнорироваться (Sin, Cos).

Процедура без параметров. Обратимся к условию примера 1 и, чтобы подчеркнуть сходство двух условных операторов, запишем программу иначе:

...

a:=x+y; b:=x*y;

If a>b Then S:=a Else S:=b;

U:=S;

a:=0.5; b:=U;

If a>b Then S:=a Else S:=b;

V:=S;

...

Таким образом, условные операторы If a>b Then S:=a Else S:=b; полностью совпадают друг с другом, то есть один и тот же условный оператор присутствует в программе дважды. Объявим его процедурой.

Procedure Max_1A;

Begin

If a>b Then S:=a Else S:=b;

End;

Для вызова этой процедуры в нужном месте программы достаточно записать оператор процедуры Max_1A.

Программа с этой процедурой выглядит следующим образом:

Program Max_B;

Var x,y,u,v,a,b,s:real;

(********************************)

Procedure Max_1A;

Begin

If a>b Then S:=a Else S:= b;

End;

(********************************)

Begin

Writeln(‘Введите x,y');

Readln(x,y);

a:=x+y; b:=x*y;

Max_1A; U:=S;

a:=0.5; b:=u;

Max_1A; V:=S;

Writeln('U=',u:3:1,' V=',v:3:1);

End.

В этой программе переменные a, b, x, y, U, V, S описаны как глобальные и используются и в основной программе, и в подпрограмме-процедуре.

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

Program Max_C;

Var x,y,u,v:real;

(****************************************)

Procedure Max_2A(a,b:real;var s:real);

Begin

If a>b Then S:=a Else S:= b;

End;

(****************************************)

Begin

Writeln(' Введите x,y');

Readln(x,y);

Max_2A(x+y,x*y,U);

Max_2A(0.5,U,V);

Writeln('U=',u:3:1,' V=',v:3:1);

End.

Здесь переменные x, y, U, V описаны как глобальные и, являясь фактическими параметрами при обращении к процедуре Max_2A, используются только в основной программе. Параметры a, b, S – формальные и используются при описании процедуры, причем, параметры а и b – параметры-значения, S – параметр-переменная.


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



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