Персональная страничка
Диканева Тараса
Викторовича

Главная \ Преподавательское \ Программирование для начинающих

9. Циклы while и repeat

Предыдущий раздел:

Следующий раздел:

9.1. Циклы while и repeat

В отличие от цикла for циклы while (оператор цикла с предусловием) и repeat (оператор цикла с постусловием) позволяют повторять выполнение тех или иных операторов не фиксированное количество раз, а только пока выполняется некоторое условие. Структура записи этих операторов выглядит следующим образом:

  while <условие> do
  begin
    <Операторы>
  end;

<Условие> — любое логическое выражение.
<Операторы> — любые операторы.

Перед каждым выполнением тела цикла анализируется значение выражения <условие>. Если оно истинно (true), выполняется тело цикла. Затем снова проверяется условие и т.д. Если значение условия ложно (false), то работа цикла завершается. Если результат условие окажется ложным при первой проверке, то тело цикла не выполнится ни разу.

Цикл repeat работает похожим образом, однако в нем условие проверяется в конце цикла (после выполнения каждого шага). Структура записи оператора выглядит следующим образом:

  repeat
    <Операторы>
  until <Условие>;

Один раз тело цикла будет выполнено в любом случае. Затем будет проверено условие и, если оно истинно, то выполнение цикла повторится. Повторение продолжается пока не выполнится условие, стоящее после слова until («пока не»). Таким образом, если в цикле while мы задаем условие для продолжения повторений, то в случае repeat‘а ставится условие на прекращение повторений.

Ниже работа обоих циклов показано с помощью блок-схем.

Блок-схемы работы циклов repeat и while

Рис. 1. Блок-схемы работы циклов while (а) и repeat (б).

Пример 1: Имитация работы цикла for.

Циклы с условиями более универсальны, чем for. С их помощью можно легко сделать все то же самое только об изменении значения переменной счетчика придется позаботиться самостоятельно. В качестве примера напечатаем числа от 1 до 10.

 
i:=1;
while i<=10 do
begin
  writeln(i);
  i:=i+1;
end;
 
i:=1;
repeat
  writeln(i);
  i:=i+1;
until i>10;

Заметим, что в отличие от цикла for, где увеличение счетчика всегда происходит на единицу, здесь мы сами управляем счетчиком и можем организовать увеличение на любую требуемую величину. Так в следующем примере используется увеличение счетчика на 2.

Пример 2: Напечатайте все нечетные числа от 3 до 25.

  i:=3;
  while i<=25 do
  begin
    writeln(i);
    i:=i+2;
  end;

В большинстве случаев циклы while и repeat взаимозаменяемы. Цикл repeat предпочтительнее, если известно, что тело цикла необходимо выполнить хотя бы один раз.

Следующий раздел:

Предыдущий раздел:

10 комментариев

  1. Андрей

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

  2. Андрей

    Все, понял, я нуп и апазорилсо ) Извиняюсь )

  3. Игорёк

    Я так понимаю, что в цикле while если мне надо напечатать повтор фразы то i он будет учитывать сразу i:=i+1 не считая начального значения, а в цикле repeat считается и начальное значение i и дальше с шагом указанным.

  4. Игорёк

    program zd40;
    var i:integer;
    begin
    i:=1;
    repeat
    i:=i+1;
    writeln(‘Hello’);
    until i>10
    end. И ещё одно, если until i>10 то мне ещё делает цикл когда i=10 ? а если бы стоял знак >= то 10 не учитывалось бы ? так ?

    {program zd40;
    var i:integer;
    begin
    i:=0;
    while i<10 do
    begin
    writeln('Hello');
    i:=i+1
    end;
    end. } в 2-х случаях мне напишет 10 раз, просто в одном случае i:=0 потому как первое i начинается сразу с шага I+1

  5. Игорёк

    и да, ещё заметил, что если поставить writeln выше или ниже, будет менятся показание i. Но всё равно будет 10 раз напечатно hello. т.е (i,’ hello’); если стоит выше то 1-10. А если ниже то от 2 до 11, почему так?

  6. Taras

    >> Я так понимаю, что в цикле while если мне надо напечатать повтор фразы то i он будет учитывать сразу i:=i+1 не считая начального значения, а в цикле repeat считается и начальное значение i и дальше с шагом указанным.

    Не совсем понял вопрос. Приведи пример, когда непонятно, как что-то работает.

    >> end. И ещё одно, если until i>10 то мне ещё делает цикл когда i=10 ? а если бы стоял знак >= то 10 не учитывалось бы ? так ?

    Да, так. Важно, чему i равно на момент проверки условия. В твоем примере с repeat’ом сначала делается i:=i+1, а только потом проверяется условие i > 10. В примере с while’ом — сначала проверяется условие, а только потом увеличивается i.

    >> и да, ещё заметил, что если поставить writeln выше или ниже, будет менятся показание i. Но всё равно будет 10 раз напечатно hello. т.е (i,’ hello’); если стоит выше то 1-10. А если ниже то от 2 до 11, почему так?

    Операторы в цикле выполняются последовательно. Ставишь writeln ниже и сначала i увеличивается на 1. Выше, и сначала оно печатается, а только потом увеличивается.

    В for’е счетчик увеличивался автоматически в конце тела цикла. Здесь ты сам пишешь оператор его увеличивающий. Соответственно, ставишь его, куда хочешь. Можно в начало, можно в конец или в середину цикла.

  7. Игорёк

    спасибо) насчёт первого вопроса, это я уже понял)

  8. Вадим

    мне завтра на олимпиаду. никто не знает какого типа там будут задания??? 10 кл.

  9. Sudokar

    Спасибо автору. Как-то забросил информатику, а тут понял тему.

  10. ART

    Операторы цикла и их сравнительный анализ…,,,???

Добавить комментарий