КУМИР

Урок 6 "Алгоритмы с "обратной связью". Цикл пока"

 

 

Сегодня ты научишься:

  •  анализировать обстановку Робота;
  •  разрабатывать циклические алгоритмы с неизвестным заранее числом повторений.


 

Представь себе начальника, который отдаёт приказы, но не получает никаких донесений о результатах их выполнения; повара, который не может попробовать приготавливаемое блюдо; шофёра, ведущего автомобиль с закрытыми глазами. Понятно, что так далеко не уедешь; если хочешь составлять алгоритмы для решения сложных задач, то надо уметь не только командовать Роботом, но и анализировать обстановку, в которой он оказался. Для этого у Робота есть команды "обратной связи", при вызове которых Робот сообщает информацию об обстановке вокруг себя:  

лог слева свободно

лог справа свободно

лог сверху свободно

лог снизу свободно

лог слева стена

лог справа стена

лог сверху стена

лог снизу стена

лог клетка закрашена

лог клетка чистая

В ответ на эти команды Робот отвечает да или нет.

Например в данной обстановке:

  •  на запрос "слева стена" Робот ответит нет,

  •  на запрос "сверху сена" ответит да,

  •  на запрос "клетка закрашена" ответит нет.

 

 Задача. Пусть где-то ниже Робота на неизвестном расстоянии есть стена:

Нужно подвести Робота вплотную к стене. Как это сделать?

 

Если командовать Роботом вручную, то есть по шагам, то задача очень простая. Надо спросить у Робота "снизу свободно?". Если Робот оветит нет, значит, он уже у стены и задача решена. Если же Робот оветит да, то нужно скомандовать "вниз" и опяь спросить "снизу свободно?". Если Робот оветит да - опять командовать "вниз", спрашивать "снизу свободно?" и т.д., пока Робот не ответит нет. Скомандуем ли мы при эом "вниз" 0, 5, 73 или 200 раз, заранее неизвестно - это зависит от начального расположения Робота. относительно сены.

Но наша цель не ручное управление Роботом, а составление алгоритма для программного управления. Алгоритм должен быть универсальным, т.е. не должен зависеть от расстояния между Роботом и стеной. Для этого в алгоритмическом языке есть составная комада - цикл пока:

В дальнейшем этот алгоритм можно использовать как вспомогательный.

 Составь алгоритмы "вверх_до_стены", "влево_до_стены", "вправо_до_стены".

 


 

 Общий вид цикла пока:

нц пока условие

· тело цикла (одна или несколько команд)

кц

При выполнении цикла пока КуМир циклически повторяет следующие действия:

• проверяет записанное после служебного слова пока условие;

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

Если же условие соблюдается, то КуМир выполняет тело цикла, снова проверяет условие и т.д.

 


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

Например, если в алгоритме "вниз_до_стены" Робот на первый же вопрос "снизу свободно" ответит нет (т.е. если снизу от него с самого начала будет стена), то команда "вниз" не выполнится ни разу.


Может, конечно, возникнуть и противоположная ситуация. Если Робот окажется на бесконечном поле без стен, то условие "снизу свободно" будет соблюдаться всегда и произойдет зацикливание (теоретически команда "вниз" будет выполняься бесконечно много раз).

В подобной ситуации программу можно прервать кнопкой .

 

 Робот находится у левой стены в прямоугольнике, огороженном со всех сторон стенами. Внутри прямоугольника стен нет, размеры прямоугольника неизвестны:

 

  •  Составь алгоритм, выполнив который, Робот закрасит все клетки, отмеченные точками (до правой стены) и вернется в исходное положение. 
  •  Измени стартовую обстановку, задав размеры поля 4 на 7 клеток и проверь, будет ли работать твоя программа в этих условиях. Как изменить размеры поля смотри в справочных материалах к уроку 6.

 

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

 

Рассмотрим ещё один пример использования цикла пока.

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

 

Надо составить алгоритм, который переводит Робота из клетки А в Клетку Б и закрашивает все клетки коридора:

 

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

Все клетки коридора имеют стену снизу, а клетка Б, в которой Робот остановится, не имеет нижней стены. Поэтому после пока можно задать условие "снизу стена". За один шаг цикла Робот должен закрашиваь очередную клетку и переходить в следующую:

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

 

Выполни задания к уроку 6 из задачника. 

Дата последнего обновления страницы 21.12.2018
Сайт создан по технологии «Конструктор сайтов e-Publish»