Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Три способа записи повторяющихся команд
Можно выделить 3 способа записи повторяющихся в программе команд: циклы, макро (макросы)(макрокоманды)(открытые подпрограммы) и обычные подпрограммы (закрытые подпрограммы). Если повторяющиеся команды располагаются в теле программы в одном месте, компактно (одна за другой), то можно (нужно) свернуть повторяющиеся действия в цикл (если для повторяющихся действий удалось найти обобщенную запись). S: = x1 + x2 + x3 +... s: =x1; s: =s+x2; s: =s+x3; for i: =1 to n do ........... s: =s+xi;
Если повторяющиеся действия сильно разнесены по телу программы (располагаются в разных местах программы), то для сокращенной записи этих повторяющихся действий принято использовать макро (макросы)(макрокоманды)(открытые подпрограммы) или обычные подпрограммы (закрытые подпрограммы). При этом повторяющиеся действия записываются (оформляются как подпрограмма) один раз, а каждый случай появления повторяющихся действий надо заменить на вызов подпрограммы. Подпрограмм бывают двух видов: - закрытые (процедуры и функции); - открытые (макро). В случае открытой подпрограммы при ее вызове (макровызове) в точку вызова (вместо вызова) копируется текст макро (макроподстановка), причем это делается (т.н. препроцессором в Си) до начала работы компилятора. Пусть, например, надо сложить в разных местах программы 3 раза по 3 числа. Можно для сложения каждой тройки чисел сделать простую макрокоманду типа (на препроцессоре Си): имя макро формальные параметры вызова (то, что позволяет настроить макро на работу с конкретными данными) #define sum(x, y, z) ((x)+(y)+(z)) тело макро (макроопределение) что меняем на что меняем с учетом параметров, указанных при вызове (фактических параметров) С использованием такого макро сложение в разных местах программы трех троек – (1, 2, 3), (4, 5, 6), (7, 8, 9) – можно было бы оформить следующим способом: x y z ............... ...sum(1, 2, 3)... --> в точку вызова будет подставлен исходный код, выполняющий 1+2+3 фактические параметры вызова (соответствующих формальным x, y, z) ...sum(4, 5, 6)... --> в точку вызова будет подставлен исходный код, выполняющий 4+5+6 .............. ...sum(7, 8, 9)... --> в точку вызова будет подставлен исходный код, выполняющий 7+8+9 Достоинство использования макро – большая скорость работы (по сравнению с закрытыми) Недостаток – повторение в программе одного и того же исходного текста (текста макроопределения) после каждой макроподстановки. В случае закрытой подпрограммы (процедуры или функции) как и в случае открытой надо один раз описать подпрограмму и потом несколько раз вызвать. Только в отличие от открытой подпрограммы при вызове закрытой подпрограммы не происходит копирования в точку вызова текста макро, а вместо этого из точки вызова передается управление в подпрограмму – подпрограмма выполняется, а после своего завершения возвращает управление в точку программы, следующую за точкой вызова. Описание закрытой подпрограммы (функции) = заголовок +блок: имя формальные параметры подпрограммы тип возвращаемого значения function sum(x, y, z: real): real;
sum: =x+y+z; end;
С использованием такой подпрограммы сложение в разных местах программы трех троек – (1, 2, 3), (4, 5, 6), (7, 8, 9) – можно было бы оформить следующим способом: Var s: real; .............. Begin ............... ...s: =sum(1, 2, 3);. --> будет вызвана sum и в точку вызова будет подставлено значение суммы 1+2+3 фактические параметры вызова ............... ...s: =sum(4, 5, 6);. --> будет вызвана sum и в точку вызова будет подставлено значение суммы 4+5+6 .............. ...s: =sum(7, 8, 9);. --> будет вызвана sum и в точку вызова будет подставлено значение суммы 7+8+9 .............. end. Вот что происходит при описанных вызовах функции (закрытой подпрограммы) в памяти программы: передача управления (из программы в подпрограмму)
.....sum(1, 2, 3); вызов ............... возврат управления (и значения) ......sum(4, 5, 6); вызов .............. возврат управления (и значения) ......sum(7, 8, 9); вызов .............. возврат управления (и значения) end. Программа Подпрограмма sum Недостаток использования закрытых подпрограмм – меньшая скорость работы (по сравнению с макро) – тратится время на передачи управления (сначала в подпрограмму, а потом назад), и на передачу параметров в/из подпрограмму. Преимущества (достоинства) использования подпрограмм в программе: - экономия места (в программе) - --- описываем лишь 1 раз в программе; - экономия времени (программиста) --- 1 раз отлаживаем; - программу легче отлаживать (легче искать, где ошибка) --- если она поделена на части; - можно использовать для разработки программы нескольких программистов.
Понятие блока Закрытая подпрограмма ( пока будем говорить о процедуре ) состоит из заголовка и блока. Заголовок содержит в себе описание имени процедуры и формальных параметров (аргументы – те, что заданы - и результаты – те, что требуется получить и передать в точку вызова). Блок процедуры содержит в себе описание так называемых локальных переменных и действия подпрограммы (ее тело). Определение: Блок - фрагмент подпрограммы или программы, содержащий в себе действия над некоторыми определенными объектами и описания этих объектов. Действия в блоке заключаются между словами begin и end (Паскаль). В языке Си конструкция {блок} может использоваться самостоятельно практически везде, где может встречаться обычный оператор: { ≡ begin ........ int i; i=1; ........ }≡ end В Паскале в отличие от Си блоки самостоятельно не используются, а только в составе подпрограмм и программ (к блоку добавляется заголовок и описания локальных для блока переменных). Примечание. С блоком не надо путать составной оператор. Составной оператор включает только действия, а блок представляет собой законченную конструкцию, где имеются и описания и действия. Блоки бывают внешние (охватывающие) и внутренние (подобное разделение является относительным). a, b, c L: real 1 Program p1; блок 1 глобальная var a, b, c, L: real; x, y, z procedure p2; блок 2 var локальная 2 x, y, z: real; i, j, k L: integer procedure p3; блок 3 var i, j, k, L: integer; begin ... end; begin ... end; begin ... end.
где 1 – глобальные переменные программы области видимости 2 – локальные переменные процедур p2 и р3 В рассмотренном примере два внутренних блока и два внешних: Блоки 2 и 3 являются внутренними для блока 1. Блоки 1 и 2 являются внешними для блока 3. Приведенная программа имеет, как говорят, блочную структуру. Видно, что для описания подпрограмм в программе отведено строго определенное место (над основным разделом действий программы). Видно, что подпрограммы м.б. вложены одна в другую (р3 вложена в р2). Популярное:
|
Последнее изменение этой страницы: 2016-07-12; Просмотров: 604; Нарушение авторского права страницы