Бесконечное выполнение

Оператор 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”).

Наши рекомендации