Три способа записи повторяющихся команд


Можно выделить 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;

Все действия в теле подпрограммы (в месте ее описания) выполняются над формальными параметрами.
begin тип подпрограммы

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;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.016 сек.