Цикл с постусловием
Другая разновидность цикла отличается тем, что условие проверяется не до, а послевыполнения тела цикла. Поэтому цикл с постусловием обязательно выполняется как минимум один раз. Именно поэтому он не чаще всего не годится для решения вычислительных задач: возникает лишняя итерация (проход) цикла, и, складывая 1+2+3, можно получить ответ 10=1+2+3+4.
Цикл с постусловием записывается оператором REPEAT.. UNTIL. Его общий вид таков:
REPEAT
оператор1
…
оператор n
UNTIL условие;
Тело цикла составляют операторы, стоящие между REPEAT и UNTIL. Дополнительные BEGIN..END здесь не нужны – синтаксис оператора и так позволяет помещать в тело цикла несколько операторов.
Инструкция выполняется следующим образом:
1. Выполняются инструкции, находящиеся между словами repeat и until, инструкции цикла.
2. Вычисляется значение выражения условие. Если условие ложно (значение выражения условие равно false), то повторно выполняются инструкции цикла. Если условие истинно (значение выражения условие равно true), то выполнение цикла прекращается.
Таким образом, инструкции, находящиеся между repeat и until выполняются до тех пор, пока условие ложно (значение выражения условие равно false).
Обратите внимание:
1. Инструкции цикла, находящиеся между repeat и until, выполняются, как минимум, один раз;
2. Для того чтобы цикл завершился, необходимо, чтобы инструкции цикла, находящиеся между repeat и until, изменяли значения переменных, входящих в выражение условие
Важная особенность цикла REPEAT состоит в том, что его условие является условием прекращения цикла. Цикл прерывается и программа идет дальше, как только условие становится истинным. Напомним, что в цикле WHILE все наоборот- там цикл прерывается, как только условие становится ложным.
Цикл с постусловием идеально подходит для организации контроля корректности вводимых пользователем данных. Например, мы ожидаем ввода числа от 1 до 3 (скажем, при выборе, куда вводить информацию: на экран или в файл). Как обезопасить себя на тот случай, если гнусный пользователь возьмет и введет 4 или 0? Очень просто:
VAR a: BYTE;
BEGIN
…
REPEAT
a:=StrToInt(LabeledEidit1.Text)
UNTIL (a>=1) AND (a<=3);
После ввода числа проверяется условие его нахождения в интервале [1;3]. Если введенное число не попадает в указанный интервал, условие будет ложным и цикл повторится до тех пор, пока условие не окажется истинным.
Обозначение цикла с постусловием на блок-схемах показано на рис. 2.
Рис. 2. Обозначение цикла с постусловием на блок-схемах.
Ниже в качестве примера использования инструкции repeat.. .until приведена программа, которая проверяет: является ли число, введенное пользователем, простым. Как известно, число является простым, если оно делится только на единицу и само на себя. Проверить, является ли число n простым, можно делением числа на два, на три и т. д. до n и проверкой после каждого деления остатка. Если после очередного деления остаток равен нулю, то это значит, что найдено число, на которое n делится без остатка. Сравнив n и число, на которое n разделилось без остатка, можно определить, является ли n простым числом.
Форма приложения Простое число изображена на рис.
Процедура проверки, текст которой приведен ниже, выполняется в результате щелчка на командной кнопке Проверить.
procedure TFoml.ButtonlClick (Sender: TObject);
var
n: integer; { проверяемое число }
d: integer; { делитель }
r: integer; { остаток от деления n на d}
begin
n:=StrToInt(Edit1.text) ;
d:= 2; { сначала будем делить на два }
repeat
r:= n mod d;
if г <> 0 { n не разделилось нацело на d } then d:= d + 1;
until r = 0;
label2.caption:=Editl.text ;
if d = n
then label2.caption:=label2.caption+' – простое число.'
else label2.caption:=label2.caption + ' – обычное число.' ;
end;
Дата добавления: 2015-03-19; просмотров: 1172;