#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, для ситуации перебора ряда чисел.

Еще примеры (необходимо доофромить):

var a, b: integer;
  f: boolean;
begin

  //writeln('Введите число:');
  //readln(a);
  //while (a < 15) do
  //begin
  //  writeln(5);
  //  writeln('Введите число:');
  //  readln(a);
  //end;


  repeat
    writeln('Введите число:');
    readln(a);
    f := a < 15;
    if (f) then
      writeln(5);
  until (not f);

  readln();
end.



//var a, b: integer;
//begin
//  a := 1;
//  repeat
//    write(a, ' ');
//    a := a + 1;
//  until (a > 10);
//
//  writeln();
//
//  a := 1;
//  while (a <= 10) do
//  begin
//    write(a, ' ');
//    a := a + 1;
//  end;
//
//  readln();
//end.

//
//var a, b, c, d : integer;
//begin
//  writeln('Введите целое число:');
//  readln(a);
//  writeln(a, '/2=', a div 2);
//  writeln('Остаток=', a mod 2);
//
//  readln();
//end. 

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. Вывести на экран все числа от 1 до N с помощью цикла repeat/until.
  2. Сдавать решение не обязательно:
    Исправьте форматирование кода:
    var a,b: char;
    begin
     repeat
       writeln ('введи символ и нажми Enter');
       readln (a);
       if a='#' then break
         else
         writeln ('&');
      until (a='#');
        writeln('Конец');
    end.
    

    Примечание: Если решить не получается или для лучшего понимания, см. этот видео-разбор

  3. Выведите на экран, все числа от $55$ до $9236$.
  4. Сдавать решение не обязательно:
    Исправьте форматирование кода:
    var f: integer;
    begin
      writeln('Введите целое число');
      readln(f);
      if f < 25  then
        begin
          repeat
          if f mod 23 = 0 then
           begin
              f := f - 1;
              writeln(f);
           end else
          f := f - 2;
            until (f < 1);
        end
      else
       writeln('ошибка');
    
        writeln('Конец!');
      readln();
    end.

    Примечание: Если решить не получается или для лучшего понимания, см. этот видео-разбор

  5. Пользователь вводит целое число, если оно больше единицы, то выведите на экран все целые числа от этого числа до единицы (в обратном порядке), которые делятся на $23$ без остатка. Иначе (если введённое пользователем число не больше единицы) сообщите об ошибке.

    Как проверять:

    1. Если мы введем число 55, то программа должна вывести в ответ:
       46 23

      -- т.е. два числа

    2. Если мы введем число 5, то программа должна вывести в ответ ноль чисел (вообще ничего)
    3. Если мы введем число -4, то программа должна сообщить об ошибке

    Подсказка: если не получается решить или для лучшего понимания см. этот видео-разбор данной задачи

  6. Пользователь вводит в консоль символы (после каждого нажимая Enter), в ответ выводите символ '&', до тех пор пока пользователь не введёт '#', после чего завершите программу (не выводя ничего в ответ).
  7. Решите с помощью цикла repeat/until:
    Выведите на экран, все четные числа, делящиеся на $3$ и на $6$ нацело , лежащие в диапазоне от 35 до 117.
  8. Решите с помощью цикла repeat/until:
    Выведите на экран, все четные числа от 35 до 117 и нечетные числа, делящиеся на $7$ и $3$ нацело и при этом лежащие в диапазоне от 45 до 99.
    Указание: сначала можно решить задачу двумя циклами, но потом перепишите с использованием одного цикла, в теле которого составьте логическое выражение, описывающее подходящие числа (используйте логические операции).
vedro-compota's picture

Если непонятно, можно глянуть тут: http://fkn.ktu10.com/?q=node/8811

_____________
матфак вгу и остальная классика =)

Pages