8-Lesson №26

Урок №26. Разработка программ, содержащих оператор ветвления.

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

В большинстве реальных задач порядок действий может изменяться в зависимости от того, какие данные поступили. Например, программа для системы пожарной сигнализации должна выдавать сигнал тревоги, если максимальное из показаний двух датчиков температуры больше, чем предельно допустимое значение. Для этого нужно сначала найти это максимальное значение, т. е. записать его в какую-нибудь переменную.
Выполним формализацию задачи — запишем её «в буквах»:
    Требуется записать в переменную М наибольшее из значений переменных а и b.
Для решения таких задач в языках программирования предусмотрены условные операторы (ветвления). Например, для того, чтобы записать в переменную М максимальное (наибольшее) из значений переменных а и b, можно использовать оператор:

if а > b:
   М = а
else:
   М = b

Слово if переводится с английского языка как «если», а слово else — как «иначе». Если верно (истинно) условие, записанное после слова if, то выполняются все команды (также говорят «блок команд»), которые расположены до слова else. Если же условие после if неверно (ложно), выполняются команды, стоящие после else.
В Python, в отличие от других языков, сдвиги операторов относительно левой границы (отступы) влияют на работу программы. Обратите внимание, что слова if и else начинаются на одном уровне, а все команды внутренних блоков сдвинуты относительно этого уровня вправо на одно и то же расстояние. Для сдвига используют пробелы (обычно не меньше двух) или символы табуляции (которые вставляются при нажатии на клавишу Tab).
Кроме знаков < и > в условиях можно использовать другие знаки отношений: <= (меньше или равно), >= (больше или равно), == (равно, два знака «равно» без пробела, чтобы отличить от оператора присваивания) и != (не равно).
Если в блоке всего один оператор, иногда бывает удобно записать блок в той же строке, что и служебное слово if (else):

if а > b: М = а
else: М = b

В приведённых примерах условный оператор записан в полной форме: в обоих случаях (истинно условие или ложно) нужно выполнить некоторые действия.

Программа выбора максимального значения может быть написана иначе:

М = а
if b > а: М = b

Здесь использован условный оператор в неполной форме, потому что в случае, когда условие ложно, ничего делать не требуется (нет слова else и блока операторов после него).
Поскольку операция выбора максимального из двух значений нужна очень часто, в Python есть встроенная функция mах, которая вызывается так:

М = max ( а, b )

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

М = a if а > b else b

которая работает так же, как и приведённый выше условный оператор в полной форме: записывает в переменную М значение а, если а > b, и значение b, если это условие ложно.
Часто при истинности какого-то условия нужно выполнить сразу несколько действий. Например, в задаче сортировки значений переменных а и b по возрастанию нужно поменять местами значения этих переменных, если а > b:

if а > b:
   temp = а 
   а = b 
   b = temp

Здесь temp — это временная (вспомогательная) переменная (от англ. temporary — временный). Все операторы, входящие в блок, сдвинуты на одинаковое расстояние от левого края. Начало и конец блока, который выполняется при истинности условия, определяется именно этими сдвигами. Поэтому операторные скобки — специальные ограничители блоков (как, например, слова begin и end в языке Паскаль или фигурные скобки в С-подобных языках) здесь не нужны.
Заметим, что в Python, в отличие от многих других языков программирования, есть множественное присваивание, которое позволяет выполнить такой обмен значительно проще:

а, b = b, а

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

if аgеА > аgеВ:
   print( "Андрей старше" ) 
else:
   if аgеА == аgеВ:
      print( "Одного возраста" ) 
   else:
      print ( "Борис старше" )

Условный оператор, проверяющий равенство, находится внутри блока «иначе» (else), поэтому он называется вложенным условным оператором.
Как видно из этого примера, использование вложенных условных операторов позволяет выбрать один из нескольких вариантов (а не только из двух).
Если после else сразу следует ещё один оператор if, можно использовать так называемое «каскадное» ветвление с ключевыми словами elif (сокращение от else-if). Если очередное условие ложно, выполняется проверка следующего условия и т. д.:

if ageA > ageB:
   print ( "Андрей старше" ) 
elif ageA  == ageB:
   print ( "Одного возраста" ) 
else:
  print ( "Борис старше" )

Обратите внимание на отступы: слова if, elif и else находятся на одном уровне.
В цепочке операторов if-elif-elif-… срабатывает первое истинное условие. Например, программа

cost =1500 
if cost < 1000:
   print ( "Скидок нет." ) 
elif cost < 2000:
   print ( "Скидка 2%." ) 
elif cost < 5000:
   print ( "Скидка 5%." ) 
else:
   print( "Скидка 10%." )

выведет «Скидка 2%.», хотя условие cost < 5000 тоже выполняется.

ОПЕРАЦИЯ "И".

Предположим, что ООО «Кнут и Пряник» набирает сотрудников, возраст которых от 25 до 40 лет включительно. Нужно написать программу, которая запрашивает возраст претендента и выдаёт ответ: подходит он или не подходит по этому признаку.
Какое же условие должно быть истинно для того, чтобы человека приняли на работу? Одного условия возраст >=25 не хватает, это условие соблюдается и для людей старше 40 лет. Вместе с тем условия возраст <=40 тоже недостаточно, так как оно выполняется и для школьников. В этой задаче нужно, чтобы два условия выполнялись одновременно: возраст >= 25 и возраст <= 40.
Эту задачу можно решить с помощью вложенного условного оператора, но решение получается некрасивым: оно запутанное и, кроме того, один и тот же ответ «не подходит» приходится выводить в двух местах программы.
Почти во всех языках программирования в условном операторе можно использовать такое условие:

if age >= 25 and age <= 40: 
   print( «подходит» ) 
else:
   print ( «не подходит» )

Решение получилось короткое и понятное. В условном операторе мы записали сложное условие

age >=25 and аgе <=40

составленное из двух простых с помощью логической операции И. В языке Python эта операция обозначается словом and.

Операция И (and) означает одновременное выполнение двух или нескольких условий.

В программе на языке Python можно сразу проверить выполнение двойного неравенства:

if 25 <= age <= 40: 
   print(«подходит») 
else:
   print(«не подходит»)

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

ОПЕРАЦИЯ "ИЛИ".

Рассмотрим ещё одну задачу. Самолёт из Санкт-Петербурга в Барнаул летает только по понедельникам и четвергам. В переменной day записан номер дня недели (1 — понедельник, 7 — воскресенье). Программа должна определить, полетит ли самолёт в этот день.
Если мы напишем условие day = 1 and day = 4, то это будет неверно, потому что это условие требует, чтобы значение переменной day было одновременно равно и 1, и 4. Такого быть не может, поэтому это условие всегда будет ложно. Значит, операция И не подходит. Вместо неё нужно применить другую операцию — ИЛИ, которая требует выполнения хотя бы одного из набора условий.

Операция ИЛИ  означает выполнение хотя бы одного из двух или нескольких условий.

Решение нашей задачи выглядит так:

if day == 1 or day == 4: 
   print( «Полетит!» ) 
else:
   print ( «Нет рейса.» )

В языке Python операция ИЛИ обозначается словом or (по-английски — «или»).
Можно решить задачу с помощью логической переменной:

fly = ( day == 1 or day == 4 ) 
if fly:
   print( «Полетит!» ) 
else:
   print ( «Нет рейса.» )

ОПЕРАЦИЯ "НЕ".

Существует ещё одна операция, которую можно использовать в сложных условиях — НЕ, в Python она обозначается словом not (по-английски — «не»).

Операция НЕ означает обратное условие (противоположное исходному).

Если исходное условие истинно, то обратное (противоположное) ему — ложно, и наоборот.
Например, решение задачи с самолётом можно было записать так:

if not(day == 1 or day == 4): 
   print( «Нет рейса.» ) 
else:
   print( «Полетит!» )

Используя операцию HE, можно записывать условия по-разному, как нам удобнее в каждом случае. Например, условия а==Ь и not(a!=b) истинны для одних и тех же значений а и Ь, поэтому одно из них можно заменить на другое. Такие условия называются равносильными. 
Приведём ещё примеры равносильных условий. Условие

not(x>=0 and х<=10)

означает «х не находится внутри отрезка [0; 10]». Это значит, что значение х на числовой оси расположено левее нуля или правее, чем 10. Поэтому его можно записать иначе, без использования операции НЕ:

х<0 or х>10

Обратите внимание, что в исходном выражении простые условия были связаны с помощью операции И, а в равносильном — с помощью ИЛИ.
Условие not(x==2 or х==5) означает, что значение х не равно ни двум, ни пяти, т. е. верно условие

х != 2 and х != 5

Здесь при переходе к равносильному условию без НЕ логическая операция ИЛИ была заменена на И.

ПРИМЕР №1.

Напишем программу, определяющую, является ли введённое целое число х чётным.

print(‘Определение чётности числа’)
х = int(input(‘Введите х: ‘))
if х % 2 == 0:
     print (х, ‘ — чётное число’)
else:
     print(х, ‘ — нечётное число’)

ПРИМЕР №2.

Запишем на языке Python алгоритм определения принадлежности точки х отрезку [а, b].

print(‘Определение принадлежности точки отрезку’)
а = int(input(‘Введите а: ‘))
b = int(input(‘Введите b: ‘))
х = int(input(‘Введите х: ‘))
if х >= a and х <= b:
    print(‘Точка принадлежит отрезку’)
else:
    print(‘Точка не принадлежит отрезку’)

ПРИМЕР №3.

Воспользуемся неполным условным оператором для записи на языке Python  алгоритма присваивания переменной у значения наибольшей из трёх величин а, b и с.

print (‘Нахождение наибольшей из трёх величин’)
а = int(input(‘Введите а: ‘))
b = int(input(‘Введите b: ‘))
с = int(input(‘Введите с: ‘))
y = а
if b > у:
    y = b
if с > у:
    у = с
print(‘у=’, у)

Дополните эту программу так, чтобы её выполнение приводило к присваиванию переменной у значения наибольшей из четырёх величин а, b, с и d.

ПРИМЕР №4.

Уравнение вида ах2 + bх + с = 0, где х — переменная, а, b и с — некоторые числа, причём а ≠ 0, называется квадратным уравнением. Алгоритм решения квадратного уравнения вам хорошо известен. Напишем соответствующую программу на языке Python.

from math import *
print(‘Решение квадратного уравнения’)
print (‘Введите коэффициенты а, b, с»’)
а = float (input(‘а=’))
b = float(input(‘b=’))
с = float(input(‘с=’))
d = b*b-4*a*c
if d < 0:
     print (‘Корней нет’)
if d == 0:
     x = -b / (2 * a)
     print(‘Корень уравнения x=’,x)
if d > 0:
     xl = (-b + sqrt(d)) / (2 * a)
     x2 = (-b — sqrt(d)) / (2 * a)
    print(‘Корни уравнения:’)
    print(‘xl=’,xl)
    print(‘x2=’,x2)

ПРИМЕР №5.

Воспользуемся каскадным ветвлением для записи на языке Python ещё одного варианта решения квадратного уравнения.

from math import *
print('Решение квадратного уравнения')
print ('Введите коэффициенты а, Ь, с»')
а = float(input('а='))
b = float(input('b='))
с = float (input('с='))
d = b*b-4*a*c
if d < 0:
print ('Корней нет')
elif d == 0:
x = -b / (2 * a)
print('Корень уравнения x=',x)
else:
x1 = (-b + sqrt(d)) / (2 *a)
x2 = (-b - sqrt (d) ) / (2 * a)
print('Корни уравнения:')
print('x1=', x1)
print('x2=', x2)

Используйте вложенные ветвления для записи программы, определяющей принадлежность точки х отрезку [а, b].

Выполнить домашнюю работу

Выполнить классную работу