Ветвление

Ветвление позволяет программе выбрать один из нескольких путей. Программа проверяет условие и выполняет разные команды в зависимости от результата.
Зачем это нужно
Линейная программа выполняет команды по порядку и не меняет поведение. Для робота этого быстро становится мало. Если впереди препятствие, нужно остановиться или повернуть. Если линия ушла влево, нужно изменить скорость колес. Если кнопка не нажата, стартовать нельзя. В каждой такой ситуации программа должна задать вопрос и выбрать действие.
Ветвление превращает робота из устройства с жестким сценарием в систему, которая реагирует на обстановку. При этом выбор не появляется сам по себе: программист должен явно записать условие и команды для разных случаев.
Главная идея
Ветвление строится вокруг вопроса, на который можно ответить "да" или "нет".
условие?
да -> выполнить один набор команд
нет -> выполнить другой набор команд

Формальная блок-схема показывает обе ветки и место, где они снова объединяются.

В блок-схемах условие обычно рисуют ромбом. Из ромба выходят две стрелки: одна для случая, когда условие истинно, другая для случая, когда условие ложно.
Условие - это выражение, которое программа проверяет. Результат проверки обычно можно прочитать как истина или ложь, да или нет, 1 или 0.
Условие в коде
В Python ветвление записывают через if:
if distance < 20:
print("stop")
else:
print("go")
В псевдокоде то же самое можно записать словами:
если расстояние меньше 20
остановить робота
иначе
ехать вперед
Здесь условие distance < 20 решает, какой путь выберет программа. Если расстояние меньше порога, выполняется первая ветка. Если нет, выполняется ветка иначе.
| Часть ветвления | Что означает | Пример |
|---|---|---|
| Условие | вопрос для проверки | расстояние меньше 20? |
| Ветка "да" | команды при истинном условии | остановить моторы |
| Ветка "нет" | команды при ложном условии | ехать вперед |
| Слияние | место, где алгоритм продолжается | снова читать датчик |
Неполное и полное ветвление
Иногда нужно действие только в одном случае:
если кнопка нажата
включить светодиод
Если кнопка не нажата, программа просто идет дальше. Такое ветвление называют неполным.
Чаще для робота лучше явно записывать оба случая:
если кнопка нажата
включить светодиод
иначе
выключить светодиод
Сравнение неполного и полного ветвления особенно наглядно на двух блок-схемах:

Так алгоритм меньше зависит от старого состояния устройства. Если светодиод уже горел раньше, неполное ветвление может оставить его включенным там, где ученик ожидал выключение.
Несколько условий
У робота может быть больше двух вариантов. Например, датчики линии дают разные ситуации:

| Ситуация | Действие |
|---|---|
| оба датчика видят линию | ехать прямо |
| линия под левым датчиком | повернуть влево |
| линия под правым датчиком | повернуть вправо |
| линия потеряна | искать линию |
Такой алгоритм можно записать как несколько проверок подряд. В Python для этого есть elif, в псевдокоде можно писать "иначе если".
если оба датчика видят линию
ехать прямо
иначе если левый датчик видит линию
повернуть влево
иначе если правый датчик видит линию
повернуть вправо
иначе
искать линию
При нескольких вариантах ромбы располагают последовательно. Порядок ромбов совпадает с порядком проверок в псевдокоде.

Порядок проверок влияет на результат. Если сначала проверить только левый датчик, то ситуация "оба датчика видят линию" может попасть в неправильную ветку.
Ошибки в ветвлениях
Ветвления часто ломаются не из-за синтаксиса, а из-за неточного условия.
| Ошибка | Что происходит | Как проверить |
|---|---|---|
| Неверный знак сравнения | робот останавливается слишком рано или поздно | проверить примеры значений |
Забыта ветка иначе | устройство сохраняет старое состояние | описать оба случая |
| Перепутан порядок условий | выбирается не та ветка | проверить таблицу ситуаций |
| Условие всегда истинно | одна ветка работает постоянно | вывести значения для отладки |
| Датчик шумит около порога | робот дергается | добавить диапазон или фильтрацию |
Ветвление удобно проверять таблицей. В таблице видны все случаи, а не только тот, который пришел в голову первым.
Как проверять ветвление вручную
Перед запуском на роботе полезно выполнить алгоритм "карандашом". Берем несколько значений датчика и смотрим, в какую ветку они попадут.
Например, порог расстояния равен 20.
| Расстояние | Условие расстояние < 20 | Действие |
|---|---|---|
| 10 | да | остановиться |
| 19 | да | остановиться |
| 20 | нет | ехать |
| 25 | нет | ехать |
Такая проверка сразу показывает граничный случай. Если робот должен останавливаться и при расстоянии 20, условие должно быть не < 20, а <= 20. Граница условия часто важнее, чем кажется на первом чтении кода.
Еще один прием - временно выводить не только значение датчика, но и выбранную ветку:
расстояние = 18
выбрано: остановиться
Так легче отличить ошибку логики от ошибки подключения мотора.
Что запомнить про ветвление
Ветвление добавляет выбор, но не заменяет точное описание алгоритма.
| Вопрос | Что проверить |
|---|---|
| Что программа спрашивает? | условие |
| Какие ответы возможны? | да/нет или несколько случаев |
| Что делать в каждом случае? | команды веток |
| Что будет после выбора? | продолжение алгоритма |
| Все ли случаи описаны? | таблица ситуаций |
Если робот реагирует неправильно, сначала нужно проверить не моторы, а то, какую ветку реально выбрала программа.
Практика
Задание 1
Запишите ветвление для робота:
если расстояние меньше 15 см
...
иначе
...
Выберите команды для обеих веток.
Задание 2
Составьте таблицу для кнопки и светодиода.
| Кнопка нажата? | Что должен делать светодиод? |
|---|---|
| нет | |
| да |
Задание 3
У робота два датчика линии. Придумайте ветвление для четырех ситуаций: 00, 01, 10, 11.
Проверьте себя
- Для чего нужен ромб в блок-схеме?
- Чем ветка
еслиотличается от веткииначе? - Почему порядок нескольких условий может менять поведение?
- Что случится, если забыть описать случай "нет"?
- Как таблица помогает проверить ветвление?
Сначала ответьте без подсказки. Ответ можно считать полным, если вы:
- формулируете основную мысль своими словами;
- называете важные условия, ограничения или меры безопасности;
- для схемы, кода или расчёта показываете ход решения и ожидаемый результат.
Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.
Словарь статьи
- Ветвление - выбор пути в алгоритме по условию.
- Условие - проверяемое выражение с результатом истина/ложь.
- Ветка - набор команд, который выполняется при определенном результате условия.
- Порог - значение, с которым сравнивают измерение.
- Истина - условие выполнено.
- Ложь - условие не выполнено.
- Ромб в блок-схеме - блок проверки условия.
Связанные темы
- Простая программа - что происходит без выбора действия.
- Ввод-вывод - откуда берется значение для условия.
- Цикл - как повторять проверку условия.
- Логические элементы - как условия связаны с
0и1.
Источники
- Python Tutorial.
ifStatements: https://docs.python.org/3/tutorial/controlflow.html#if-statements - Python Tutorial. More Control Flow Tools: https://docs.python.org/3/tutorial/controlflow.html
- Arduino Language Reference: https://docs.arduino.cc/language-reference/
- Arduino Reference. digitalRead(): https://www.arduino.cc/en/Reference/digitalRead