Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Алгоритмы с обратной связью
Цикл ПОКА
Что такое обратная связь и зачем она нужна?
До сих пор мы приказывали Роботу выполнить какую-то задачу, предполагая, что обстановка полностью известна: мы точно знаем сколько шагов до стенок, какую они имеют форму и где расположены. Мы не анализировали результаты действий Робота и обстановку на поле. Такой подход напоминает действия начальника, который отдает приказания, но не проверяет их выполнение, или шофера, который ведет машину с закрытыми глазами, полагаясь на свое знание дороги.
При решении сложных задач ситуация часто известна не полностью и надо анализировать обстановку, которая изменяется во время работы исполнителя. Человек очень часто не знает, сколько шагов ему надо пройти и не задумывается об этом, потому что он знает, куда он идет, то есть знает, где (при каком условии) остановиться.
Действие обратной связи можно описать такой схемой:
Обратная связь дает нам возможность контролировать результаты действий исполнителя во время его работы и следить за внезапными изменениями обстановки. Если обстановка и цель не совпадают, то блок Сравнение вырабатывает сигнал ошибки, на основе которого исполнитель получает команду на дальнейшие действия. После выполнения очередной команды обстановка меняется и снова сравнивается с желаемым результатом.
Как Робот использует обратную связь?
Робот имеет датчики, которые позволяют ему получать информацию об обстановке. Датчики определяют, например, есть ли стена в каком-то направлении. Чтобы использовать эту информацию в программе, в СКИ Робота есть специальные логические команды.
У Робота есть датчики, которые позволяют определять, что находится в той клетке, где он сейчас находится, и в соседних клетках. Вот все логические команды Робота:
справа_стена справа_клумба справа_свободно
слева_стена слева_клумба слева_свободно
впереди_стена впереди_клумба впереди_свободно
сзади_стена сзади_клумба сзади_свободно
грядка база
Команды грядка и база определяют, есть ли грядка (или база) в клетке, где сейчас находится Робот.
Пример 1 (задача z4-3.maz). Роботу надо придти на Базу, которая расположена на краю стенки. Расстояние от Робота до стенки и длина стенки неизвестны.
Сначала Роботу надо подойти к стенке. Если бы мы управляли Роботом вручную, то надо было бы поступать так:
На втором этапе Роботу повернуться направо и идти вперед, пока он не придет на Базу. Заметим, что расстояние до Базы также неизвестно, но Робот с помощью логической команды база может обнаружить, что он уже пришел на место. Решение задачи в виде программы дано ниже в рамке.
Подход
{
направо;
}
пока ( впереди_свободно )
{
вперед ( 1 );
}
пока ( не база )
вперед ( 1 );
Цикл с условием
Мы знаем, что многократное выполнение группы команд называется циклом. Однако здесь мы не можем применить цикл повтори, так как число шагов заранее неизвестно оно определяется во время работы программы.
Тем не менее, есть четкое условие, по которому Робот должен закончить работу: если перед ним оказывается стена. Таким образом, Робот должен выполнять цикл пока впереди свободно. Для этой цели служит специальный вид цикла цикл пока (или while, от английского while пока). Такой вид цикла называется циклом с условием, поскольку он заканчивается, когда нарушается условие в заголовке цикла.
Для того, чтобы придти на Базу, в программе используется цикл пока не база. Это условие истинно (верно), если Робот еще на пришел на Базу и надо двигаться дальше. Если Робот вступил в клетку, где находится База, условие база стало истинным, а условие не база ложным, поэтому цикл закончится.
Правила использования цикла пока
Если тело цикла включает всего один оператор, скобки можно не ставить.
Пример 2. При такой программе в той же задаче, что и в примере 1, Робот не будет ничего делать, так как сейчас справа от него нет стенки, и условие справа_стена не выполняется.
Ничего
{
пока ( справа_стена )
вперед ( 1 );
}
Важно помнить, что условие не проверяется внутри цикла, то есть датчик срабатывает только тогда, когда выполняется команда в заголовке цикла.
Пример 3. В этом примере программа для Робота составлена так, что он врежется в стенку и сообщит об ошибке “НЕ МОГУ”.
Диверсия { пока ( впереди_свободно ) { вперед ( 2 ); } } |
С циклом пока связано одна из самых неприятных ошибок программистов зацикливание. Оно происходит в тех случаях, когда условие в заголовке цикла пока никогда не становится ложным.
Пример 4. Эта программа приводит к зацикливанию, так как условие справа_стена выполняется всегда и Робот не меняет своего места.
Зацикливание { пока ( справа_стена ) { кругом; кругом; } } |
Использование цикла пока позволяет нам решать задачи, в которых некоторые данные (например, длина стенок) заранее неизвестны.
Пример 5. Посадить цветы во всех клетках по периметру прямоугольной стены, считая, что расстояние до нее и ее размеры неизвестны.
Для решения этой задачи надо использовать несколько циклов с условием. Сначала Роботу надо дойти до стенки, затем перейти к углу. Дальше он пойдет «держась за стенку», обходя таким образом прямоугольник и сажая цветы во всех нужных клетках.
Поскольку при обработке каждой из 4-х стенок Роботу надо выполнять одинаковые команды, здесь можно использовать цикл повтори ( 4 ). Тогда цикл пока становится вложенным циклом.
Контур
{
пока ( впереди_свободно )
вперед(1); /* подойти к стене */
налево;
пока ( справа_стена )
назад(1); /* в левый нижний угол */
повтори ( 4 )
{
вперед (1); /* теперь справа стена */
посади; /* угловая клетка */
направо;
}
пока ( справа_стена )
{
посади;
вперед(1);
}
}
Задачи
1. Посадить цветы во всех грядках клетках между стенками и вернуться обратно. Толщина стены 1 клетка, остальные размеры считать неизвестными.
1 2 3
2. Посадить цветы во всех грядках. Толщина стены 1 клетка, остальные размеры считать неизвестными. Все размеры считать неизвестными.
3 5
6 7