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