Материал: Алгоритмический язык Turbo Pascal 7.0. Юршин Е.Д., Рог А.И

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

соответствовали количеству и типам фактических параметров в момент обращения к процедуре.

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

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

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

Очень важно знать, что любой формальный параметр процедуры может быть либо параметромзначением, либо параметром-переменной, либо параметром-константой. Если параметры определяются как параметры-переменные, то перед ними необходимо ставить описатель var, а если это параметры-константы, то – описатель const.

Procedure_zet (var_a:real; b:real; const_с: integer);

Здесь:

aпараметр-переменная; b – параметр-значение;

спараметр-const;

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

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

Если же формальный параметр объявлен, как параметр-значение или параметр-константа, то при вызове ему могут соответствовать произвольные математические выражения. Контроль за неукоснительным соблюдением этого правила осуществляется компилятором TURBO PASCAL.

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

Если формальный параметр определен, как параметр-значение, то перед вызовом процедуры это значение либо вычисляется, либо вводится с помощью оператора read, а затем передается в процедуру, при этом в головной программе (при передаче) остается «копия» данного значения.

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

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

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

Следует отметить, что в этом случае в распоряжении программиста всегда есть и нижеизложенный способ передачи данных через глобальные переменные. Однако злоупотребление такими глобальными переменными делает программу запутанной, трудной в понимании и очень сложной в отладке. Поэтому в соответствии с требованиями стандартов технологии программирования рекомендуется там, где это возможно использовать передачу данных через фактические параметры – переменные, но с другой стороны описание всех параметров переменных нежелательно по двум причинам:

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

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

Рассмотрим конкретный пример на составление процедуры (без головной программы). Пусть

необходимо оформить в виде отдельной процедуры алгоритм вычисления степени:

yxn

снатуральным (целочисленным) показателем степени n. Такая задача возникает в связи с тем, что на

языке

TURBO PASCAL нет такой стандартной операции, в соответствующей библиотеке (см. таблицу набора стандартных функций); хотя с помощью стандартных функций LN(x) и EXP(x) можно реализовать такую функцию. Сейчас же рассмотрим другой вариант программной реализации такого алгоритма, т.е. вычисление такой степени, можно осуществить, используя выражение: xn

y = = х*х*х…х

n раз

Для вычисления указанного произведения необходимо организовать цикл с параметром i, в котором осуществлялось бы постепенное накопление произведения Y по следующему алгоритму: до начала цикла должно быть (иначе - умножение на ноль) Y=1 и затем на каждом цикле значение Y должно изменяться следующим образом, для (i=1,2,…,n)- y:=y*x;

Таким образом, шаг изменения цикла должен быть равен 1 и будет осуществлен N раз. В результате реализации такого алгоритма в виде отдельной программной единицы, оформленной в виде процедуры по вышеприведенным правилам, процедура будет выглядеть следующим образом:

Procedure_step1 (n:integer; x:real; Var y:real); Var

i:integer;

Begin

y:=1; for_i:=1_to_n_do y:=y*x;

End;

В заголовке данной процедуры с именем step1 перечислены формальные параметры – значения N и X, определяющие исходные данные процедуры (фактические же числовые значения они должны получить из головной программы). И параметр – переменную y – результат работы процедуры, значение которой «уходит» в головную программу. В рассматриваемом заголовке также указан тип этих параметров. Так как переменная i находится в процедуре и ее значение не уходит в головную программу (местные переменные), поэтому она должна быть описана с помощью оператора var. Тело процедуры состоят из:

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

2.составного оператора begin-end, реализующего выше изложенный алгоритм вычисления степени.

Выше было отмечено, что процедуру иногда

оформляют и без параметров (с указанием ее имени), тогда другой вариант такой процедуры будет выглядеть следующим образом:

Procedure_step2;

Var

i:integer;

Begin

Источник: https://studfile.net/preview/16565609/