Конструкция WHILE...DO переводится как «пока...делать». Оператор (простой или составной), стоящий после служебного слова DO и называемый телом цикла, будет выполняться циклически, пока выполняется логическое условие, т.е. пока значение «Условия» равно True. Само условие цикла может быть логической константой, переменной или выражением с логическим результатом.

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

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

- 99 -

выражений и значений, определенных еще до первого выполнения тела цикла. Поясним сказанное примером, вычисляющим значение факториала 10! (рис. 6.1).

| VAR

| Factorial, N : Integer;

| BEGIN

| Factorial := 1; { стартовое значение факториала = 0! }

| N:=1; {стартовое значение для условия цикла}

| WHILE N<=10 DO

| begin { начало тела цикла WHILE }

| Factorial:=Factorial*N; { вычисление факториала N! }

| N := N + 1 { N должно меняться в цикле }

| end; { конец тела цикла WHILE }

| WriteLn( Factorial ); { вывод результата расчета }

| END.

Рис. 6.1

Обратите внимание на присваивание N:=1 перед циклом. Без него значение N может быть любым, и условие может быть некорректным, не говоря уже о самом значении факториала. Значение N меняется внутри цикла. При этом гораздо безопаснее так писать тело цикла, чтобы оператор, влияющий на условие, был последним в теле. Это гарантирует от нежелательных переборов. Если, скажем, на рис. 6.1 поставить строку N:=N+1; перед вычислением значения Factorial, то результатом программы будет значение 11!. Исправить оплошность можно, заменив стартовое значение N на 0, а условие — на N<10. Но от этого программа вряд ли станет нагляднее. Поскольку циклу WHILE «все равно», что происходит в его теле, тело может содержать другие, вложенные, циклы.

<p>6.5. Оператор цикла с постусловием (<strong>REPEAT</strong>...<strong>UNTIL</strong>)</p>

Рассмотренный выше оператор цикла с предусловием решает, выполнять свое тело или нет, до первой итерации. Если это не соответствует логике алгоритма, то можно использовать цикл с постусловием, т.е. решающий, делать или нет очередную итерацию, лишь после завершения предыдущей. Это имеет принципиальное значение лишь на первом шаге, а далее циклы ведут себя идентично. Цикл с постусловием всегда будет выполнен хотя бы один раз.

- 100 -

Оформляется такой цикл с помощью служебных слов REPEAT и UNTIL (повторять до):

REPEAT

Оператор1;

Оператор2;

...

ОператорN

UNTIL Условие;

Первое из них объявляет цикл и открывает его тело, а второе — закрывает тело и содержит условие окончания цикла. Тело цикла может быть пустым или содержать один и более операторов. В последнем случае слова BEGIN и END не нужны: их роль играют слова REPEAT и UNTIL.

Условие — это логическое значение, переменная или выражение с логическим результатом. Но работает оно здесь совсем не так, как в цикле WHILE. Если в цикле WHILE подразумевается алгоритм «пока условие истинно, выполнять операторы тела цикла», то цикл REPEAT...UNTIL соответствует алгоритму «выполнять тело цикла, пока не станет истинным условие».

Иными словами, в цикле с REPEAT...UNTIL условием продолжения итераций будет невыполнение условия (его значение False). Хорошей иллюстрацией к вышесказанному может быть конструкция «вечного цикла»:

REPEAT UNTIL False;

Этот цикл пустой и никогда не прекращающийся. Он хорош только в случае, когда нужно заблокировать программу, и, возможно, весь компьютер. (Но если отбросить шутки, то можно и его пристроить в дело. Обычно так организуются программы с повторяющимися действиями: вначале программы ставится REPEAT, а в конце — UNTIL False. А прервать цикл можно специальными операторами: Exit, Halt. Это имеет смысл, если условий завершения программы много или они очень сложны.)

Если условие конца цикла более гибкое, чем константа False, то в теле цикла должны содержаться операторы, влияющие на само условие. О предварительной корректности условия, как в случае цикла WHILE, заботиться уже необязательно.

<p>6.6. Оператор цикла с параметром (<strong>FOR</strong>...<strong>DO</strong>)</p>

Операторы циклов с пред- и с постусловием, хотя и обладают значительной гибкостью, не слишком удобны для организации

- 101 -

Перейти на страницу:

Поиск

Похожие книги