Перейти к основному содержимому

Цикл

Цикл в алгоритме робота

Коротко

Цикл - это часть алгоритма, которая повторяет команды. Повторение продолжается, пока выполняется условие, или пока программа не дойдет до команды выхода.

Зачем это нужно

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

Цикл позволяет описать повторяющуюся работу коротко. Вместо десятков одинаковых строк программист записывает правило: что повторять и когда остановиться. В робототехнике это один из главных инструментов, потому что робот должен реагировать на мир не один раз, а постоянно.

Главная идея

Цикл возвращает выполнение назад к уже пройденному шагу.

проверить условие
если можно продолжать -> выполнить команды -> вернуться к проверке
если пора остановиться -> выйти из цикла

Блок-схема цикла

В формальной блок-схеме ветка «да» ведёт к телу цикла, а стрелка после тела возвращает программу к ромбу с условием.

Формальная блок-схема цикла с условием

В блок-схеме цикл легко узнать по стрелке, которая возвращается назад. Без такой стрелки алгоритм идет только вперед.

Что такое тело цикла

Тело цикла - это команды, которые повторяются. Если тело цикла написано неправильно, ошибка тоже будет повторяться.

Цикл с условием

Один из частых вариантов - цикл, который выполняется, пока условие истинно.

Псевдокод:

пока кнопка не нажата
мигать светодиодом

Если раскрыть команду «мигать», получится следующая блок-схема:

Блок-схема мигания до нажатия кнопки

В Python похожая идея записывается через while:

while distance > 20:
print("go")

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

Часть циклаЧто делаетПример
Условиерешает, продолжать ли повторениерасстояние больше 20
Тело циклакоманды, которые повторяютсяехать вперед, читать датчик
Выходместо после завершения циклаостановить мотор

Бесконечный цикл

Иногда цикл специально делают бесконечным. Например, основная функция loop() в Arduino вызывается снова и снова, пока плата включена. Внутри нее обычно читают датчики и обновляют устройства.

Бесконечный цикл не всегда ошибка. Ошибка появляется, если программа должна когда-то выйти, но не может.

Проблемный пример:

пока расстояние больше 20
ехать вперед

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

Как избежать зависания

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

Пример: ехать до препятствия

Повторение проверки датчика до остановки

Робот должен ехать вперед, пока препятствие далеко.

прочитать расстояние
пока расстояние больше 20
ехать вперед
прочитать расстояние
остановить моторы

На схеме особенно хорошо видно, почему повторное чтение датчика должно находиться внутри цикла.

Блок-схема движения до препятствия

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

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

Цикл и ветвление

Цикл часто работает вместе с ветвлением. Например:

пока робот включен
прочитать датчики линии
если линия слева
повернуть влево
иначе если линия справа
повернуть вправо
иначе
ехать прямо

Здесь внешний цикл отвечает за повторение, а два ромба внутри него — за выбор направления.

Блок-схема цикла с ветвлением для движения по линии

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

Как трассировать цикл

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

Пусть робот уменьшает скорость, пока она больше нуля:

скорость = 3
пока скорость > 0
вывести скорость
скорость = скорость - 1

Эта же трассировка в виде блок-схемы показывает команду, которая постепенно изменяет условие выхода.

Блок-схема уменьшения скорости в цикле

Таблица трассировки:

ПовторениеСкорость перед проверкойУсловие скорость > 0Что происходит
13давывести 3, уменьшить до 2
22давывести 2, уменьшить до 1
31давывести 1, уменьшить до 0
40нетвыйти из цикла

Так видно, что тело цикла выполнится три раза. Если забыть строку скорость = скорость - 1, таблица никогда не дойдет до выхода. Для робота такая ошибка может означать бесконечное движение, мигание или ожидание.

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

Что запомнить про цикл

Цикл нужен там, где одно действие или набор действий повторяется.

ВопросЧто проверить
Что повторяется?тело цикла
Когда повторение продолжается?условие
Что меняет условие?чтение датчика, счетчик, команда пользователя
Когда цикл закончится?выход
Что будет, если условие не изменится?возможное зависание

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

Практика

Задание 1

Запишите алгоритм:

пока кнопка не нажата
мигать светодиодом
после нажатия
выключить светодиод

Нарисуйте блок-схему со стрелкой возврата.

Задание 2

В алгоритме есть ошибка:

прочитать расстояние
пока расстояние больше 20
ехать вперед
остановиться

Что нужно добавить внутрь цикла?

Задание 3

Придумайте цикл для робота, который ищет линию. Опишите условие продолжения и команды внутри тела цикла.

Проверьте себя

  • Что такое тело цикла?
  • Как на блок-схеме узнать цикл?
  • Почему цикл может стать бесконечным?
  • Чем цикл отличается от ветвления?
  • Почему датчик часто нужно читать внутри цикла?
Ориентиры для самопроверки

Сначала ответьте без подсказки. Ответ можно считать полным, если вы:

  • формулируете основную мысль своими словами;
  • называете важные условия, ограничения или меры безопасности;
  • для схемы, кода или расчёта показываете ход решения и ожидаемый результат.

Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.

Словарь статьи

  • Цикл - повторение части алгоритма.
  • Тело цикла - команды, которые повторяются.
  • Условие цикла - проверка, которая решает, продолжать повторение или выйти.
  • Итерация - одно выполнение тела цикла.
  • Бесконечный цикл - цикл, который не завершится сам.
  • Выход из цикла - переход к командам после повторения.

Связанные темы

Источники