Процедуры без параметров

Чтобы подчеркнуть сходство двух упомянутых условных операторов, запишем программу несколько иначе:

program МАХВ(input, output); var x,y,u,v: real; a,b,s: real; begin read(x,y);

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

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

u: = s;

a:= 0.5; b:=u;

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

v: = s;

writeln('_u=', u, '_v=', v)

end.

В этой программе условные операторы в точности совпадают друг с другом, поэтому можно считать, что один и тот же условный оператор присутствует в программе дважды. Чтобы избежать двукратного выписывания этого оператора в разделе операторов программы, объявим его процедурой, которой дадим имя МАХ2А:

procedure МАХ2А;

begin if a> then s:=a else s:=b end

Для активации этой процедуры в нужном месте программы достаточно там записать оператор процедуры, состоящий только из имени этой процедуры — МАХ2А. С использованием такой процедуры программа примет вид:

program МАХС (input, output);

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

procedure MAX2A;

begin if a> then s:=a else s:=b end;

begin read(x,y);

a:=x+y; b:=x*y; MAX2A; u:=s; a:=0.5; b:=u; MAX2A; v:=s; writeln('_u=', u, 1_v=', v)

end.

Выполнение каждого из фигурирующих здесь операторов процедуры МАХ2А сводится просто к выполнению тела процедуры с этим именем.

Поскольку в данном случае фрагмент текста программы, объявленный процедурой, весьма невелик, то существенного выигрыша в размере общего текста программы мы не получили. Однако если бы этот фрагмент был достаточно большим, то выигрыш был бы очевиден. Но даже и в этом случае основная часть программы — ее раздел операторов — стала более компактной и наглядной по сравнению с предыдущим вариантом программы (с именем МАХВ).

Процедуры с параметрами

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

Введенная процедура МАХ2А не очень удобна для использования, поскольку ее назначение зафиксировано слишком жестко. В частности, исходными данными для нее могут служить только значения переменных а и Ь. Поэтому перед каждым обращением в процедуре приходится предварительно присваивать этим переменным те значения, из которых нужно выбирать большее. Чтобы снять это ограничение и тем самым обеспечить общность процедуры и повысить удобство ее использования, паскаль позволяет не фиксировать те исходные значения, к которым должна применяться процедура, а сделать их параметрами процедуры, которые можно достаточно удобно конкретизировать при каждом обращении к ней.

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

begin if rl>r2 then s:=rl else s:=r2 end

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

procedure МАХ2В (rl,r2: real);

begin if rl>r2 then s:=rl else s:=r2 end

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

Теперь программу можно записать так:

program MAXD (input, output); var x,y,u,v: real; s: real; procedure MAX2B (rl,r2: real);

begin if rl>r2 then s:=rl else s:=r2 end; begin read(x,y);

MAX2B(x+y, x*y); u:=s;

MAX2В(0.5, u); v: = s; writeln('_u=', u, '_v=', v)

end.

Выполнение оператора процедуры MAX2B(x + у, x * у) равносильно выполнению следующего эквивалентного ему блока:

var rl,r2: real; begin rl:=x+y; r2:=x*y;

begin if rl>r2 then s:=rl else s:=r2 end

end

Таким образом, при обращении к процедуре в ней вводятся в употребление свои внутренние переменные, имена и типы которых совпадают с формальными параметрами. Эти переменные существуют только во время выполнения процедуры, после чего они прекращают свое существование. При входе в процедуру этим внутренним переменным присваиваются значения, заданные соответствующими фактическими параметрами в операторе процедуры, — эти значения и используются при выполнении процедуры. Аналогично выполняется и оператор процедуры МАХ2В (0.5, и).

Как видно, теперь в основной программе отпала необходимость вводить в употребление переменные awb,a перед обращением к процедуре присваивать этим переменным соответствующие значения. Благодаря этому раздел операторов в основной программе стал еще более компактным и наглядным.

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

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

procedure МАХ2С (rl,r2: real);

begin if rl>r2 then s:=rl else s:=r2; rl:=0; r2:=0 end

то выполнение оператора процедуры

MAX2C (0.5, u)

было бы равносильно выполнению эквивалентного ему блока:

var rl,r2: real;

begin rl:=0.5; r2:=u;

begin if rl>r2 then s:=rl else s:=r2; rl:=0; r2:=0 end

end

Как видно, операторы rl := 0; r2 := 0 изменяют значения только внутренних для данной процедуры переменных rl и г2, которым первоначально были присвоены значения фактических параметров 0.5 и и, но сами эти фактические параметры не изменяются. А поскольку эти внутренние переменные по окончании выполнения процедуры вообще прекращают свое существование, то их значения (возможно, измененные по ходу выполнения процедуры) никак не могут быть использованы вне процедуры. Отсюда, в частности, следует, что с помощью параметров-значений нельзя представлять те результаты выполнения процедуры, которые должны использоваться вне тела процедуры, в основной части программы.

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ   След >