КУМИР и РОБОТ

ДЕТАЛИ
[+/-]

Виджеты

Виджеты<bs-widget-edit>

Требуемые страницы
Кто в сети?
Материал из Wiki Лицея
Перейти к: навигация, поиск

РОБОТ

Это исполнитель, который позволит нам увидеть, как будет выполняться созданный нами алгоритм.
Меню Вставка с основными командами РОБОТА
В меню Правка (рисунок справа) выделены основные команды, с помощью которых мы будем управлять РОБОТОМ.А ниже показано окно написания кода алгоритма.
Обратите внимание на то, что необходимо убрать комментарий в окне написания кода!
Окно написания кода алгоритма
В этом окне мы и будем писать наш алгоритм. Но сначала обратимся к формулировке задачи: На бесконечном поле имеется горизонтальная стена, бесконечно продолжается влево и заканчивается лестницей, которая поднимается слева направо. Высота каждой ступени - две клетки, ширина - четыре клетки. Робот находится на горизонтальной стене, левее лестницы.
Напишите для РОБОТА алгоритм, закрашивающий все клетки, расположенные непосредственно над ступенями лестницы. Требуется закрасить только клетки, удовлетворяющие данному условию. Конечное расположение РОБОТА может быть произвольным.
Алгоритм должен решать задачу для произвольного размера поля и любого количества ступеней. При исполнении алгоритма РОБОТ не должен разрушиться.

В тексте задачи обязательно приводится рисунки начального состояния РОБОТА и состояния РОБОТА после выполнения кода алгоритма. Смотри ниже.

Положение РОБОТА обозначено на всех рисунках ромбом.
start-okno.png finish-okno.png
начальное положение РОБОТА

состояние РОБОТА после выполнения
алгоритма

Разберем этапы построения алгоритма передвижения РОБОТА (и необходимые действия РОБОТА):

1. Перемещение РОБОТА имеет два фрагмента:

а) перемещение по ступеньке с окраской ступени;
б) подъем на следующую ступень.

2. Перемещение РОБОТА носит цикличный характер: повторяется столько раз, сколько ступеней имеет лестница. Но (!), по условию задачи нам неизвестно, сколько ступеней имеет лестница. Следовательно, мы не может указывать в алгоритме количество итераций (повторений), которые должен выполнять РОБОТ.

3. У нас известны размеры ступеньки: высота - 2 клетки; ширина - 4 клетки (на рисунке ширина ступеньки - 3 клетки :), но это не должно нам помешать при выстраивании последовательности действий РОБОТА).

4. Выделим два фрагмента в действии РОБОТА: последовательность шагов

Этапы

4.1. на отрезке 1 РОБОТ перемещается вправо: делает шаг; и красит ступеньку. Определим условия выполнения этих двух действий: В условии задачи есть для этого следующие данные: У РОБОТА есть четыре команды перемещения: вверх, вниз, влево, вправо. Эти же команды указаны и для нашего исполнителя РОБОТ в КУМИРЕ (смотри команды меню Вставка - они подчеркнуты красным). При выполнении любой из этих команд РОБОТ перемещается на одну клетку в указанном направлении. Между соседними (по сторонам) клетки может стоять стена, через которую РОБОТ пройти не может. Если РОБОТ получает команду передвижения через стену, то он разрушается. Поэтому четыре команды проверяют истинность условия отсутствия стены у каждой стороны той клетки, где находится РОБОТ: 1) сверху свободно; 2) снизу свободно; 3) слева свободно; 4) справа свободно.

Для повторения последовательности команд можно использовать цикл ПОКА.

Также у РОБОТА есть команда закрасить, которая закрашивает клетку, в которой находится РОБОТ в настоящий момент.

Итак, на отрезке 1 у нас получаются следующие команды:

1. закрасить (так как начальное положение РОБОТА - на горизонтальной стене - ступеньке);

2. (шаг) вправо

И выполнять эти команды надо при условии: снизу стена и справа нет стены.

4.2. Когда же при перемещении РОБОТА он попадает в положение, когда справа стена, то ему надо выполнить команды для подъема на следующую ступеньку:

1. закрасить (так как он стоит на клетке ступень и эта клетка пока не закрашена);

2. (шаг) вверх (одна клетка высоты ступени);

3. (шаг) вверх (вторая клетка высоты ступени);

4. (шаг) вправо.

5. Объединяем команды РОБОТА участков 1 и 2:

нц ПОКА (снизу стена) и (не справа стена)
    закрасить
    вправо
кц | РОБОТ остановился перед стеной
  если справа стена
      то
          закрасить
           вверх
           вверх
           вправо
 все     | РОБОТ переместился на начало следующей ступени (смотри - начальное положение РОБОТА)

Проверим, как выполняет РОБОТ написанный нами фрагмент алгоритма. Но сначала разберемся со средой КУМИР.

Меню РОБОТ
Стартовая обстановка РОБОТА

1. Откроем меню РОБОТ и выберем команду Сменить стартовую обстановку. Откроется окно редактирования стартовой обстановки РОБОТА, где мы должны воссоздать рисунок лестницы. Для создания стен щелкаем мышкой на разделительную линию между клетками. РОБОТА (белый ромб) мышкой перемещаем в начальную позицию. Размер поля ограничен, поэтому воссоздать полностью лестницу, как на бумаге, мы не сможем.

2. По окончании редактирования выполняем команду Обстановка\Сохранить как стартовую... Даем имя файлу-обстановке. Но в КУМИРе стартовая обстановка изменилась.

3. Откроем окно РОБОТА, нажав на кнопку на панели инструментов окна КУМИРА Показать окно Робота.

Демонстрация кода алгоритма (смотри файл медиа).

The media player is loading...

Мы получили фрагмент кода алгоритма, в котором два модуля: закраска ступеньки и подъем на следующую ступеньку - выполнены. Теперь необходимо повторить этот алгоритм столько раз, сколько ступенек в лестнице. Но мы (по условию задачи) заранее не знаем, сколько раз нам необходимо выполнить приведенный алгоритм, поэтому применяем еще один (внешний цикл) ПОКА, внутрь которого и встроим наш код.

И наш код теперь выглядит так:

использовать Робот
алг 
нач
. нц пока снизу стена
. . нц пока не справа стена
. . . закрасить
. . . вправо
. . кц
. . если (справа стена) и (снизу стена)
. . . то
. . . . закрасить
. . . . вверх
. . . . вверх
. . . . вправо
. . все
. кц
кон

Посмотрите, как теперь выполняет алгоритм наш исполнитель РОБОТ:

The media player is loading...

Как видно из видеоролика, мы выполнили все условия задачи: РОБОТ красит все ступеньки не разбиваясь. И, что самое главное, алгоритм управления РОБОТ"ом рационален (оптимален).