Циклы
Цикл с выходом по значению сенсора
В NXT-G есть вариант использования цикла, в котором выход происходит в соответствии с определённым значением какого-либо сенсора. Настройка такого цикла полностью аналогична настройке блока Wait, с той лишь разницей, что в параметрах цикла присутствует флажок Show Counter. Пустой цикл с выходом по значению сенсора аналогичен соответствующему блоку Wait. Но в теле цикла мы можем разместить блоки, которые должны повторяться многократно до срабатывания сенсора.
Пример 4.4. Превратить программу на Рис. 4.12 в простейший секундомер. Для этого тоже нужно отсчитывать время, но остановка должна произойти после нажатия на кнопку. Решение см. на Рис. 4.14).
Задание 4.9. Напишите программу, по которой робот, используя ультразвуковой датчик, должен доехать до стены и остановиться на расстоянии 30 см от неё. Текущее расстояние до стены должно выводиться на экран во время движения.
Цикл с выходом по условию
Иногда удобно использовать цикл, выход из которого происходит при выполнении некоторого логического условия. Это аналог циклов While и Repeat-Until в языке программирования Паскаль. Настройка цикла производится обычным образом:
Здесь разъём №1 (Loop Condition) появляется, если в поле №2 (Control) выбрать Logic. На этот порт цикла нужно подать провод с логическим значением (зелёный).
Поле №3 (Until) позволяет определить условие выхода из цикла: либо когда условие, поданное на разъём, станет истиной (True), либо когда оно станет ложью (False).
Пример 4.5. Моделирование ожидания в n секунд при помощи таймера на одну секунду.
Этот не вполне содержательный пример приведён здесь исключительно для знакомства с циклом рассматриваемого вида.
Здесь в цикле, который настроен на выход по условию, выполняются следующие действия:
- отсчитывается одна секунда при помощи соответствующего блока;
- номер итерации цикла, поступающий из порта Counter, подаётся на блок сравнения Compare из меню Data (Данные) полной палитры (Рис. 4.17);
- там он сравнивается с числом n, и результат этого сравнения по зелёному проводу передаётся на второй разъём цикла;
- если выполняется заданное в блоке сравнения условие, то цикл прекращает работу и мы слышим голос из динамика.
В блоке Compare доступны следующие логические операции:
- Less than - "меньше, чем";
- Greater than - "больше, чем";
- Equal - "равно".
Данные в поля блока Compare могут поступать как по внешним разъёмам, так и путём ввода в соответствующие поля. Так, в примере 4.5 данные в поле A поступают с разъёма счётчика цикла (в этом случае ввод в поле не доступен), а в поле B вводятся пользователем.
Задание 4.10. Изучите код программы из примера 4.5. Составьте программу и проверьте её работу для разных значений n.
Задание 4.11. Напишите программу, которая после запуска ждёт нажатия на оранжевую кнопку NXT, после чего что-нибудь говорит и завершается. Для обработки нажатия на оранжевую кнопку воспользуйтесь программным блоком NXT Buttons из меню Sensors и циклом с выходом по условию. При выполнении этого задания использовать блок Wait запрещается! Напомним, что жёлтые блоки группы Sensors позволяют узнать текущие показания датчиков.
Задание 4.12. Исправьте предыдущую программу так, чтобы её завершение происходило после n-го нажатия на оранжевую кнопку. Подсказка: используйте вложенные циклы.