Отправляет email-рассылки с помощью сервиса Sendsay

Всё о работе в Интернет

  Все выпуски  

Занятие 40.


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

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

ОПЕРАТОРЫ АРИФМЕТИЧЕСКИХ ЦИКЛОВ

1. Команда повторения с параметром в алгоритмическом языке.

Команда повторения с параметром алгоритмического языка предназначена для реализации арифметических циклов (циклов-ДЛЯ). Общий вид команды следующий:

для X от Xнач до Xкон шаг Xшаг
выполнять  <серия>

В первой строке команды, называемой её заголовком, в неявной форме зафиксировано количество повторений <серии>. Смысл обозначений в заголовке команды следующий:

-       параметр цикла X; представляет собой переменную любого числового типа; в процессе исполнения команды параметр последовательно пробегает некоторое заранее определённое множество значений;

-       начальное значение параметра цикла Xнач;

-       конечное значение параметра цикла Xкон;

-       шаг изменения значений параметра цикла Xшаг.

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

Если Xшаг = 1, то часть заголовка “шаг Xшаг” в записи команды может быть опущена. Говорят, что значение Xшаг = 1 принимается “по умолчанию”.

Выполняемая в цикле <серия> может содержать любое количество команд. Она может быть даже пустой. Если в составе <серии> менее двух команд, то отмечать её служебными словами нс и кс не обязательно.

Правило выполнения команды повторения с параметром формулируется в виде следующего алгоритма в словесной форме:

1)                 1)    параметру цикла X присвоить начальное значение X := Xнач;

2)       проверить, не выходит ли значение параметра X за пределы конечного значения Xкон;

3)      если значение параметра X за пределы Xкон не выходит, то выполнить <серию>, значение параметра изменить на величину шага X := X + Xшаг, после чего вернуться на пункт 2;

4)       если значение параметра X выходит за пределы Xкон, то прекратить выполнение команды и считать её выполненной полностью.

Таким образом, выполнение <серии> команды повторения происходит каждый раз при новом значении параметра цикла X: сначала при X = Xнач, потом при X = Xнач + Xшаг,  X = Xнач + 2 * Xшаг и т. д. Повторения выполнения <серии> продолжаются, пока значения параметра X не выходят за пределы Xкон. Именно поэтому количество повторений полностью определяется соотношением величин Xнач, Xкон и Xшаг, а именно: выполнение <серии> будет повторено столько раз, сколько разных значений сможет принять параметр цикла X на промежутке от начального значения Xнач до конечного значения Xкон с шагом Xшаг. Допустимые значения параметра X определяются непосредственно перед выполнением команды повторения в соответствии со следующими правилами:

-       при Xшаг > 0 и Xнач £ Xкон допустимы значения параметра £ Xкон;

-       при Xшаг > 0 и Xнач > Xкон ни одно значение параметра не допустимо;

-       при Xшаг < 0 и Xнач ³ Xкон допустимы значения параметра ³ Xкон;

-       при Xшаг < 0 и Xнач < Xкон ни одно значение параметра не допустимо.

Приведём несколько примеров.

Пример 1. Заголовок команды повторения: для i от 2 до 13 шаг 3. Допустимые значения параметра цикла i начинаются с Xнач = 2 и следуют далее с шагом Xшаг = 3, то есть = 2, 5, 8, 11. Очередное значение 14 выходит за пределы Xкон = 13. В соответствии с количеством допустимых значений параметра i количество повторений <серии> равно четырём.

Пример 2. Заголовок команды повторения: для T от 7 до 3 шаг 2. Поскольку при положительном шаге Xшаг = 2 начальное значение параметра Xнач = 7 больше конечного Xкон = 3, то ни одно из значений параметра не является допустимым.  Начальное значение параметра = Xнач = 7 сразу выходит за пределы конечного значения, то есть > Xкон = 3. Количество повторений <серии> равно нулю.

Пример 3. Заголовок команды повторения: для X от 5 до 5 шаг –2. Допустимое значение параметра цикла X единственно и равно = Xнач = 5. Очередное значение параметра (с учётом шага Xшаг = –2), равное 3, выходит за пределы Xкон = 5, то есть = 3 < Xкон. Следовательно, <серия> буде выполнена всего один раз.

Пример 4. Заголовок команды повторения: для k от 2 до 5 шаг –1. Поскольку при отрицательном шаге Xшаг = –1 начальное значение параметра Xнач = 2 меньше конечного Xкон = 5, то ни одно из значений параметра k не является допустимым.  Начальное значение параметра = Xнач = 2 сразу выходит за пределы конечного значения, то есть < Xкон = 5. Количество повторений <серии> равно нулю.

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

Если для данного значения параметра цикла X указанное логическое выражение истинно, то это значение параметра допустимо, так как за пределы Xкон не выходит, и поэтому <серия> цикла должна быть выполнена повторно.

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

Из рассмотренного свойства команды повторения с параметром возникла очень важная договорённость о том, что никакая команда из состава <серии> не может и не должна влиять на количество повторений. Любые попытки изменить значения Xнач, Xкон, Xшаг, а также параметра цикла X в процессе выполнения команды повторения не должны восприниматься. Именно поэтому в рамках АЯ принято, что любая команда в составе <серии>, направленная на изменение указанных величин, расценивается как синтаксическая ошибка. 

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

Я надеюсь, что вы уже обратили внимание на отсутствие какого-либо упоминания о ситуации, связанной с Xшаг = 0. Заполним этот пробел.

Не очень трудно представить, что может происходить в этом случае. Пункт 3 правила выполнения команды показывает, что значение параметра цикла изменяться при этом не будет. А если так, то процессу выполнения команды не суждено когда-либо завершиться. Это явление носит название зацикливания” и считается алгоритмической ошибкой.

И наконец. Хочется ещё раз вернуться к уже рассмотренному логическому выражению (Xкон – X) * Xшаг ³ 0. Возможно, что многим оно не покажется достаточно компактным. На этот случай предлагаю следующие варианты его упрощения:

-       если Xшаг > 0, то эквивалентным выражением является £ Xкон;

-       если Xшаг < 0, то эквивалентным выражением является ³ Xкон.

Упрощёнными выражениями рекомендуется пользоваться в случаях, когда знак Xшаг заведомо известен. Чаще всего это бывает тогда, когда Xшаг представлен в виде константы.

Используя команду повторения с предусловием, можно построить последовательность команд, эквивалентную команде повторения с параметром. Это надо понимать так, что правило выполнения команды повторения с параметром будет воспроизведено иными средствами. Эквивалентная последовательность команд имеет вид:

:= Xнач
пока (Xкон – X) * Xшаг ³ 0
выполнять нс <серия>; X := X + Xшаг
 кс

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

Однако, как говорится, “нет худа без добра”. Наш эквивалент хорош тем, что в отношении его оказываются недействительными все те договорённости, которые обуславливали применение команды повторения с параметром. При использовании эквивалента в составе <серии> допустимы любые команды, изменяющие значения величин Xнач, Xкон, Xшаг, а также параметра цикла X. Кроме того, переменная X после исполнения команды оказывается вполне определённой.

2. Оператор арифметического цикла языка Паскаль.

В операторе арифметического цикла (цикла-ДЛЯ) языка Паскаль количество повторений цикла задаётся косвенным образом посредством указания границ некоторого диапазона значений порядкового типа (целочисленного, логического или символьного).

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

-       инкрементная форма For x:=Xmin To Xmax Do <оператор>;

-       декрементная форма For x:=Xmax DownTo Xmin Do <оператор>.

Свойства и особенности записи оператора арифметического цикла следующие:

-       слова For (для), To, DownTo (до), Do (выполнять) – зарезервированные;

-       составной символ “:=” имеет смысл “от”;

-       x – параметр цикла, представляющий собой переменную порядкового типа; в процессе выполнения цикла параметр x последовательно пробегает все значения из заранее определённого их множества;

-       Xmin и Xmax – заданные минимальное и максимальное значения параметра цикла x, представляющие собой выражения, совместимые с ним по присваиванию;

-       множество значений параметра x определяется интервалом Xmin..Xmax; если Xmin>Xmax, то множество считается пустым;

-       <оператор> – произвольный оператор (чаще всего составной), представляющий собой цикл.

Правило выполнения оператора арифметического цикла формулируется так:

1)   образуется множество из пары значений X=[Xmin, Xmax]; при этом, если Xmin>Xmax, то множество X оказывается пустым;

2)   если множество X пусто, то оператор цикла считается выполненным;

3)   параметру x присваивается заданное начальное значение (x:=Xmin для инкрементной формы, x:=Xmax для декрементной формы), после чего это начальное значение из множества X исключается;

4)   выполняется <оператор>;

5)   если значение параметра x не принадлежит множеству X, то определяется очередное его значение по правилу Inc(x) для инкрементной формы и Dec(x) для декрементной формы, после чего осуществляется возврат на пункт 4;

6)   если значение параметра x принадлежит множеству X, то оператор цикла считается выполненным.

Правило выполнения свидетельствует о том, что повторения <оператора> выполняются ДЛЯ всех значений параметра x ОТ Xmin ДО Xmax включительно (отсюда и название цикла).

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

-       если изначально множество X=[Xmin,Xmax] пусто, то <оператор> не  выполняется ни разу;

-       величины Xmin и Xmax фиксируются в множестве X непосредственно перед выполнением цикла, поэтому в дальнейшем, в том числе и в самом цикле, возможно их использование для других целей;

-       не рекомендуется использовать операторы, измененяющие параметр x в цикле, поскольку из-за несовпадения его текущего значения с оставшимся элементом множества X возможно зацикливание;

-       если изначально множество X пусто, то параметр x сохраняет то своё значение, которое он, возможно, имел перед циклом; в противном случае значение параметра x совпадает с его заданным конечным значением (x=Xmax для инкрементной формы, x=Xmin для декрементной формы). 

Ещё раз обращаю ваше внимание на основные отличия оператора арифметического цикла Паскаля от команды повторения с параметром алгоритмического языка.

1). Оператор Паскаля может быть использован только в том случае, если его параметр имеет порядковый тип. Иначе говоря, тип параметра не может быть числовым вещественным, но зато он может быть не только целочисленным, но и логическим или символьным. Понятно, что выражения Xmin и Xmax тоже должны иметь соответствующий порядковый тип.

2). Параметр цикла в процессе выполнения оператора Паскаля принимает по порядку все свои значения из промежутка от Xmin до Xmax. Иными словами говоря, для значений параметра цикла в операторах Паскаля не предусмотрен произвольный шаг при переходе от предыдущего значения к следующему.

3). Особенности реакции на попытки изменять в цикле значения Xmin, Xmax или параметра цикла x таковы:

-       никаких синтаксических ошибок при этом не возникает и программа компилируется успешно;

-       изменение значений Xmin и Xmax по ходу выполнения цикла не приводит, как и следовало ожидать, к изменению количества его повторений; это связано с тем, что множество допустимых значений параметра формируется перед выполнением цикла;

-       изменение значений параметра x по ходу выполнения цикла имеет труднопредсказуемые последствия (в одних случаях это действительно изменяет количество повторений, но зато в других – получаем зацикливание); именно поэтому влияние на параметр x в цикле считается алгоритмически некультурным.

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

Команда повторения с параметром АЯ может быть переведена на Паскаль в виде оператора арифметического цикла только при условии, что параметр X и выражения Xнач, Xкон имеют целый числовой тип, а выражение для шага Xшаг тождественно равно 1 или –1. Во всех других случаях (вещественный тип X, Xнач или Xкон, отличающееся от ±1 значение шага) для перевода на Паскаль должна использоваться эквивалентная последовательность команд на базе команды повторения с предусловием:

:= Xнач;
While (Xкон  X) * Xшаг >= 0 Do
Begin <серия>; := X + Xшаг End;

При этом общую форму условия (Xкон – X) * Xшаг >= 0 в каждом конкретном случае целесообразно упрощать: при Xшаг > 0 лучше пользоваться условием X <= Xкон, а при Xшаг < 0 – условием X >= Xкон.

3. Операторы выхода, используемые в циклах.

Напомню, что операторы выхода предназначены для “досрочного” завершения или программы в целом, или некоторого её фрагмента. При этом “досрочное завершение” следует понимать в том смысле, что пропускаются и не выполняются все или определённая часть операторов программы. Об этом шла речь при изучении оператора Exit.

В циклах могут использоваться следующие операторы выхода:

-       оператор Continue – оператор выхода из текущего повторения цикла; выход осуществляется на следующее повторение цикла;

-      оператор Break – оператор выхода из цикла; выполнение оператора цикла прекращается, после чего выполняются операторы, следующие за данным оператором цикла.

Уважаемые подписчики! На следующем занятии мы начнём рассматривать задачи с применением циклов.

Уважаемые подписчики! При необходимости задать вопрос, проконсультироваться, уточнить или обсудить что-либо обращайтесь через Гостевую книгу моего персонального сайта http://a-morgun.narod.ru. При этом настоятельно рекомендую пользоваться браузером Internet Explorer.

С уважением, Александр.


В избранное