Конструкция Repeat..Untilявляется называется циклом с постусловием.
Синтаксис:
Repeat
<блок операторов>;
Until <условие>;
Выполняется <блок операторов>, затем проверяется условие выхода из цикла, записанное после слова Until. Если условие выполняется, то цикл завершается, в противном случае вновь выполняется <блок операторов> и вновь проверяется условие и т. д.
Особенности:
1. <Блок операторов> обязательно выполнится хотя бы один раз.
2. Внутри конструкции Repeat..Until не нужны операторные скобки Begin...End, хотя их использование не запрещается.
3. В теле цикла (в отличие от цикла For) необходимо предусмотреть изменение значения параметра цикла!!!
Пример 1. Печать первых десяти натуральных чисел.
i:=1; {присвоение начального значения параметру цикла}
repeat
writeln(i);
i:=i+1; {изменение значения параметра цикла}
until (i<=10);
Пример 2. Определение стоимости покупки при ее указанной предельной сумме.
Var х, к, р, s: Integer;
Begin
WriteLn('Предельная сумма — ');
ReadLn(p);
s:=0;
Repeat
WriteLn('Введите цену товара и его количество9); ReadLn(x,k);
s:=s+x*k;
WriteLn('Стоимость покупки равна',s);
Until s>p;
WriteLn('Суммарная стоимость покупки превысила предельную сумму');
End.
Пример 3. Задержка выполнения программы до нажатия любой клавиши.
…
Writeln("Нажмите любую клавишу");
Repeat
Until KeyPressed;
Readkey;
…
При нажатии клавиш данные поступают в буфер клавиатуры и хранятся там до тех пор, пока не будут считаны процедурами или функциями ввода данных, либо сам буфер не будет очищен программно.
Пример 4 .
Алгоритм Евклида — это алгоритм нахождения наибольшего общего делителя (НОД) двух целых неотрицательных чисел.
Алгоритм Евклида нахождения НОД основан на следующих свойствах этой величины. Пусть х и у одновременно не равные нулю целые неотрицательные числа и пусть х>у, тогда, если у=0, то НОД(х, у)=х, а если у¹0, то для чисел х, у и r, где r — остаток от деления х на у выполняется равенство НОД(х, у)=НОД(у, r).
Например, пусть х=48, а у=18, найдем их наибольший общий делитель.
x
y
Результаты
48 mod 8=12
x>y
НОД(48,18)=НОД(12,18)
18 mod 12=6
x<y
НОД(12,18)=НОД(12,6)
12 mod 6=0
x>y
НОД(12,6)=НОД(0,6)
x=0
НОД(0,6)=6
Таким образом, НОД(48, 18)=6.
Написать программу нахождения наибольшего общего делителя (НОД) двух неотрицательных чисел. Для решения данной задачи воспользуемся циклом с постусловием:
Program Euclid;
Var х, у: Integer;
Begin
Writeln('Bвeдитe два числа');
Readln(x,y);{вводим два целых числа}
Repeat {выполнять}
If x>y Then
x:=x Mod у
Else y:=y Mod x;
Until (x=0) Or (у=0);{до тех пор, пока одно из чисел не станет равно нулю}
Writeln('HOД=',х+у); {вывод НОД - без условного оператора, так как одно из чисел обязательно равно нулю}