
9.3.1. Параметры-значения
Эти параметры способны выполнять роль только входных параметров процедуры. Они могут принимать значения фактических параметров, изменять их в ходе выполнения процедуры, но вернуть значения изменённых параметров в главную программу с их помощью нельзя.
Описание параметров-значений в заголовке процедуры выглядит так:
имя1, имя2, ... : t1; имя3, имя4, ... : t2; ...
где имя1, имя2, имя3, имя4, ... - имена параметров; t1, t2 - типы параметров.
Для каждого формального параметра-значения резервируется память ЭВМ, в которую при вызове процедуры копируется значение соответствующего фактического параметра, после чего всякая связь между фактическими и формальными параметрами обрывается. Если фактическим параметром является выражение, то оно предварительно вычисляется.
Далее эти копии обрабатываются процедурой, причем фактические параметры будут существовать только в течение времени ее выполнения.
Пример 9.2
Используя процедуру, вычислить площадь треугольника со сторонами a, b и c. Для решения задачи воспользоваться формулой Герона s = (p*(p‑a)*(p-b)*(p-c))1/2, где p - полупериметр треугольника.
Алгоритм главной программы
Алгоритм подпрограммы
program example92;
var
a, b, c : real ;
procedure tr (ab, bc, ca : real );
var p, s : real;
begin
p := (ab + bc + ca) / 2;
s
:= sqrt (p * (p - ab) * (p - bc) * (p - ca));
writeln ('s= ', s:6:2)
end;
begin
readln (a, b, c);
tr (a, b, c); { оператор вызова процедуры }
end.
Глобальные переменные a, b и c, описанные в главной программе, используются в операторе вызова процедуры в качестве входных фактических параметров.
Они согласуются с формальными параметрами ab, bc и ca процедуры по числу, типу и взаиморасположению в своих списках.
Следовательно, при вызове процедуры её формальный параметр ab примет значение фактического параметра a, параметр bc значение параметра b, а параметр ca значение параметра c.
Как формальные параметры-значения, так и переменные p и s, описанные в разделе var процедуры, являются локальными переменными и главной программе недоступны. Поэтому вывод результата счёта-переменной s предусмотрен не в главной программе, а в процедуре.
Значения глобальных переменных a, b и c после выполнения процедуры останутся неизменными.
9.3.2. Параметры-переменные
Для того, чтобы процедура могла не только изменить значения передаваемых ей параметров, но и возвратить их новые значения в главную программу, в заголовке процедуры нужно объявить соответствующие им формальные параметры переменными, поставив перед ними ключевое слово var :
var имя1, имя2, ... : t;,
где имя1, имя2, ... - имена параметров; t - тип параметров.
Используя формальные параметры-переменные, процедура получает доступ непосредственно к тем ячейкам памяти, где находятся значения фактических параметров. Достигается это тем, что в процессе обращения к процедуре в ячейки памяти, соответствующие формальным параметрам-переменным, записываются не копии значений фактических параметров, а адреса ячеек памяти, в которых эти фактические параметры находятся.
При использовании формального параметра-переменной процедура сначала определяет адрес, по которому нужно обратиться, а затем считывает данное, содержащееся в ячейке с этим адресом. Таким образом, и главная программа и процедура используют одни и те же ячейки памяти, что и делает возможной передачу результатов счета из процедуры в главную программу.
Описанный способ передачи параметров, называемый передачей по ссылке, делает невозможным использование констант и выражений в качестве фактических параметров. Ими могут быть только переменные.
Пример 9.3
Используя процедуру tr, вычислить поверхность треугольной пирамиды, если известны длины ее ребер a, b, c, d, e и f.
program example93;
var
a, b, c, d, e, f, s1, s2, s3, s4 : real ;
procedure tr (ab, bc, cd : real ; var s : real );
var
p : real ;
begin
p:=(ab + bc + cd ) / 2;
s:=sqrt (p * (p - ab) * (p - bc) * (p - cd))
end;
begin
readln (a, b, c, d, e, f);
tr (a, b, c, s1); tr (a, d, e, s2);
tr (b, e, f, s3); tr (c, f, d, s4);
write ('поверхность равна ', s1 + s2 + s3 + s4)
end.
В
главной программе предусмотрены четыре
обращения к процедуре tr
(по числу граней пирамиды). Список её
формальных параметров состоит из трёх
локальных переменных (параметры-значения
ab,
bc,
cd)
и одной глобальной (параметр-переменная s).
При первом обращении к процедуре в ячейку s будет записан адрес переменной s1, а в ячейки ab, bc и cd значения переменных a, b и c. Результат выполнения процедуры (площадь треугольника со сторонами a, b и c) будет записан в ячейку s1, адрес которой процедура найдёт в ячейке s.
Таким образом, главная программа получит доступ к результату, вычисленному в процедуре, и использует его в вычислении площади поверхности пирамиды. После выполнения процедуры значения переменных ab, bc и cd будут «забыты».
Остальные обращения к процедуре tr будут выполнены аналогично.