Параметры и переменные в подпрограммах
Параметры, описанные в подпрограммах, могут иметь любой тип. Следует различать формальные и фактические параметры. Параметры, описанные в заголовке подпрограммы при ее определении, называются формальными. Например, 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 – параметр-переменная.
Дата добавления: 2019-02-07; просмотров: 436;