Иллюстрированный самоучитель по Turbo Pascal

Операторы повторений

Рассмотрим пример 2.6, иллюстрирующий использование оператора WHILE. Найдем так называемое "машинное эпсилон" – такое минимальное, не равное нулю вещественное число, которое после прибавления его к 1.0 еще дает результат, отличный от 1.0.

Пример 2.6.

Program EpsilpnDetect;
{Программа вычисляет и выводит на экран значение "машинного эпсилон"}
var
epsilon: Real;
begin
epsilon: = 1;
while epsilon/2 + 1 > 1 do
epsilon: = epsilon/2
WriteLn('Машинное эпсилон = ',epsilon)
end.

У читателя, привыкшего к непрерывной вещественной арифметике, может вызвать недоумение утверждение о том, что в дискретной машинной арифметике всегда существуют такие числа 0<X<eps, что 1.0+Х=1.0. Дело в том, что внутреннее представление типа REAL может дать "лишь" приблизительно 1014 возможных комбинаций значащих разрядов в отведенных для него 6 байтах. Конечно же, это очень большое число, но оно несопоставимо с бесконечным множеством вещественных чисел. Аппроксимация бесконечного непрерывного множества вещественных чисел конечным (пусть даже и очень большим) множеством их внутреннего машинного представления и приводит к появлению "машинного эпсилон".

Оператор цикла REPEAT… UNTIL с постпроверкой условия:

REPEAT <тело_цикла> UNTIL <условие>.

Здесь:

  • REPEAT, UNTIL – зарезервированные слова (повторять до тех пор, пока не будет выполнено условие);
  • <тело_цикла> – произвольная последовательность операторов Турбо Паскаля;
  • <условие> – выражение логического типа.

Операторы <тело_цикла> выполняются хотя бы один раз, после чего вычисляется выражение <условие>: если его значение есть FALSE, операторы <тело_цикла> повторяются, в противном случае оператор REPEAT… UNTIL завершает свою работу.

Для иллюстрации применения оператора REPEAT… UNTIL модифицируем программу из примера 2.3. Модификация (пример 2.7) состоит в том, что программа будет все время повторять цикл ввода символа и печати его кода до тех пор, пока очередным символом не будет символ CR (вводится клавишей Enter).

Пример 2.7.

Program Codes_of_Chars;
{Программа вводит символ и выводит на экран его код.
Для завершения работы программы нужно дважды нажать Enter}
var
ch: Char; {Вводимый символ}
const
CR = 13; {Код символа CR}
begin
repeat
ReadLn(ch);
WriteLn(ch,' = ',ord(ch))
until ord(ch) = CR
end.

Обратите внимание: пара REPEAT… UNTIL подобна операторным скобкам begin… end, поэтому перед UNTIL ставить точку с запятой необязательно.

Для гибкого управления циклическими операторами FOR, WHILE и REPEAT в состав Турбо Паскаля включены две процедуры:

  • BREAK – реализует немедленный выход из цикла; действие процедуры заключается в передаче управления оператору, стоящему сразу за концом циклического оператора;
  • CONTINUE – обеспечивает досрочное завершение очередного прохода цикла; эквивалент передачи управления в самый конец циклического оператора.

Введение в язык этих процедур практически исключает необходимость использования операторов безусловного перехода GOTO (см. ниже п. 2.4.5).

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.