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

2361

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

Для более эффективного программирования (минимум строк) подобные повторения необходимо оформить в виде подпрограмм (процедур).

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

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

Ссылка к подпрограмме осуществляется по соответствующим правилам, изложенным ниже.

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

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

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

ПРОЦЕДУРЫ

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

Для наглядности это можно проиллюстрировать следующим рисунком:

ОСНОВНАЯ (ГОЛОВНАЯ) ПРОГРАММА

ВЫЗОВ ПРОЦЕДУРЫ

ПРОЦЕДУРА

ПРОДОЛЖЕНИЕ ПРОГРАММ

.

.

.

END

Рис. 4.2.5. Схема взаимосвязи головной программы и

процедуры.

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

Следует отметить, что с примерами процедур и функций мы уже сталкивались – это стандартные процедуры ввода и вывода данных, оформленные следующими операторами: 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);

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

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

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

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

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

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

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

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

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

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

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

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

Очень важно знать, что любой формальный параметр процедуры может быть либо параметромзначением, либо параметром-переменной, либо параметром-константой. Если параметры определяются как параметры-переменные, то перед ними необходимо ставить описатель 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

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