§4. Оператор ветвления

4.1. Запись оператора ветвления

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

Оператор ветвления – это команда, реализующая алгоритмическую конструкцию ветвления на языке программирования.

Для записи оператора ветвления используется команда if. Формат команды:

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

Оператор ветвления может быть в полной или сокращенной формах. В сокращенной форме отсутствует блок else:

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

Условие в записи оператора ветвления может быть простым и составным.

Пример 4.1. Задано число x. Определить, является ли оно положительным или нет. Вывести соответствующее сообщение.

Этапы выполнения задания.

I. Исходные данные: x (введенное число).

II. Результат: соответствующее сообщение.

III. Алгоритм решения задачи.
1. Ввод исходных данных.
2. Проверка значения выражения (x > 0).
3. Вывод результата.

IV. Описание переменных: x – int.

4.2. Решение задач с использованием оператора ветвления

Пример 4.2. В момент времени 00:00 на светофоре для пешеходов включили зеленый сигнал. Далее сигнал светофора сменяется каждую минуту: 1 минуту горит зеленый сигнал, 1 минуту – красный. Известно, что с момента включения светофора прошло m минут.
Нарисовать светофор с включенным сигналом в соответствии с введенным значением времени.

Этапы выполнения задания.

I. Исходные данные: m (заданное время).

II. Результат: рисунок светофора, зависящий от значения m.

III. Алгоритм решения задачи.

1. Рисование светофора (прямоугольник и 2 круга) с выключенными сигналами. Для рисования прямоугольника и закрашенного круга опишем соответствующие функции: Для того, чтобы вывод рисунка происходил мгновенно установим скорость Черепахи равной нулю (команда speed(0)) и спрячем ее (команда hideturtle())
2. Ввод исходных данных. Ввод данных осуществляется в терминале.
3. Цвет сигнала будет зависеть от того, четным или нечетным будет значение m. Если m четное – сигнал зеленый (перерисовываем нижний круг), если нечетное – красный (перерисовываем верхний круг).
4. Перерисовываем нужный круг цветом в зависимости от четности m.

IV. Описание переменных: m – int.

Пример 4.3. Таня и Катя живут в разных домах. Им стало интересно, кто из них живет ближе к школе. Они разместили на карте прямоугольную систему координат так, чтобы школа имела координаты (0, 0). Известно, что Танин дом имеет координаты (x1; y1), а Катин (x2; y2). Девочки ходят в школу по прямой и проходят разные расстояния. Написать программу, которая определит, чей дом ближе к школе.

Этапы выполнения задания.

I. Исходные данные: координаты домов девочек x1, y1, x2, y2.

II. Результат: сообщение о том чей дом ближе.

III. Алгоритм решения задачи.
1. Ввод координат домов.
2. Вычисление расстояний r_T – от Таниного дома и r_K – от Катиного дома до школы. Для вычисления расстояния воспользуемся теоремой Пифагора:3. Сравнение расстояний и вывод ответа.

IV. Описание переменных: x1, y1, x2, y2, r_T, r_K имеют тип float.

Для решения задач с использованием команды ветвления может возникать необходимость использовать вложенные ветвления. В языке Python для их записи можно применять конструкцию elif. Запись конструкции:

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

Ключевое слово elif в записи команды по существу заменяет два других: else и if. Блоков elif может быть несколько, в том случае, если необходимо проверить не два условия, а больше. Каждое следующее условие проверяется в том случае, когда предыдущее условие ложно.
Пример 4.4. Жирность молока может быть низкой (до 2 %), средней (2–3,5 %) или высокой (более 3,5 %).
Написать программу, которая по введённой жирности молока определит его характеристику.
Этапы выполнения задания.

I. Исходные данные: a.
II. Результат: одно из сообщений — «низкая», «средняя», «высокая».
III. Алгоритм решения задачи:
1. Ввод исходного числа.
2. Проверка числа и вывод результата.
1) Если a < 2, то выводим «низкая».
2) Если условие в пункте 1 ложное, то проверяем условие a < 3,5. Если оно истинное, выводим «средняя».
3) Если условия в пунктах 1 и 2 ложные, то выводим «высокая».
IV. Описание переменных: a — float.

Пример 4.5. Проверить является ли введенное число трехзначным, и если да, то вывести цифры этого числа в отдельных строках.

Этапы выполнения задания.

I. Исходные данные: a.

II. Результат: переменные a1, a2, a3 (цифры
числа) или сообщение «не трехзначное».

III. Алгоритм решения задачи.
1. Ввод исходного числа.
2. Проверка числа. Число a является трехзначным, если 99 < a < 1000.
3.  Выделяем цифры у трёхзначного числа:
1)  первая цифра a1 — это целая часть от деления числа a на 100;
2)  вторую цифру a2 находим так: сначала получаем остаток от деления числа a на 100, а затем целую часть от деления полученного остатка на 10;
3)  последняя цифра числа a3 — это остаток от деления числа a на 10.
4.  Вывод результата.
IV. Описание переменных: все переменные имеют тип int.

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

Пример 4.1. 

V. Программа:

x = int(inputвведи x = «))
if x > 0:
      printположительное«)
else:
      printне положительное«)

VI. Тестирование
Запустить программу и ввести значение x = 5. Результат:

Запустить программу и ввести значение x = -1. Результат:VII. Анализ результатов. Для полной проверки программы требуется еще проверить значение x = 0.Пример 4.2.

V Программа:

from turtle import *

setup(450, 300)
speed(0)
hideturtle()

def p(x, y):
      penup(), setpos(x, y)
      pendown(), seth(0)

def rect(x1, y1, x2, y2):
      p(x1, y1)
      d = abs(x2 — x1)
      h = abs(y2 — y1)
      fd(d), rt(90)
      fd(h), rt(90)
      fd(d), rt(90)
      fd(h)

def fill_circle(x, y, r, c):
      p(x, y — r)
      color(«black«, c)
      begin_fill()
      circle(r)
      end_fill()

rect(-50, 100, 50, -100)
fill_circle(0, 40, 20, «black«)
fill_circle(0, -60, 20, «black«)
m = int(inputВремя = «))
if m % 2 == 0:
      fill_circle(0, -60, 20, «green«)
else:
      fill_circle(0, 40, 20, «red«)
done

VI Тестирование

Вид графического окна до ввода числа:

Ввести значение x = 5. Результат:

Ввести значение x = 12. Результат:

Пример 4.3.

V Программа:

from math import *

printТанин дом«)
x1 = float(inputx1=«))
y1 = float(inputy1=«))
print(«Катин дом»)
x2 = float(inputx2=«))
y2 = float(inputy2=«))
r_T = sqrt(x1*x1 + y1*y1)
r_K = sqrt(x2*x2 + y2*y2)
if r_T < r_K:
     printТанин дом ближе«)
else:
     printКатин дом ближе«)

VI. Тестирование программы

Запустить программу и ввести значения: Танин дом — x1 = 2.3, y1 = 4.5, Катин дом — x2 = -2.1, y2 = 4.9. Результат должен быть следующим:Запустить программу еще раз. Ввести другие значения: Танин дом – x1 = -6.1, y1 = 4.5, Катин дом — x2 = -1.71, y2 = -3.2. Результат:

Для вычисления расстояния между двумя точками можно использовать функции из библиотеки math:

  • функция dist((x1, y1), (x2, y2))вычисляет расстояние между двумя точками (x1, y1) и (x2, y2) на координатной плоскости;
  • функция hypot(x, y) вычисляетрасстояние от начала координат до точки, заданной координатами (x, y), или, другими словами, функция вычисляет гипотенузу треугольника c катетами x и y.

Пример 4.4.

Для проверки условий, описанных в алгоритме, воспользуемся конструкцией elif.
V. Программа:

a = float(input(«введи а = «))
if a < 2:
       print(«низкая»)
elif a < 3.5:
      print(«средняя»)
else:
      print(«высокая»)

VI. Тестирование программы.
Запустить программу и ввести значение числа a = 3.2.
Результат:

Пример 4.5.

V Программа:

a = int(input(«введи а = «))
if a > 99 and a < 1000:
      #первая цифра
      a1 = a // 100
      #вторая цифра
      a2 = a % 100 // 10
      #третья цифра
      a3 = a % 10
      print(a1, a2, a3, sep = ‘\n’)
else:
      print («не трехзначное»)

VI. Тестирование
Запустить программу и ввести значение 345.
Результат должен быть следующим:

Другие варианты исходных данных

1.  Что такое оператор ветвления?
2.  Чем отличается полная запись оператора ветвления от сокращённой?
3.  Можно ли использовать составные условия в операторе ветвления?
4.  Как записать команду вложенного ветвления на языке Python?
5.  Что обязательно ставится в конце строки с записью команды ветвление на Python?
6.  Почему в Python важно соблюдать отступы (4 пробела или Tab) внутри if? Что произойдёт, если их не сделать?
7.  Какое количество блоков кода может выполниться при работе конструкции if-elif-else?
8.  Учащийся написал: if temperature == 20 or 30. Будет ли это работать так, как задумано (проверка, что температура 20 или 30)? Почему нет? Как исправить?
9.  Чем отличается логическая операция and от or?

Упражнения

1. Можно ли изменить логическое выражение в операторе ветвления в примере 4.1 так, чтобы сообщения ‘Число положительное’ и ‘Число не положительное’ пришлось поменять местами? Если да, то как это сделать?

2. *Какие изменения нужно внести в программу примера 4.1, чтобы рассматривались три случая: ‘Число положительное’, ‘Число отрицательное’, ‘Число равно нулю’.

3. Измените программу примера 4.1 так, чтобы сообщение ‘Число положительное’ выводилось красным цветом, а сообщение ‘Число не положительное’ – синим в графическом окне Черепахи.

4. Измените программу в примере 4.2 так, чтобы введенное значение времени выводилось в графическом окне Черепахи.

5. Напишите программу. Задано число x. Если число чётное, то нарисовать на экране зелёный прямоугольник, а если нечётное — красный круг.
6. Измените программу из примера 4.3 так, чтобы расстояние вычислялось с использованием функции dist((x1, y1), (x2, y2)) или hypot(x, y).
7. Добавьте в программу из примера 4.3 проверку корректности исходных данных: координаты домов должны быть такими, чтобы расстояния до школы были различными. Если расстояния одинаковы, то вывести сообщение ‘Координаты введены неверно‘, а если разные, то вывести ответ.
8. Какие изменения понадобится внести в программу из примера 4.3, если допустить, что девочки могут проходить одинаковые расстояния? Внесите изменения в программу и проверьте правильность её работы.
9. Молоко жирностью от 0 до 1 % считается обезжиренным. Измените программу из примера 4.4 так, чтобы она учитывала обезжиренное молоко. Добавьте проверку на отрицательные значения (можно вывести «не бывает»).
10. Молоко с жирностью более 14 % в природе не встречается. Измените программу из примера 4.4 так, чтобы она учитывала этот факт.
11. Объедините сведения о молоке из примера 4.4, упражнений 9 и 10. Измените программу из примера 4.4 так, чтобы она учитывала все факты.
12. Как известно, многие задачи имеют не единственное решение. Так, Юля нашла другой способ вычисления второй цифры трёхзначного числа для примера 4.5. Какую из команд использовала Юля? Объясните, что получится при выполнении каждой из приведённых команд.

a2 = a % 10 // 10;       a2 = a // 10 % 10;       a2 = a // 100 % 10.

13. Программу из примера 4.5 изменили. Сформулируйте условие задачи, которая решается с помощью этой программы. 14. Программу из упражнения 13 проверили для случаев, приведённых в таблице. Все ли возможные ситуации рассмотрели? Что нужно добавить?15. Петя решил усовершенствовать программу упражнения 11 и проверку цифр в числе записал следующим образом.

Почему Петина отметка оказалась невысокой? Приведите примеры, для которых программа выдаёт неправильный ответ. Если возможно, то приведите примеры, когда программа выдаёт правильный ответ.
16. Дано натуральное число. Напишите программу, которая проверяет, является ли оно трёхзначным и кратна ли 7 сумма его цифр.
17. Дано натуральное число. Напишите программу, которая проверяет, является ли оно четырёхзначным и расположены ли его цифры в порядке убывания.
18* Вася решил создать модель мишени, которая будет реагировать на лазер. Мишень представляет собой два круга разного радиуса с общим центром, размещённых внутри квадрата. Если Вася попал в маленький круг, то он загорается зелёным. Большой круг при попадании в него загорается жёлтым. Реализуйте компьютерную модель Васиной мишени. Координаты точки попадания вводятся.

Проверь себя