Три способа записи повторяющихся команд
Можно выделить 3 способа записи повторяющихся в программе команд: циклы, макро (макросы)(макрокоманды)(открытые подпрограммы) и обычные подпрограммы (закрытые подпрограммы).
Если повторяющиеся команды располагаются в теле программы в одном месте, компактно (одна за другой), то можно (нужно) свернуть повторяющиеся действия в цикл (если для повторяющихся действий удалось найти обобщенную запись).
S := x1 + x2 + x3 + ...
s:=x1;
s:=s+x2;
s:=s+x3; for i:=1 to n do
........... s:=s+xi;
Если повторяющиеся действия сильно разнесены по телу программы (располагаются в разных местах программы), то для сокращенной записи этих повторяющихся действий принято использовать макро (макросы)(макрокоманды)(открытые подпрограммы) или обычные подпрограммы (закрытые подпрограммы). При этом повторяющиеся действия записываются (оформляются как подпрограмма) один раз, а каждый случай появления повторяющихся действий надо заменить на вызов подпрограммы.
Подпрограмм бывают двух видов:
- закрытые (процедуры и функции);
- открытые (макро).
В случае открытой подпрограммы при ее вызове (макровызове) в точку вызова (вместо вызова) копируется текст макро (макроподстановка), причем это делается (т.н. препроцессором в Си) до начала работы компилятора.
Пусть, например, надо сложить в разных местах программы 3 раза по 3 числа. Можно для сложения каждой тройки чисел сделать простую макрокоманду типа (на препроцессоре Си):
имя макро формальные параметры вызова (то, что позволяет настроить макро на работу с
конкретными данными)
L AQItABQABgAIAAAAIQD/FrNIBQMAAHoGAAAOAAAAAAAAAAAAAAAAAC4CAABkcnMvZTJvRG9jLnht bFBLAQItABQABgAIAAAAIQDmviZJ3wAAAAkBAAAPAAAAAAAAAAAAAAAAAF8FAABkcnMvZG93bnJl di54bWxQSwUGAAAAAAQABADzAAAAawYAAAAA "/>#define sum(x,y,z) ((x)+(y)+(z))
тело макро
(макроопределение)
B Ai0AFAAGAAgAAAAhAABzHeEFAwAAegYAAA4AAAAAAAAAAAAAAAAALgIAAGRycy9lMm9Eb2MueG1s UEsBAi0AFAAGAAgAAAAhAIwPElfeAAAACAEAAA8AAAAAAAAAAAAAAAAAXwUAAGRycy9kb3ducmV2 LnhtbFBLBQYAAAAABAAEAPMAAABqBgAAAAA= "/>
что меняем на что меняем
с учетом параметров, указанных при вызове
(фактических параметров)
С использованием такого макро сложение в разных местах программы трех троек – (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 в памяти |
.....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-05-28; просмотров: 2044;