#12.1 Цикл Repeat/Until "с постусловием" в Паскаль

Цикл Repeat/until

Цикл Repeat/until характеризуется следующими моментами:

  • Работает пока условие ложно.
  • Сначала выполняется виток цикла и лишь потом проверяется требуется ли завершать цикла или же нужен следующий повтор.
  • Такой цикл всегда выполнится хотя бы один раз (это связано с тем, что условие проверяется после выполнения тела цикла).
  • Операторные скобки вокруг тела цикла repeat-until не нужны не нужны -- так как их заменяют сами два слова repeat и until ("повторяй" и "пока не")

Пример: выведем на экран все целые числа от $1$ до $n$ (числа введённого пользователем):

var i, n: integer;
begin

  writeln('vvedite celoe chislo >1 :');
  readln(n);
  i := 1;
  repeat    // начало тела цикла
    write(i, ' ');
    i := i + 1; // увеличиваем счетчик на 1
  until (i>n); // выход из цикла только если счетчик станет больше n

  readln();
end.

-- по сути это пример замены for на repeat-util, для ситуации перебора ряда чисел.

Repeat/until и другие циклы в Паскаль -- связь между ними

Ранее мы уже изучили циклы:

  1. for -- "с известным числом повторений", который не проверяет логических условий.
  2. и while (т.н. цикл "с предусловием") -- цикл похожий на Repeat/until -- также проверяющий логическое выражение, но while от repeat отличается по следующим пунктам:
    1. По условию выхода из цикла:
      • while работает пока его логическое условие истинно,
      • repeat-until наоборот пока ложно.
    2. По порядку проверки условия:
      • while сначала проверяет условие (если истинно - то продолжает работу), а потом делает очередной (в том числе первый) свой виток.
      • repeat-until сначала делает виток, а потом проверяет условие (если ложно - то продолжает работу).

Теоретические вопросы

  1. Что такое виток цикла?
  2. Чем отличается цикл repeat/until от циклов for и while? Похож ли он в чем-то на них?

Задачи для самостоятельного решения

Примечание: в задачах данного урока, в качестве конструкции для организации цикла (если требуется) используйте repeat-until, если в задаче явно не сказано использовать какую-то другую конструкцию.

  1. Выведите на экран, все числа от $55$ до $9236$.
  2. Пользователь вводит целое число, если оно больше единицы, то выведите на экран все целые числа от этого числа до единицы (в обратном порядке), которые делятся на $23$ без остатка. Иначе (если введённое пользователем число не больше единицы) сообщите об ошибке.
  3. Пользователь вводит символы, в ответ выводите символ '&', до тех пор пока пользователь не введёт '#', после чего завершите программу.
  4. Решите с помощью цикла repeat/until:
    Выведите на экран, все нечетные числа, делящиеся на $3$ и на $6$ нацело , лежащие в диапазоне от 35 до 117.
  5. Решите с помощью цикла repeat/until:
    Выведите на экран, все четные числа от 35 до 117 и нечетные числа, делящиеся на $7$ и $3$ нацело и при этом лежащие в диапазоне от 45 до 99.
    Указание: сначала можно решить задачу двумя циклами, но потом перепишите с использованием одного цикла, в теле которого составьте логическое выражение, описывающее подходящие числа (используйте логические операции).