Занятие № 2. Решение задач с использованием условного оператора

Цель: изучить синтаксис условного оператора; научиться применять оператор if-elif-else; уметь применять простые и составные условия.

Теория

Логические значения и выражения

В Python для хранения логических значений используется тип bool. Существует только два литерала для логических значений - True (истина) и False (ложь). Результатом вычисления логического выражения является одно из двух логических значений.

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

Таблица 1: Операторы сравнения
Оператор Название Пример
< Меньше 6 < 10 – True; 52 < 5 – False.
> Больше 2 > 9 – False
<= Меньше или равно 5 <= 5– True; 5 <= 6– True.
>= Больше или равно 2 >= 3– False; 2 >= 2 – True.
== Равно "python" == "ruby" – False
!= Не равно 42 != 1 - True
±

Что из перечисленного является логическим выражением?


Значение в двойных кавычках, значит это строка.

Значение этого выражения число.

Выражение 3+4 равно 7. 7 == 7 - логическое выражение.

True и False - логические литералы. Их можно отнести к логическим выражениям.

Результат сравнения с помощью == принимает значение True или False.

Логические операторы

Для комбинирования логических выражений можно использовать логические операторы - not, and и or.

Значение следующего выражения True, если x больше 0 и меньше 10:

x = 5
print(x > 0 and x < 10)

      
x = 5
print(x > 0 and x < 10)

Следующие выражение истинно, если x делится на 2 или делится на 3:

x = 6
print(x % 2 == 0 or x % 3 == 0)

      
x = 6
print(x % 2 == 0 or x % 3 == 0)

Результат следующего логического выражения будет не истиной, если x > y и не ложью в обратном случае. Иными словами результат логического выражения инвертируется:

x = 10
y = 4
print(not x > y)

      
x = 10
y = 4
print(not x > y)

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

±

Какие из логических выражений помогут определить, что значение переменной x лежит между 0 и 5?


Значение этого логического выражения всегда будет равно True, так как любое число больше 0 или меньше 5.

Правильный вариант. Значение x одновременно больше 0 и меньше 5.

Как не странно, такой вариант записи условия допустим в Python.

Не хватает x в правой части оператора and.

Приоритет операторов

Арифметические операторы имеют больший приоритет чем операторы сравнения и логические операторы. Затем вычисляется значение выражений с операторами сравнения. Самый низкий приоритет у логических операторов. Например в выражении x * 5 >= 10 and y - 6 <= 20 в первую очередь выполнятся операторы * и -, потом произойдёт сравнение (операторы >= и <=) и в самом конце выполниться логический оператор and. В этом примере, если x = 1 a y = 7, то значение всего выражения будет равно x ? .

Таблица 2: Приоритет выполнения операторов
Приоритет Операторы
7(высокий) **
6 *, /, //, %
5 +, -
4 ==, !=, <=, >=, >, <
3 not
2 and
1(низкий) or

Какой из вариантов расстановки скобок в следующем выражении отражает последовательность выполнения операторов:

5 * 3 > 10 and 4 + 6 == 11

Обратитесь к Таблица 2.

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

У арифметических операторов приоритет выше чем у операторов сравнения.

Операторы не выполняются слева-направо, а выполняются согласно их приоритету.

and не обладает большим приоритетом, чем ==.

Инструкция “Ветвление”

Полная форма

Общая форма записи полной формы инструкции ветвления:

if <логическое выражение>:
    # если логическое выражение == True
    <блок инструкций 1>        
else:
    # если логическое выражение == False
    <блок инструкций 2>
graph TD    
    A([Начало]) --> B{Логическое<br>выражение<br>истино?}:::diamond
    B --> F(( ))
    F --> |Да| C[блок инструкций 1]
    F --> |Нет| D[блок инструкций 2]
    C --> E([Конец])
    D --> E
Рисунок 1

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

ПредупреждениеОформление отступов

Обратите внимание на правила оформления блоков инструкций. Это важно, так как в Python вложенность инструкций определяется именно отступами.

  • Блок связанных инструкций должен иметь одинаковый отступ.
  • Размер отступа может быть произвольным (рекомендовано 4 пробела).
  • Для создания отступов можно использовать пробелы или табуляцию.
  • Нельзя смешивать пробелы и символы табуляции при оформлении одного блока.

В следующем примере определим чётность или нечётность значения в переменной x:

x = 15
if x % 2 == 0:
    print(x, "чётное")
else:
    print(x, "нечётное")

      
x = 15
if x % 2 == 0:
    print(x, "чётное")
else:
    print(x, "нечётное")

Сокращённая форма

Ветвление можно записать в сокращённой форме без оператора else:

x = 10
if x < 0:
    print(x, "отрицательное число")
print("Конец программы")

      
x = 10
if x < 0:
    print(x, "отрицательное число")
print("Конец программы")

Попробуйте поменять значение x на отрицательное число и запустить программу ещё раз.

Есть ли синтаксические ошибки в следующем коде:

x = -10
if x < 0:
    print("Отрицательное число ",  x, " не подойдёт")
else:
    print(x, " положительное число")
else:
    print("Конец программы")

Последний блок else не привязан ни к одному if. В коде есть ошибка.

У каждого блока else должен быть соответствующий ему блок if. В коде есть ошибка.

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

if x < 0:
    pass   # TODO: придумать как обработать отрицательные значения

Запись без инструкции pass вызовет синтаксическую ошибку:

if x < 0:
    # Ошибка! Пустой блок инструкций
# следующие инструкции

Каскадное ветвление

Инструкции ветвления могут быть вложены друг в друга.

x = 1.6
y = 3.1
if x < y:
    print("x меньше y")
else:
    if x > y:
        print("x больше y")
    else:
        print("x равно y")

      
x = 1.6
y = 3.1
if x < y:
    print("x меньше y")
else:
    if x > y:
        print("x больше y")
    else:
        print("x равно y")

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

graph TD
    A([Начало]) --> B[x = 1.6<br>y = 3.1]
    B --> C{x < y?}
    C --> D(( ))
    D -->|Да| E[/x меньше y/]
    D -->|Нет| F{x > y?}
    F --> G(( ))
    G -->|Да| H[/x больше y/]
    G -->|Нет| I[/x равно y/]
    E --> J(( ))
    H --> J
    I --> J
    J --> K([Конец])
Рисунок 2

В Python такую последовательность условий можно записать иначе с помощью инструкции elif:

x = 1.6
y = 3.1
if x < y:
    print("x меньше y")
elif x > y:
    print("x больше y")
else:
    print("x равно y")

      
x = 1.6
y = 3.1
if x < y:
    print("x меньше y")
elif x > y:
    print("x больше y")
else:
    print("x равно y")

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

К примеру следующий код:

if x < y and x < z:
    print(1)
elif y < x and y < z:
    print(2)
else:
    print(3)

При x = 3, y = 5 и z = 2 выведет на экран цифру x .

Примеры

Познакомьтесь с готовыми решениями задач. Ответьте на вопросы после кода решения каждой задачи.

Пример № 1 (ex01.py)

Напишите программу, которая бы получала на вход температуру воздуха из прогноза погоды и выводила на экран краткую характеристику. Если температура меньше 5 градусов вывести сообщение «Холодно, оденьтесь теплее»; если температура больше либо равна 5, но меньше 20 градусов вывести сообщение «На улице прохладно»; если температура больше либо равна 20 градусов – «На улице тепло».

Блок-схема решения показана на рисунке:

Начало
Начало
Вывод
Погода на сегодня
Вывод Погода на сегодня
Ввод
t
Ввод t
Да
Да
Нет
Нет
t < 5
t < 5
Вывод
Холодно,
оденьтесь теплее
ВыводХолодно,…
Да
Да
Нет
Нет
t >= 5 И
t < 20
t >= 5 И…
Вывод
На улице прохладно
Вывод На улице прохладно
1
1
Да
Да
Нет
Нет
t >= 20
t >= 20
Вывод
На улице
тепло
ВыводНа улице…
Конец
Конец
1
1
Text is not SVG - cannot display
Рисунок 3

В алгоритме решения встречается только x сокращённая форма ветвления.


Откройте редактор IDLE и запишите код решения задачи:

print("Погода на сегодня")

t = float(input("Введите температуру в градусах Цельсия: "))
#не забывайте про отступы в условном операторе
if t < 5:
    print("Холодно, оденьтесь теплее.")

if t >= 5 and t < 20:
    print("На улице прохладно.")

if t >= 20:
    print("На улице тепло.")

Проверьте работу программы. Например, если ввести значение равное 5, то на экран выведется сообщение x На улице прохладно..


В строке номер x ? пользователь вводит температуру воздуха. В строке номер x ? используется логический оператор x И. Значение всего логического выражения будет равно True, если значения x обоих логических выражений будет равно True.


Исправьте диапазоны температур для каждого из трёх сообщений:

  • Холодно, оденьтесь теплее. - от 0 и ниже;
  • На улице прохладно. - больше 0, но меньше 15;
  • На улице тепло. - от 15 градусов.

Пример № 2 (ex02.py)

Вывести на экран номер четверти координатной плоскости, которой принадлежит точка с координатами \((х, у)\), при условии, что \(x\ne0\) и \(y\ne0\).

Координатная плоскость

Координатная плоскость

Ознакомьтесь с блок-схемой решения:

Нет
Нет
x > 0 И
y > 0
x > 0 И…
Да
Да
x < 0 И
y > 0
x < 0 И…
Нет
Нет
Начало
Начало
Ввод
x, y
Ввод x, y
x < 0 И
y < 0
x < 0 И…
Конец
Конец
Вывод
Первая четверть
Вывод Первая четверть
Да
Да
Вывод
Вторая четверть
Вывод Вторая четверть
Да
Да
Вывод
Третья четверть
Вывод Третья четверть
Нет
Нет
Вывод
Четвёртая четверть
Вывод Четвёртая четверть
Text is not SVG - cannot display
Рисунок 4

В редакторе IDLE запишите код решения задачи:

x = int(input("x:"))
y = int(input("y:"))

if x > 0 and y > 0:
    print("Первая четверть")
elif x < 0 and y > 0:
    print("Вторая четверть")
elif x < 0 and y < 0:
    print("Третья четверть")
else:
    print("Четвёртая четверть")

Проверьте работу программы.

Задания для самостоятельной работы

Решите следующие задачи самостоятельно.

Задание № 1 (sam01.py)

Пользователь вводит число в диапазоне от 1 до 7. Числа обозначают номер дня недели: 1 - Понедельник, 2 - Вторник и т.д. Выведите на экран, относится ли введённый день недели к рабочим или выходным дням. Выходными считайте субботу и воскресенье.

Примеры работы программы:

Номер:<{4}> ++enter++
Рабочий день
Номер:<{7}> ++enter++
Выходной день
Номер:<{14}> ++enter++
Ошибка ввода

Алгоритм решения и блок-схема для этой задачи похожи на решение второго примера (Рисунок 4).


Блок-схема решения с пропущенными условиями:

Нет
Нет
_________
_________
Да
Да
________
________
Нет
Нет
Начало
Начало
Ввод
num
Ввод num
Конец
Конец
Вывод
Рабочий день
Вывод Рабочий день
Да
Да
Вывод
Выходной день
Вывод Выходной день
Вывод
Ошибка ввода
Вывод Ошибка ввода
Text is not SVG - cannot display
Рисунок 5

Задание № 2 (sam02.py)

Определить, войдет ли в конверт с внутренними размерами a и b мм прямоугольная открытка размером с и d мм. Для размещения открытки в конверте необходим зазор в 1 мм с каждой стороны. Ширина всегда больше высоты. Вращать конверт и открытку нельзя.

Конверт и открытка

Конверт и открытка

Примеры работы программы:

Ширина конверта:<{162}> ++enter++
Высота конверта:<{114}> ++enter++
Ширина открытки:<{148}> ++enter++
Высота открытки:<{105}> ++enter++
Конверт подходит
Ширина конверта:<{229}> ++enter++
Высота конверта:<{114}> ++enter++
Ширина открытки:<{210}> ++enter++
Высота открытки:<{113}> ++enter++
Конверт не подходит

Задание № 3 (sam03.py)

Високосным является год, значение которого делится на 4, но при этом не делится на 100, либо делится на 400. Напишите программу, которая определяет, является ли введённый год високосным или нет, и выводит соответствующее сообщение.

Примеры работы программы:

Номер года:<{2004}> ++enter++
2004 - високосный
Номер года:<{2026}> ++enter++
2026 - не високосный

Словами условие можно записать так: остаток от деления года на 4 равен 0 И остаток от деления года на 100 не равен 0 ИЛИ остаток от деления года на 400 равен 0.

В Python остаток от деления вычисляется с помощью оператора %.

Проверка на равенство: ==, проверка на неравенство - !=.

Задание № 4 (sam04.py)

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

Примеры работы программы:

Номер месяца:<{12}> ++enter++
Зима
Номер месяца:<{7}> ++enter++
Лето
Номер месяца:<{-6}> ++enter++
Ошибка ввода

Используйте каскадную форму записи инструкции ветвления.

Учтите, что к зимним относятся месяцы с номерами 1, 2 и 12.

Достаточно прописать логические выражения для трёх пор года. Если ни одно из трёх условий не выполнится, значит выполнится ветвь else для оставшейся последней поры года. Так получится сократить код.

Задание № 5 (sam05.py)

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

\[ I=\frac{m}{h^2} \]

где \(m\) – масса тела в килограммах, \(h\) – рост в метрах. Нормой считается значение индекса в отрезке от 18 до 25. Напишите программу рассчитывающую индекс массы тела по введённым данным и выводящую сообщение в трёх случаях: значение индекса в норме, индекс меньше нормы, индекс больше нормы.

Примеры работы программы:

Масса:<{89}> ++enter++
Рост:<{1.86}> ++enter++
ИМТ: 25.725517400855587
Выше нормы
Масса:<{65}> ++enter++
Рост:<{2.1}> ++enter++
ИМТ: 14.73922902494331
Ниже нормы

Задание № 6 (sam06.py)

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

  • красный и зелёный - желтый;
  • зелёный и синий - голубой;
  • синий и красный - пурпурный.

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

Комбинации основных цветов

Комбинации основных цветов

Примеры работы программы:

Первый цвет:<{красный}> ++enter++
Второй цвет:<{зелёный}> ++enter++
красный + зелёный = желтый
Первый цвет:<{зелёный}> ++enter++
Второй цвет:<{красный}> ++enter++
зелёный + красный = желтый
Первый цвет:<{синий}> ++enter++
Второй цвет:<{зелёный}> ++enter++
синий + зелёный = голубой

Задание № 7 (sam07.py)

Составьте программу вычисления штрафа за превышение скорости. Базовая сумма штрафа - 50 рублей. За каждый 1 км/ч выше ограничения начисляется ещё 5 рублей. При превышении скорости выше 120 км/ч к штрафу прибавляется ещё 200 рублей. Пользователь вводит допустимый лимит скорости и зафиксированную скорость. Программа выводит размер штрафа если скорость превышена и сообщение “Нет превышения”, если скорость в пределах нормы.

Примеры работы программы:

Скорость:<{57}> ++enter++
Ограничение:<{60}> ++enter++
Нет превышения
Скорость:<{64}> ++enter++
Ограничение:<{60}> ++enter++
Сумма штрафа: 70 руб
Скорость:<{124}> ++enter++
Ограничение:<{110}> ++enter++
Сумма штрафа: 320 руб