§15. Алгоритмическая конструкция ветвление

15.1. Команда ветвления

Довольно часто на поставленный вопрос человек получает ответ «Да» или «Нет». В зависимости от ответа человек определяет свои действия и выполняет одну или другую команду или группу команд (пример 15.1).
Роботы и другие технические устройства также могут выполнять различные действия в зависимости от условия. Если условие истинно (на вопрос получен ответ «Да»), то выполняется один набор действий, если ложно, то другой.

Алгоритмическая конструкция «ветвление» обеспечивает выполнение одной или другой последовательности команд в зависимости от истинности или ложности некоторого условия.

Команда ветвления может изображаться на блок-схеме следующим образом:
Принцип работы команды ветвления описан в примере 15.2. В языке программирования Python для записи конструкции ветвления используется команда if. Формат записи команды:

if <условие>:
     команда(ы) 1
else:
     команда(ы) 2

Строка if <условие>: является заголовком ветвления. Эту строку можно прочитать следующим образом: «Если условие верно, то». В следующей строке со сдвигом записывается последовательность команд 1.
После слова else в следующей строке со сдвигом записывается последовательность команд 2. Обратите внимание на то, что символ «:» ставится как в конце заголовка ветвления, так и после слова else.

Команда ветвление может быть записана в полной или сокращенной форме.

Полная форма команды ветвления организует выполнение двух разных наборов команд, из которых выполняется только один. В сокращенной форме один из наборов команд отсутствует. Если отсутствует набор команд, соответствующих ситуации, когда условию ложно, то никакие действия не выполняются (пример 15.3).

Блок-схема сокращенной формы ветвления:

На языке программирования Python команда запишется следующим образом:

if <условие>:
      команда(-ы) 1

качестве последовательности команда(-ы) 1 (команда(-ы) 2) может выступать другая команда ветвления. То есть, если истинно (ложно) одно условие, то может потребоваться проверить другое условие. Такие конструкции образуют вложенные ветвления (пример 15.4).
В языке Python для записи вложенных ветвлений (в случае, ложности первого условия) можно применять конструкцию elif. Запись конструкции:

if <условие1>:
      команды 1
elif <условие2>:
      команды 2
else:
      команды 3

Ключевое слово elif в записи команды по существу заменяет два других: else и if. Блоков elif может быть несколько, в том случае, если необходимо проверить не два условия, а больше.

15.2. Составные условия

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

Логическая операция Запись в Python
НЕ not
И and
ИЛИ or

Истинность или ложность составного условия для исполнителя Робот определяется для конкретной обстановки.

Пример 15.5. Проверить для Робота следующие составные условия:

1.wall_left() and cell_is_filled()
2.wall_up() or wall_down()
3.not (wall_right() or not wall_up())

15.3. Использование команды ветвления для исполнителя Робот

Пример 15.6. Робот должен закрасить клетку, которая находится за стеной. В зависимости от обстановки обход стены может осуществляться по-разному.

В начале Робот должен сдвинуться вправо. Если стена снизу, то сверху свободно и можно обойти стену сверху, в противном случае Робот обходит стену снизу. После обхода стены Робот закрашивает клетку. Алгоритм можно записать следующим образом:

Вправо
Если стена снизу, то
      Вверх
      Вправо
      Вниз
Иначе
      Вниз
      Вправо
      Вверх
Закрась

Для решения этой задачи использована полная форма команды ветвления.
Пример 15.7. Робот находится на неизвестной клетке поля без линий. Он должен закрасить клетку слева от себя.

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

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

Для решения этой задачи использована сокращенная форма команды ветвления.

Пример 15.8. Робот находится на произвольной, не прилежащей к границе, клетке поля. Вокруг клетки сверху или снизу могут быть стены. Он должен закрасить клетку, на которой находится, если у нее есть хоть одна стена. Иначе Робот должен сдвинуться влево.

Программа для решения этой задачи может быть записана двумя способами:

  1. с использованием конструкции elif;
  2. с использованием составного условия.

В первом случае Робот проверяет условие «стена сверху» и в случае его ложности переходит на проверку условия «стена снизу». Во втором случае используется составное условие: «стена сверху или стена снизу».

Пример 15.1. Выбор обуви весной, в зависимости от погоды.

Если на улице дождь, то
      надеть резиновые сапоги
Иначе
      надеть туфли

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

Понятие ветвления используется в различных сферах человеческой деятельности.

роботВ ботанике под ветвлением побегов понимают процесс увеличения числа побегов у растений.

робот

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

Пример 15.2. Принцип работы команды ветвление:

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

Пример 15.3. Выход на улицу осенью.

Если на улице дождь, то
      взять зонт
выйти на улицу

В данном примере используется сокращенная форма команды ветвления. Если условие истинно, то выполняется команда взять зонт. Если условие ложно, то никаких действий не происходит. Команда выйти на улицу выполняется всегда, не зависимо от истинности или ложности условия.
Блок схема данного алгоритма будет выглядеть следующим образом:

Пример 15.4. Имеется три монеты, среди которых одна фальшивая.

Известно, что фальшивая монета легче настоящих монет. Найти фальшивую монету за минимальное число взвешиваний на чашечных весах без гирь. За какое количество взвешиваний можно определить фальшивую монету?
Представим словесное описание алгоритма решения этой задачи.

Положить на каждую чашу весов
по одной монете (монета1 и
монета2)

Если весы в равновесии, то
      фальшивая монета 3
Иначе
Если монета 1 тяжелее, то
              фальшивая монета 2
Иначе
              фальшивая монета 1

За одно взвешивание мы можем определить фальшивую монету.

Пример 15.5. Начальная обстановка поля Робота.

Первое условие состоит из двух простых: А = wall_left() и B = cell_is_filled(). Условие может быть записано как «АиВ». Это условие верно только тогда, когда верны и А, и В. Условие А = 1 (истинно), условие В = 1 (истинно), условие АиВ = 1 (истинно).
Второе условие может быть записано как «А или В», где А = wall_up(), В = wall_down(). Условие А =1, условие В = 0. Значит условие А или В = 1 (истинно).
В третьем условии операция not отрицает составное условие wall_right() or not wall_up().

Условие может быть записано как не (Аили не В). Соблюдая порядок выполнения логических операций определим истинность или ложность данного условия:

  1. не В = 0, так как В = 1;
  2. А или не В = 0, так как А = 0;
  3. не (А или не В) = 1.

Для других обстановок Робота истинность или ложность приведенных составных условий может быть другой.

Пример 15.6. Две разные обстановки поля Робота:

робот

Программа для исполнителя Робот:

from pyrob.api import *

@task
def prim_15_6():
      move_right()
      if wall_down():
           move_up()
           move_right()
           move_down()
      else:
           move_down()
           move_right()
           move_up()
      fill_cell()

run_tasks()

Пример 15.7. Программа для исполнителя Робот.

from pyrob.api import *

@task
def prim_15_7():
      if not wall_left():
             move_left()
             fill_cell()

run_tasks()

Результат работы программы для разных начальных обстановок:

Начальная обстановка Результат
робот робот
робот робот

Пример 15.8. Две разные обстановки поля Робота:

роботПрограмма для исполнителя Робот:

from pyrob.api import *

@task
def prim_15_8():
      if wall_up():
             fill_cell()
      elif wall_down():
             fill_cell()
      else:
             move_left():

run_tasks()

Исполняемый фрагмент программы для второго способа:

from pyrob.api import *

@task
def prim_15_8():
      if wall_up or wall_down():
             fill_cell()
      else:
             move_left():

run_tasks()

 

1. Что такое алгоритмическая конструкция ветвление?
2. Из чего состоит заголовок команды ветвление?
3. Чем отличается форма записи полной конструкции ветвление от сокращённой?
4. Какая конструкция может использоваться для записи вложенных ветвлений?
5. Что такое составное условие?
6. Какие логические операции можно использовать для записи составных условий?
7. Как определить истинность составного условия?

Упражнения

1. Выделите алгоритмическую конструкцию ветвления в отрывке из поэмы А.С. Пушкина « Руслан и Людмила» и изобразите эту конструкцию с помощью блок-схемы.

У лукоморья дуб зелёный
Златая цепь на дубе том:
И днём и ночью кот учёный
Всё ходит по цепи кругом
Идёт направо – песнь заводит,
Налево – сказку говорит.
Там чудеса: там леший бродит,
Русалка на ветвях сидит…

2. Определите, какие из составных условий истинны, а какие ложны для заданной обстановки поля Робота.

робот3. В каждом из условий упражнения 2 заменили операцию and на or, а операцию or на and. Изменится ли истинность приведенных условий?

4. Для каждого из ложных условий упражнения 2 придумайте обстановку поля Робота, в которой данное условие будет истинным, а для каждого истинного – обстановку, в которой условие будет ложным.

5. Решите задачи upr_15_5_1 и upr_15_5_2. Эти задачи аналогичны примеру 12.7. В задаче upr_15_5_1 Робот должен закрасить клетку справа, а в задаче upr_15_5_2 – снизу.

6. *Решите задачи upr_15_6_1 и upr_15_6_2.

1. Клетка, на которой находится Робот, должна быть закрашена. Остальные клетки закрашиваются только тогда, когда есть стена с соответствующей стороны.

робот

2. Робот находится в какой-то клетке поля размера 2 × 2. Он должен закрасить клетку в углу, противоположном начальному.

робот

 

Проверь себя