Урок 10. Цикл «До тех пор пока … делать ...»

Тема: Язык программирования Logo


ПОКА утверждение правдиво ДЕЛАТЬ 
    ряд действий
КОНЕЦ

Что значит "Утверждение правдиво"

Допустим, у нас есть переменная $число, значение которой равно 16:

$число = 16

Утверждение, что данная переменная больше 4 будет верным (правдой), а вот утверждение, что переменная равна 6 будет ложью:

$число > 4
$число == 6

Мы уже сталкивались с подобными выражениями при изучении инструкции если.

Задание 1

Переменная $red равна 150, а переменная $blue равна 250:

$red = 150
$blue = 250

Какие из следующих утверждений будут правдой, а какие — ложью?

$red != 255
$blue != 250
$red == 150
$red < 150
$red <= 150
$blue > $red
$red > $blue

Что такое "ряд действий"

Ряд действий — это, в принципе, любые выражения и в любом количестве: хоть одно, хоть очень много. Например, ряд действий может состоять из одной команды вперед 100 или из нескольких команд:

вперёд $x 
налево 30
вперёд $x – 10
$счетчик = $счетчик + 1

Ряд действий, входящий в любую сложную конструкцию представляет собой тело конструкции и на языке Лого отделяется от остального кода фигурными скобками { и }, которые можно в уме заменять словами ДЕЛАТЬ и КОНЕЦ. Конструкция пока может выглядеть примерно так:

$x = 10
пока $x < 100 { 
	иди $x, 50
	назад 30
}

Ряд действий (выражений) в теле конструкции пока выполняется лишь тогда, когда утверждение в ее заголовке правдиво. Если утверждение возвращает ложь, то ряд действий в теле не выполняется. Он просто будет пропущен роботом-черепахой.

Цикл будет работать до тех пор, пока утверждение истинно. Когда выполняется последняя команда тела цикла, черепаха не выходит за его пределы, а снова проверяет утверждение в заголовке. Если оно истинно, то тело цикла снова выполняется. Такой круговорот происходит до тех пор, пока утверждение в заголовке остается истинным. Как только оно станет ложным, тело цикла перестанет выполняться, и черепаха сразу перейдет за закрывающую скобку цикла (вернется в основную ветку программы).

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

Как все это работает

Давайте еще раз рассмотрим, особенности работы цикла пока.

  1. Если утверждение после слова пока возвращает правду, то черепаха выполняет действия внутри фигурных скобок.
  2. Но чем тогда отличается инструкция пока, от инструкции если? Дело в том, что после того как выполняется ряд действий и на пути черепахи встречается закрывающая фигурная скобка, ее дальнейшее поведение зависит от того, использовалась инструкция если или пока.
  3. При использовании инструкции если черепаха переходит на следующую команду после закрывающей скобки, т.е. покидает всю конструкцию если.
  4. При использовании инструкции пока черепаха после закрывающей скобки снова возвращается к утверждению и проверяет его на истинность (правдивость). Если утверждение по прежнему возвращает правду, то ряд действий в скобках снова выполняется. Потом черепаха снова идет к утверждению и снова проверяет его на истинность. Это будет длиться до тех пор, пока утверждение будет возвращать правду.
  5. Как только утверждение вернет ложь, черепаха сразу прыгнет за закрывающую скобку и начнет выполнять команды, не относящиеся к конструкции пока.

Конструкция пока является циклом, т.к. ряд действий (тело конструкции) может повторяться множество раз.

Опасная ошибка — зацикливание

Давайте еще раз посмотрим на этот код:

$x = 10
пока $x < 100 { 
	иди $x, 50
	назад 30
}

Проследим за похождениями черепахи, которая будет им руководствоваться:

  1. В ячейку памяти $x помещается число 10.
  2. 10 < 100 является правдой.
  3. Черепаха идет в точку с координатами 10x50 и рисует линию.
  4. Снова проверяется утверждение: 10 < 100; оно опять правдиво.
  5. Черепаха идет в точку с координатами 10x50 и рисует линию.
  6. И т.д.

Это будет продолжаться до бесконечности. Программа является ошибочной, т. к. приводит к так называемому зацикливанию. Черепаха так никогда и не сможет выйти за пределы цикла.

Как избежать подобной ошибки? Очень просто:

  1. В теле цикла переменная, которая используется в утверждении после слова пока, должна изменяться.
  2. Эта переменная должна изменяться таким образом, что рано или поздно, утверждение после слова пока должно вернуть ложь.

Вот так, например, можно изменить предыдущую программу:

$x = 10
пока $x < 100 { 
	иди $x, 50
	назад 30
	$x = $x + 20
}

Группа выражений $x = $x + 20 означает, что к значению переменной $x прибавили 20 и полученный результат записали в переменную $x. При этом старое значение переменной утратилось.

При каждом "обороте" цикла переменная $x увеличивается следующим образом: после первого — 30, после второго — 50, после третьего — 70, после четвертого — 90, после пятого — 110.

Утверждение 110 < 100 является ложью, шестого «оборота» уже не будет — цикл прервется, а исполнитель-черепаха пойдет выполнять команды за пределами цикла (после закрывающей скобки).

Задание 2

Напишите программу по следующему алгоритмическому описанию:

  1. Сброс параметров
  2. Присвоить переменным $x и $y значение 0.
  3. Установить направление в -45 градусов.
  4. Пока значение переменной $x меньше 400 выполнять следующее:
    a) переместить черепаху в точку с координатами $x , $y,
    b) нарисовать линию в 20 точек задним ходом,
    c) поднять перо,
    d) нарисовать линию в 10 точек задним ходом,
    e) опустить перо,
    f) увеличить значение переменных $x и $y на 30.

Задание 3

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

Ответ к заданию 2:

сброс 
$x = 0
$y = 0
направление -45
пока $x < 400 {
	иди $x, $y
	назад 20
	перо_подними
	назад 10
	перо_опусти
	$x = $x + 30
	$y = $y + 30
}

Примерный ответ к заданию 3:

сброс
$ответ = спроси "Сколько будет 300 - 25 * 2 + 38?"
пока $ответ != 288 {
	$ответ = спроси "Сколько будет 300 - 25 * 2 + 38?"
}
напиши "Больше спрашивать не буду!"