Урок 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 }
Ряд действий (выражений) в теле конструкции пока выполняется лишь тогда, когда утверждение в ее заголовке правдиво. Если утверждение возвращает ложь, то ряд действий в теле не выполняется. Он просто будет пропущен роботом-черепахой.
Цикл будет работать до тех пор, пока утверждение истинно. Когда выполняется последняя команда тела цикла, черепаха не выходит за его пределы, а снова проверяет утверждение в заголовке. Если оно истинно, то тело цикла снова выполняется. Такой круговорот происходит до тех пор, пока утверждение в заголовке остается истинным. Как только оно станет ложным, тело цикла перестанет выполняться, и черепаха сразу перейдет за закрывающую скобку цикла (вернется в основную ветку программы).
Бывает так, что тело цикла не выполняется ни разу. Так происходит, когда утверждение в заголовке цикла пока изначально было ложным.
Как все это работает
Давайте еще раз рассмотрим, особенности работы цикла пока.
- Если утверждение после слова пока возвращает правду, то черепаха выполняет действия внутри фигурных скобок.
- Но чем тогда отличается инструкция пока, от инструкции если? Дело в том, что после того как выполняется ряд действий и на пути черепахи встречается закрывающая фигурная скобка, ее дальнейшее поведение зависит от того, использовалась инструкция если или пока.
- При использовании инструкции если черепаха переходит на следующую команду после закрывающей скобки, т.е. покидает всю конструкцию если.
- При использовании инструкции пока черепаха после закрывающей скобки снова возвращается к утверждению и проверяет его на истинность (правдивость). Если утверждение по прежнему возвращает правду, то ряд действий в скобках снова выполняется. Потом черепаха снова идет к утверждению и снова проверяет его на истинность. Это будет длиться до тех пор, пока утверждение будет возвращать правду.
- Как только утверждение вернет ложь, черепаха сразу прыгнет за закрывающую скобку и начнет выполнять команды, не относящиеся к конструкции пока.
Конструкция пока является циклом, т.к. ряд действий (тело конструкции) может повторяться множество раз.
Опасная ошибка — зацикливание
Давайте еще раз посмотрим на этот код:
$x = 10 пока $x < 100 { иди $x, 50 назад 30 }
Проследим за похождениями черепахи, которая будет им руководствоваться:
- В ячейку памяти $x помещается число 10.
- 10 < 100 является правдой.
- Черепаха идет в точку с координатами 10x50 и рисует линию.
- Снова проверяется утверждение: 10 < 100; оно опять правдиво.
- Черепаха идет в точку с координатами 10x50 и рисует линию.
- И т.д.
Это будет продолжаться до бесконечности. Программа является ошибочной, т. к. приводит к так называемому зацикливанию. Черепаха так никогда и не сможет выйти за пределы цикла.
Как избежать подобной ошибки? Очень просто:
- В теле цикла переменная, которая используется в утверждении после слова пока, должна изменяться.
- Эта переменная должна изменяться таким образом, что рано или поздно, утверждение после слова пока должно вернуть ложь.
Вот так, например, можно изменить предыдущую программу:
$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
Напишите программу по следующему алгоритмическому описанию:
- Сброс параметров
- Присвоить переменным $x и $y значение 0.
- Установить направление в -45 градусов.
- Пока значение переменной $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?" } напиши "Больше спрашивать не буду!"
Последние комментарии
1 день 2 часа назад
2 дня 7 часов назад
2 дня 9 часов назад
5 дней 3 часа назад
6 дней 48 минут назад
1 неделя 1 час назад
1 неделя 2 дня назад
1 неделя 3 дня назад
1 неделя 5 дней назад
2 недели 4 дня назад