Сегодня ты научишься:
- анализировать обстановку Робота;
- разрабатывать циклические алгоритмы с неизвестным заранее числом повторений.
Представь себе начальника, который отдаёт приказы, но не получает никаких донесений о результатах их выполнения; повара, который не может попробовать приготавливаемое блюдо; шофёра, ведущего автомобиль с закрытыми глазами. Понятно, что так далеко не уедешь; если хочешь составлять алгоритмы для решения сложных задач, то надо уметь не только командовать Роботом, но и анализировать обстановку, в которой он оказался. Для этого у Робота есть команды "обратной связи", при вызове которых Робот сообщает информацию об обстановке вокруг себя:
лог слева свободно
лог справа свободно
лог сверху свободно
лог снизу свободно
лог слева стена
лог справа стена
лог сверху стена
лог снизу стена
лог клетка закрашена
лог клетка чистая
В ответ на эти команды Робот отвечает да или нет.
Например в данной обстановке:
-
на запрос "слева стена" Робот ответит нет,
-
на запрос "сверху сена" ответит да,
-
на запрос "клетка закрашена" ответит нет.
Задача. Пусть где-то ниже Робота на неизвестном расстоянии есть стена:
Нужно подвести Робота вплотную к стене. Как это сделать?
Если командовать Роботом вручную, то есть по шагам, то задача очень простая. Надо спросить у Робота "снизу свободно?". Если Робот оветит нет, значит, он уже у стены и задача решена. Если же Робот оветит да, то нужно скомандовать "вниз" и опяь спросить "снизу свободно?". Если Робот оветит да - опять командовать "вниз", спрашивать "снизу свободно?" и т.д., пока Робот не ответит нет. Скомандуем ли мы при эом "вниз" 0, 5, 73 или 200 раз, заранее неизвестно - это зависит от начального расположения Робота. относительно сены.
Но наша цель не ручное управление Роботом, а составление алгоритма для программного управления. Алгоритм должен быть универсальным, т.е. не должен зависеть от расстояния между Роботом и стеной. Для этого в алгоритмическом языке есть составная комада - цикл пока:
В дальнейшем этот алгоритм можно использовать как вспомогательный.
Составь алгоритмы "вверх_до_стены", "влево_до_стены", "вправо_до_стены".
Общий вид цикла пока:
нц пока условие
· тело цикла (одна или несколько команд)
кц
При выполнении цикла пока КуМир циклически повторяет следующие действия:
• проверяет записанное после служебного слова пока условие;
• если условие не соблюдается, то выполнение цикла завершается и КуМир начинает выполнять команды, записанные после кц.
Если же условие соблюдается, то КуМир выполняет тело цикла, снова проверяет условие и т.д.
Тело цикла может не выполниться ни разу, если условие в цикле пока не соблюдается с самого начала.
Например, если в алгоритме "вниз_до_стены" Робот на первый же вопрос "снизу свободно" ответит нет (т.е. если снизу от него с самого начала будет стена), то команда "вниз" не выполнится ни разу.
Может, конечно, возникнуть и противоположная ситуация. Если Робот окажется на бесконечном поле без стен, то условие "снизу свободно" будет соблюдаться всегда и произойдет зацикливание (теоретически команда "вниз" будет выполняься бесконечно много раз).
В подобной ситуации программу можно прервать кнопкой .
Робот находится у левой стены в прямоугольнике, огороженном со всех сторон стенами. Внутри прямоугольника стен нет, размеры прямоугольника неизвестны:
- Составь алгоритм, выполнив который, Робот закрасит все клетки, отмеченные точками (до правой стены) и вернется в исходное положение.
- Измени стартовую обстановку, задав размеры поля 4 на 7 клеток и проверь, будет ли работать твоя программа в этих условиях. Как изменить размеры поля смотри в справочных материалах к уроку 6.
Если возникли трудности в решении данной задачи, смотри разбор одного из возможных решений здесь.
Рассмотрим ещё один пример использования цикла пока.
Задача. Робот стоит в левом конце горизонтального коридора, нижняя стена которого сплошная, а в верхней имеются несколько выходов:
Надо составить алгоритм, который переводит Робота из клетки А в Клетку Б и закрашивает все клетки коридора:
Решение. Поскольку число клеток в коридоре неизвестно, то при записи алгоритма не обойтись без цикла пока. В какой же момент цикл должен окончиться?
Все клетки коридора имеют стену снизу, а клетка Б, в которой Робот остановится, не имеет нижней стены. Поэтому после пока можно задать условие "снизу стена". За один шаг цикла Робот должен закрашиваь очередную клетку и переходить в следующую:
Измени обстановку Робота так, чтобы длина нижней стены и ширина выходов увеличились. Проверь работу программы в новых условиях.
Выполни задания к уроку 6 из задачника.