Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глава9.doc
Скачиваний:
1
Добавлен:
16.04.2019
Размер:
252.42 Кб
Скачать

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 будут выполнены аналогично.