Циклы

Мы уже не раз использовали циклы. Обычно это был цикл "повторять всегда". Всего в Scratch три разновидности цикла. Это блоки "повторять всегда", "повторить … раз", "повторять пока не …".

Циклы в Scratch

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

С циклом "повторить … раз" мы тоже знакомы. Он повторяет вложенные в него команды количество раз, которое указано в его заголовке. Особенностью этого цикла является то, что заранее известно количество повторов.

Конечно, мы можем запрашивать у пользователя количество повторов, или оно может определяться в результате арифметической операции, результат которой мы не знаем. Но все-равно, когда поток выполнения программы доходит до цикла "повторить … раз", программе уже известно количество повторов.

Цикл Повторить ... раз

Новым для нас и самым сложным из всех циклов является цикл "повторять пока не … ". Тело этого цикла выполняется до тех пор, пока условие в его заголовке не вернет правду. Как только условное выражение станет истинным, цикл прекратит свою работу. Но когда условие станет правдой, мы не знаем. Поэтому неизвестно количество повторов цикла.

Тело цикла "повторять пока не …" может вообще ни разу не выполниться, если условие сразу вернет правду. Или же цикл так и не сможет завершиться, если условие всегда будет оставаться ложью.

Вспомним этот пример из прошлого урока:

Программа без цикла

Здесь, если человек вводит положительное число, то программа зацикливается в цикле "повторять всегда" и спрайт ходит по сцене.

Однако, если человек вводит строку или отрицательное число, программа выполняет ветку "иначе" и завершается.

Что если мы хотим, чтобы программа продолжала запрашивать у пользователя число, пока он его не введет. То есть, когда человек вводит строку, программа должна сообщать ему о неправильном вводе и снова запрашивать число. В таком случае не обойтись без цикла "повторять пока не …".

Пример использования цикла Повторять пока не

Логика здесь следующая. Пользователя просят ввести скорость. Если он вводит положительное число, то выражение "модуль от ответ = ответ" возвращает правду. Поэтому тело цикла "повторять пока не …" не будет выполнено ни разу. Поток выполнения программы сразу перейдет к циклу "повторять всегда", внутри которого реализовано ходьба спрайта.

Если человек вводит строку, выражение "модуль от ответ = ответ" возвращает ложь. Тело цикла "повторять пока не …" будет выполняться. Пользователю покажут предупреждение и снова попросят ввести скорость. Если он опять введет строку, ему снова покажут предупреждение и снова попросят ввести скорость.

И так будет до тех пор, пока человек не введет положительное число. Когда это произойдет, мы не знаем. Но только после этого программа сможет перейти к циклу "выполнять всегда".

Рассмотрим второй пример использования цикла "повторять пока не …". Составим программу, в которой человеку предлагается угадать загаданное компьютером число. Однако перед этим познакомимся с блоком, генерирующим случайные цифры.

Программа Угадай число

Команда "выдать случайное от … до …" генерирует случайное число в диапазоне от первого указанного числа до второго включительно. Например, если дана команда "выдать случайное от 10 до 30", то программа выдаст любое число, которое не меньше 10 и не больше 30. Это, например, может быть число 10, а может быть 17, или 25. Также возможно получить число 30.

В Scratch допустимо сначала указать большее число, а затем меньшее. Например, "выдать случайное от 100 до 50". Команда и в этом случае будет правильно работать и генерировать любое число от 50 до 100.

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

Итак, чтобы компьютер загадал случайное число, нам нужна команда "выдать случайное от … до …". Это число надо будет где-то сохранить, чтобы потом сравнивать с тем, что вводит человек. Значит, нам понадобиться переменная.

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

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


Задание

Переделайте скрипт про угадывание числа так, чтобы

  1. компьютер загадывал число от 1 до 100.

  2. Если человек вводит число, которое больше загаданного, то программа должна говорить ему "слишком много".

  3. Если человек вводит число, которое меньше загаданного, то программа должна говорить ему "слишком мало".

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

Курс с ответами к заданиям и двумя дополнительными уроками:
pdf-версия

Комментарии

Верните пожалуйста старые уроки тоже + новые отдельным разделом