Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2361

.pdf
Скачиваний:
1
Добавлен:
15.11.2022
Размер:
1.46 Mб
Скачать

Следует отметить, что с примерами процедур и функций мы уже сталкивались – это стандартные процедуры ввода и вывода данных, оформленные следующими операторами: READ, READLN, WRITE, WRITELN, а также набор стандартных функций. В этом случае стандартными они называются потому, что созданы одновременно и совместно со всеми элементами системы TURBO PASCAL и является ее неотъемлемой частью. Таким образом, в TURBO PASCAL имеется много стандартных процедур и функций. Наличие такой так называемой библиотеки готовых программных заготовок существенно облегчает разработку прикладных инженерных программ. Однако в большинстве случаев многие специфичные для данной прикладной программы действия не находят прямых аналогов в библиотеке TURBO PASCAL и тогда программисту приходится разрабатывать свои нестандартные процедуры и функции. Данные нестандартные процедуры и функции необходимо обязательно описать в начале программы, чтобы компилятор мог установить связь между оператором вызова и теми действиями, которые приводят к процедуре или функции.

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

Procedure_{имя}_(список параметров);

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

– перечень имен через запятую для обозначения исходных данных и результатов работы процедуры с

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

Procedure_com (a:real; b:integer);

Как видно, параметры в списке отделяются точкой с запятой. Если имеется несколько следующих друг за другом однотипных параметров, то их можно отделить запятыми:

Procedure_com (a:real; b:real; c:real);

Можно записать проще:

Procedure_com (a, b, c:real);

Что касается следующего за заголовком блока, то он должен состоять из раздела описаний (war) и раздела операторов, заключенным в операторные скобки beginend. Заканчиваться блок должен стоящий слева на End и точкой с запятой.

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

<какой-либо оператор> <имя процедуры> <список фактических параметров>;

В то же время вызов процедуры можно осуществить без оператора, указав в нужной точке программы имя процедуры, например:

<имя процедуры>< список фактических параметров>

В данном случае в качестве фактических параметров могут выступать конкретные числовые значения, переменные (последние переменные должны в головной программе получить числовые значения, например с помощью оператора read или арифметического оператора присваивания) или арифметическое выражение, которое в результате вычисления должно получить конкретное числовое значение.

Таким образом, из изложенного ясно, что фактические параметры реализуются в головной программе, а формальный в процедуре. Сам механизм замены формальных параметров позволяет нужным образом настроить алгоритм, реализованный в процедуре. TURBO PASCAL «следит» за тем, чтобы количество и тип формальных параметров строго соответствовали количеству и типам фактических параметров в момент обращения к процедуре.

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

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

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

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

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

Здесь:

a – параметр переменной; b – параметр значения; с – параметр const;

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

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

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

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

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

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

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

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

передачу данных через фактические параметры – переменные, но с другой стороны описание всех параметров переменных нежелательно по двум причинам:

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

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

С учѐтом последнего обстоятельства, взяв за основу процедуру Step1, составим структурную схему общего алгоритма возведения в степень (головная программа - процедура):

структурную схему вышеприведенного алгоритма возведения в степ Рассмотрим конкретный пример на составление процедуры без головной программы. Пусть необходимо оформить в виде отдельной процедуры алгоритм вычисления степени:

yxn

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

x x x x

Такая задача возникает в связи с тем, что на

языке

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

вычисление такой степени, nможно осуществить,

используя выражение: y=

x

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. Теже процедуры состоят из:

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

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

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

Procedure_step2;

Var

i:integer;

Begin

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

End;

где x и y – глобальные параметры;

В данном случае процедура STEP2 не содержит списка формальных параметров и работает только с локальной переменной i, описанной в данной процедуре, а переменные x, n и y обязательно должны быть описаны в основной программе с помощью описателя var. В последующем случае такие переменные x, n и y называются глобальными (общими) по отношению к процедуре step2, т.е. значения глобальных переменных могут быть доступны как для головной программы, так и для самой процедуры.

Данные два варианта процедур для одного и того же алгоритма рассмотрим в составе головной программы. С этой целью осуществим заменим имена переменных n- на m, x- на a и

y- на z. Т.е. в процедуре y, x и n- формальные параметры, а

z, a и m- фактические параметры головной программы. Кроме того, исходя из того, что показатель степени может быть нулевым, положительным и отрицательным, выражение возведения в степень запишем более подробно:

 

1, если m 0;

 

 

 

 

 

z am

am , если m

0;

 

 

 

 

 

 

1

, если m

0;

z

a

m

1

 

 

 

 

 

 

 

am

 

 

am

 

здесь

 

 

При написании программы необходимо составить ень:

Полезно также привести структурную схему алгоритма процедуры возведения в степень (например

STEP1):

 

НАЧАЛО

 

 

Ввод a,m

 

да

m=0

нет

z:=1

 

m>0

STEP1

STEP1

-m, 1/a, z

(m, a, z)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]