Оператор WHILE
Циклическое выполнение задается с помощью оператора WHILE – выражения со стандартными словами WHILE и DO в следующей форме:
WHILE условие DO оператор DO
Если условие выполняется, Паскаль-машина выполняет оператор DO, после чего выполнение всего выражения WHILE повторяется до тех пор, пока выполняется условие. Как правило, оператор WHILE записывается в вышеприведенном стиле, WHILE и DO на отдельных строках, оператор DO сдвинут вправо на два пробела. Это стандартный стиль написания программ, который облегчает их чтение.
Программа Copy использует оператор WHILE для любого количества символов из INPUT в OUTPUT. Символ # используется как маркер конца входных данных для остановки процесса копирования.
PROGRAM Copy (INPUT, OUTPUT); {Копирует все символы, предшествующие # из INPUT в OUTPUT} VAR Ch: CHAR; BEGIN READ(Ch); WHILE Ch <> ‘#’ DO BEGIN WRITE(Ch); READ(Ch) END; WRITELN END.
INPUT: ABC# OUTPUT: ABC
INPUT: Red#AZURE OUTPUT: Red
Второй вариант выполнения программы показывает, что любые данные следующие за символом # не будут выведены в OUTPUT. Следовательно, маркер конца данных не может быть использован как данные. Часть выполнения программы Copy для входных данных ABC# показана в таблице выполнения ниже. Значения не показаны в тех строках таблицы, где они не могут быть изменены.
Частичная таблица выполнения для программы Copy
Бесконечное выполнение
Оператор WHILE может войти в бесконечное выполнение если он написан неправильно. Например, если будет пропущен оператор READ в программе Copy.
WHILE Ch <> ‘#’ DO BEGIN WRITE(Ch) END
Таким образом, условие в предложении WHILE должно контролировать выполнение и гарантировать завершение цикла.
1.5.3. Программы MaxOfAll и CopyOdds
Программа MaxOfAll определяет максимальный символ в INPUT предшествующий #. Предложение IF выводит в OUTPUT различные сообщения в зависимости от того, обнаружены ли там какие-либо данные. Значение переменной Max – найденный на текущий момент максимум. Концепция сохранения результата проверок в той переменной, которой выполняется сравнение, часто используется в программах. Когда выполнение оператора WHILE завершится, в переменной Max будет находиться максимальное из прочитанных значений.
PROGRAM MaxOfAll (INPUT, OUTPUT); {Считывает символы, предшествующие # из INPUT, наибольший выводится в OUTPUT} VAR Ch, Max: CHAR; BEGIN READ(Ch); IF Ch = ‘#’ THEN WRITELN(‘NO DATA’); ELSE BEGIN WRITE(‘INPUT DATA IS ’); Max:= Ch; WHILE Ch <> ‘#’ DO BEGIN WRITE(Ch); IF Ch > Max THEN Max:= Ch; READ(Ch) END; WRITELN; WRITELN(‘MAX OF ALL IS ’, Max); END END.
INPUT: AZURE# OUTPUT: INPUT DATA IZ AZURE : MAX OF ALL IS Z
INPUT: A# OUTPUT: INPUT DATA IZ A : MAX OF ALL IS A
INPUT: #AZURE OUTPUT: NO DATA
Программа CopyOdds копирует символы из INPUT в OUTPUT через один. Программа использует переменную Next для того, чтобы отслеживать четность/нечетность очередного прочитанного символа. Поскольку эта программа сложнее предыдущих, комментарии в ней встречаются чаще.
PROGRAM CopyOdds (INPUT, OUTPUT); {Копирует через один символы, предшествующие # из INPUT в OUTPUT} VAR Ch, Next: CHAR; {Next – преключатель между нечетными (Odd-‘O’) и четными (Even-‘E’)} BEGIN Next:= ‘O’ READ(Ch); WHILE Ch <> ‘#’ DO BEGIN IF Next = ‘O’ THEN {Копирование нечетных символов} WRITE(Ch); READ(Ch); {Переключение Next} IF Next = ‘O’ THEN Next:= ‘E’ {Even} ELSE Next:= ‘O’ END; WRITELN END.
INPUT: AZURE# OUTPUT: AUE
INPUT: A#BC OUTPUT: A
INPUT: 123456789# OUTPUT: 13579
INPUT: SEE CAR EAT# OUTPUT: SECRET
Рассмотрим второй оператор IF внутри оператора WHILE
IF Next = ‘O’ THEN Next:= ‘E’ {Even} ELSE Next:= ‘O’
Next может принимать только значения ‘O’ или ‘E’. Если текущее значение ‘O’ значением становится ‘E’, если текущее значение ‘E’ значением становится ‘O’. Таким образом, данный оператор IF заставляет работать переменную Next как переключатель ‘O’/’E’ (“flip-flop”).
|