Цикл repeat в Pascal

Создано: 07.04.2026

Цикл while может не выполниться ни разу, если логическое выражение в заголовке сразу возвращает ложь. Однако такая ситуация не всегда подходит. Бывает, что тело цикла должно выполниться хотя бы один раз. В таком случае используется циклический оператор repeat...until... — это цикл с постусловием.

В этом цикле логическое выражение стоит после тела цикла. Причем, в отличие от while, здесь всё наоборот: в случае истины происходит выход из цикла, в случае лжи — его повторение. Отметим, что repeat переводится как "повторить", until — "до тех пор".

Вспомним наиболее короткий вариант программы с циклом while, когда ввод преобразовывался в число:

var
    f: real;
    error: integer;
    s: string;

begin
    error := -1;

    while error <> 0 do begin
        write('Введите число: ');
        readln(s);
        val(s, f, error);
    end;    

    writeln(sqrt(f):10:3);
end.

С циклом repeat код может быть еще компактней:

var
    f: real;
    error: integer;
    s: string;

begin
    repeat
        write('Введите число: ');
        readln(s);
        val(s, f, error);
    until error = 0;    

    writeln(sqrt(f):10:3);
end.

Нам незачем заранее присваивать значение переменной error, так как оно определится в процессе выполнения тела цикла, которое гарантировано будет выполнено хотя бы один раз. Если число вводится верно, то условие error = 0 станет истиной, и цикл завершит свою работу.

Еще раз обратим внимание, что условие при until обратно используемому при while. После until находится логическое выражение, истинность которого прекращает работу цикла. Поэтому при составлении сложного условия вместо логического оператора or используется and. Чтобы понять почему, усложним приведенные выше циклы проверкой, что число не отрицательное:

while (error <> 0) or (f < 0) do begin
    write('Введите неотрицательное число: ');
    readln(s);
    val(s, f, error);
end; 
repeat
    write('Введите неотрицательное число: ');
    readln(s);
    val(s, f, error);
until (error = 0) and (f >= 0);

В случае с while, чтобы цикл продолжил крутится, достаточно, чтобы либо было введено не число (error при этом не равна нулю), либо число меньше нуля. В случае с repeat, чтобы выйти из цикла, надо соблюсти сразу оба условия: ввести и число, и оно должно быть нулем или больше его.

Напишите программу с циклом repeat, которая ожидает на ввод число либо меньше -15, либо больше 25, то есть в условии цикла должен описываться разрывный диапазон. Если эту программу переписать с циклом while, какой логический оператор надо использовать и почему?

Для ранее рассмотренного примера циклический оператор repeat...until... хорошо подходит, так как нам все равно надо запросить с ввода число хотя бы один раз. Если же мы попытаемся "под repeat" переписать программу с вычислением суммы пяти введенных чисел, то особого выигрыша не получим:

var i, n, sum: integer;
begin
    i := 5;
    sum := 0;

    repeat
        read(n);
        sum := sum + n;
        i := i - 1;
    until i = 0;    

    writeln('Сумма: ', sum);
end.

Более того, если значение i, то есть количество вводимых чисел, будет определяться пользователем, и он может указать, что не будет вводить числа, то программа станет логически неверной. Ведь она все равно запросит хотя бы одно число, даже если i будет равно нулю.

Другое дело, когда числа должны вводится до тех пор, пока не накопится определенная сумма:

var
    sum, n: integer;

begin
    sum := 0;

    repeat
        readln(n);
        sum := sum + n;
    until sum > 100;

    writeln('Сумма: ', sum);
end.

Обратите внимание, что тело цикла repeat не нуждается в операторных скобках begin и end, так как сама конструкция циклического оператора явно ограничивает тело цикла. Другими словами, здесь роль операторных скобок играют ключевые слова repeat и until. Однако это не касается случаев, когда внутри тела есть другой составной оператор:

var
    sum, n: integer;

begin
    sum := 0;

    repeat
        readln(n);
        if n <= 0 then begin
            writeln('Введено отрицательное число!');
            writeln('Оно не добавляется к сумме.')
        end
        else
            sum := sum + n;
    until sum > 100;

    writeln('Сумма: ', sum);
end.

Измените программу так, чтобы сложение шло до 100, но при сумма не превышала сотню. Допустим, если сумма уже равна 97, а введено число 5, то программа должна сообщать, что сложение отменяется, а на экран выводится накопленная до этого сумма, то есть 97.

Задания для дополнительной или самостоятельной работы:

Среди стандартных функций Паскаля есть sqr, которая возводит в квадрат переданное ей число. Напишите программу, которая перед каждым, но не первым, возведением спрашивает пользователя, хочет ли он возвести еще одно число в квадрат. Программа должна завершаться в случае получения отказа. Какой цикл лучше использовать, while или repeat?