Задачник · модуль 2 · Условия

Справочник по Python · задачник · модуль 2

Задачи 2.4

2.4

Задачи к главе
«Операторы ветвления: if, elif, else»

Программа выбирает, какие строки выполнить. В задачах нужно решить, сколько вариантов действий есть, и подобрать конструкцию: if, if / else или цепочку с elif.

Глава справочника
2.4 Операторы ветвления: if, elif, else
Можно использовать
главы 1.1–2.4
Разборов
3 с решением
Практика
15 задач без решения
Уже изучено — этим и решаем

Вложенных условий пока нет — они в главе 2.5. Каждая задача решается одной цепочкой if / elif / else или несколькими отдельными if. Циклов тоже нет — они в модуле 3.

§1Разборы: как решать и оформлять

Три задачи решены полностью. В каждой перед кодом посчитано, сколько вариантов ответа возможно, — от этого зависит число веток.

Разбор 1

Хватит ли денег

★☆☆базовая

Покупатель оплачивает товар с карты. Вводятся баланс карты и цена товара. Если денег хватает, спишите цену и выведите остаток. Если не хватает, выведите, сколько рублей недостаёт.

Как рассуждаем

  1. Вариантов два: денег хватает или нет. Это if / else.
  2. Условие «хватает» — баланс не меньше цены. При равенстве покупка тоже проходит, поэтому знак >=.
  3. В каждой ветке свои действия. Строки одной ветки записаны с одинаковым отступом в четыре пробела.
main.pyрешение
# Ввод
balance = int(input("Баланс, руб.: "))
price = int(input("Цена, руб.: "))

# Выбор
if balance >= price:
    balance -= price
    print("Покупка оплачена")
    print("Остаток:", balance, "руб.")
else:
    shortage = price - balance
    print("Недостаточно средств")
    print("Не хватает:", shortage, "руб.")
Вывод в терминалсиним — то, что ввёл пользователь
Баланс, руб.: 1500
Цена, руб.: 1200
Покупка оплачена
Остаток: 300 руб.

Проверка на других данных

Пример 1
Ввод
800
1200
Вывод
Недостаточно средств
Не хватает: 400 руб.
Пример 2
Ввод
1200
1200
Вывод
Покупка оплачена
Остаток: 0 руб.
Граница в третьем примере

Баланс равен цене. Со знаком > программа отказала бы в покупке, хотя денег ровно столько, сколько нужно. Значение на границе проверяют отдельным примером.

Разбор 2

Тариф парковки

★★☆средняя

Парковка считает стоимость по времени стоянки. До 1 часа включительно — бесплатно. До 3 часов включительно — 100 рублей за каждый час. Дольше 3 часов — 150 рублей за каждый час. Вводится число полных часов. Выведите цену часа и стоимость стоянки.

Как рассуждаем

  1. Вариантов три, и подходит всегда ровно один. Это цепочка if / elif / else.
  2. В ветках только выбираем цену часа. Стоимость считаем один раз после цепочки — формула общая для всех веток.
  3. Проверки идут от меньшей границы к большей. До elif hours <= 3 программа доходит, только если часов больше 1.
main.pyрешение
# Ввод
hours = int(input("Часов стоянки: "))

# Выбор цены часа
if hours <= 1:
    rate = 0
elif hours <= 3:
    rate = 100
else:
    rate = 150

# Расчёт
cost = hours * rate

# Вывод
print("Цена часа:", rate, "руб.")
print("К оплате:", cost, "руб.")
Вывод в терминалсиним — то, что ввёл пользователь
Часов стоянки: 2
Цена часа: 100 руб.
К оплате: 200 руб.

Проверка на других данных

Пример 1
Ввод
1
Вывод
Цена часа: 0 руб.
К оплате: 0 руб.
Пример 2
Ввод
3
Вывод
Цена часа: 100 руб.
К оплате: 300 руб.
Пример 3
Ввод
5
Вывод
Цена часа: 150 руб.
К оплате: 750 руб.
Почему не пишем hours > 1 and hours <= 3

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

Общее действие — после цепочки

Строку cost = hours * rate можно было повторить в каждой ветке. Тогда при изменении формулы её пришлось бы править в трёх местах. В ветках остаётся только то, что различается.

Разбор 3

Билет по возрасту

★★☆средняя

Касса продаёт билеты: детский (до 18 лет) — 300 рублей, взрослый — 600 рублей, льготный (от 65 лет) — 400 рублей. Вводится возраст. Если введено отрицательное число или число больше 120, выведите Ошибка ввода. Иначе выведите вид билета и цену.

Как рассуждаем

  1. Вариантов четыре: ошибка и три вида билета. Первой проверяем ошибку ввода — остальные ветки тогда работают с верным возрастом.
  2. Ошибочных диапазона два: меньше 0 и больше 120. Соединяем их через or.
  3. Дальше идём по возрасту снизу вверх: до 18, до 65, все остальные.
main.pyрешение
# Ввод
age = int(input("Возраст: "))

# Выбор
if age < 0 or age > 120:
    print("Ошибка ввода")
elif age < 18:
    print("Детский билет: 300 руб.")
elif age < 65:
    print("Взрослый билет: 600 руб.")
else:
    print("Льготный билет: 400 руб.")
Вывод в терминалсиним — то, что ввёл пользователь
Возраст: 30
Взрослый билет: 600 руб.

Проверка на других данных

Пример 1
Ввод
17
Вывод
Детский билет: 300 руб.
Пример 2
Ввод
65
Вывод
Льготный билет: 400 руб.
Пример 3
Ввод
-4
Вывод
Ошибка ввода
Пример 4
Ввод
18
Вывод
Взрослый билет: 600 руб.
Порядок веток менять нельзя

Если поставить age < 65 выше, чем age < 18, ребёнок получит взрослый билет: семнадцать меньше шестидесяти пяти, первая истинная ветка выполнится, а до остальных программа не дойдёт.

Чем elif отличается от нескольких if

Отдельные if проверяются все подряд, и сработать могут несколько. В цепочке if / elif / else выполняется только одна ветка — первая, у которой условие истинно.

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

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

Задача 2.4.1

Чётное или нечётное

★☆☆базовая

Вводится целое число. Выведите Чётное или Нечётное.

Примеры для проверки

Пример 1
Ввод
8
Вывод
Чётное
Пример 2
Ввод
15
Вывод
Нечётное
Пример 3
Ввод
0
Вывод
Чётное
Подсказка

Вариантов два — подходит if / else.

Задача 2.4.2

Зачёт

★☆☆базовая

Зачёт ставят, если за тест набрано не меньше 60 баллов. Вводится балл. Выведите Зачёт или Незачёт.

Примеры для проверки

Пример 1
Ввод
74
Вывод
Зачёт
Пример 2
Ввод
60
Вывод
Зачёт
Пример 3
Ввод
59
Вывод
Незачёт
Подсказка

Проверьте решение на границе: 60 баллов — уже зачёт.

Задача 2.4.3

Изменение баланса

★☆☆базовая

Вводится сумма операции по счёту. Положительная сумма — пополнение, отрицательная — списание, ноль — операции не было. Выведите Пополнение, Списание или Без изменений.

Примеры для проверки

Пример 1
Ввод
500
Вывод
Пополнение
Пример 2
Ввод
-120
Вывод
Списание
Пример 3
Ввод
0
Вывод
Без изменений
Подсказка

Вариантов три — нужна ветка elif.

Задача 2.4.4

Где дешевле

★☆☆базовая

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

Примеры для проверки

Пример 1
Ввод
450
520
Вывод
В первом дешевле
Пример 2
Ввод
990
870
Вывод
Во втором дешевле
Пример 3
Ввод
300
300
Вывод
Цены одинаковые
Подсказка

Не забудьте третий случай: цены могут совпасть.

Задача 2.4.5

Подтверждение пароля

★☆☆базовая

При регистрации пароль вводят дважды. Вводятся две строки. Если они совпадают, выведите Пароль сохранён, иначе — Пароли не совпадают.

Примеры для проверки

Пример 1
Ввод
sunny42
sunny42
Вывод
Пароль сохранён
Пример 2
Ввод
sunny42
sunny24
Вывод
Пароли не совпадают
Подсказка

Строки сравниваются оператором ==.

Задача 2.4.6

Оценка по баллам

★★☆средняя

Балл за тест переводится в оценку: от 85 — оценка 5, от 70 — оценка 4, от 50 — оценка 3, меньше 50 — оценка 2. Вводится балл. Выведите оценку.

Примеры для проверки

Пример 1
Ввод
91
Вывод
Оценка: 5
Пример 2
Ввод
70
Вывод
Оценка: 4
Пример 3
Ввод
69
Вывод
Оценка: 3
Пример 4
Ввод
12
Вывод
Оценка: 2
Подсказка

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

Задача 2.4.7

Время суток

★★☆средняя

Вводится час от 0 до 23. Выведите время суток: Ночь (0–5), Утро (6–11), День (12–17), Вечер (18–23). Если такого часа нет, выведите Нет такого часа.

Примеры для проверки

Пример 1
Ввод
3
Вывод
Ночь
Пример 2
Ввод
11
Вывод
Утро
Пример 3
Ввод
12
Вывод
День
Пример 4
Ввод
23
Вывод
Вечер
Пример 5
Ввод
24
Вывод
Нет такого часа
Подсказка

Сначала отсеките неверный ввод. Дальше каждой ветке достаточно одной верхней границы.

Задача 2.4.8

Скидка по сумме чека

★★☆средняя

Магазин даёт скидку по сумме чека: до 1000 рублей скидки нет, от 1000 до 4999 рублей — 5%, от 5000 рублей — 10%. Вводится сумма чека. Выведите размер скидки в процентах и сумму к оплате с копейками.

Примеры для проверки

Пример 1
Ввод
6200
Вывод
Скидка: 10%
К оплате: 5580.00 руб.
Пример 2
Ввод
1000
Вывод
Скидка: 5%
К оплате: 950.00 руб.
Пример 3
Ввод
999
Вывод
Скидка: 0%
К оплате: 999.00 руб.
Пример 4
Ввод
5000
Вывод
Скидка: 10%
К оплате: 4500.00 руб.
Подсказка

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

Задача 2.4.9

Индекс массы тела

★★☆средняя

Индекс массы тела — это вес в килограммах, делённый на рост в метрах и ещё раз на рост в метрах. Вводятся вес и рост. Выведите индекс с одним знаком после точки и категорию: меньше 18.5 — ниже нормы, меньше 25 — норма, меньше 30 — выше нормы, иначе — значительно выше нормы.

Примеры для проверки

Пример 1
Ввод
70
1.75
Вывод
Индекс: 22.9
Категория: норма
Пример 2
Ввод
50
1.8
Вывод
Индекс: 15.4
Категория: ниже нормы
Пример 3
Ввод
90
1.7
Вывод
Индекс: 31.1
Категория: значительно выше нормы
Пример 4
Ввод
85
1.75
Вывод
Индекс: 27.8
Категория: выше нормы
Подсказка

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

Задача 2.4.10

Сдача в автомате

★★☆средняя

Автомат продаёт напиток. Вводятся цена напитка и внесённая сумма. Если денег не хватает, выведите, сколько нужно добавить. Если внесено ровно столько, сколько нужно, выведите Без сдачи. Если больше — выведите сдачу.

Примеры для проверки

Пример 1
Ввод
85
100
Вывод
Сдача: 15 руб.
Пример 2
Ввод
85
50
Вывод
Добавьте: 35 руб.
Пример 3
Ввод
85
85
Вывод
Без сдачи
Подсказка

Три случая: меньше, равно, больше.

Задача 2.4.11

Время года по месяцу

★★☆средняя

Вводится номер месяца. Выведите время года: Зима, Весна, Лето или Осень. Если такого месяца нет, выведите Нет такого месяца.

Примеры для проверки

Пример 1
Ввод
1
Вывод
Зима
Пример 2
Ввод
12
Вывод
Зима
Пример 3
Ввод
5
Вывод
Весна
Пример 4
Ввод
7
Вывод
Лето
Пример 5
Ввод
10
Вывод
Осень
Пример 6
Ввод
0
Вывод
Нет такого месяца
Подсказка

Зимние месяцы идут не подряд: 12, 1 и 2. Для них понадобится or.

Задача 2.4.12

Исправьте программу

★★☆средняя

Программа должна выводить одну строку — уровень заряда телефона: от 80% — Высокий, от 30% — Средний, ниже 30% — Низкий. Сейчас при заряде 90% она выводит две строки, а при 10% — ни одной. Исправьте программу.

main.pyдано — с ошибками
charge = int(input())
if charge >= 80:
    print("Высокий")
if charge >= 30:
    print("Средний")
if charge < 0:
    print("Низкий")

Примеры для проверки

Пример 1
Ввод
90
Вывод
Высокий
Пример 2
Ввод
45
Вывод
Средний
Пример 3
Ввод
10
Вывод
Низкий
Пример 4
Ввод
80
Вывод
Высокий
Подсказка

Отдельные if проверяются все. Чтобы сработала одна ветка, нужна цепочка с elif и else.

Задача 2.4.13

Комиссия за перевод

★★★повышенная

Банк берёт за перевод комиссию 1% от суммы. Комиссия не может быть меньше 30 рублей и больше 500 рублей. Вводится сумма перевода. Выведите комиссию и сумму списания с копейками.

Примеры для проверки

Пример 1
Ввод
12000
Вывод
Комиссия: 120.00 руб.
Спишется: 12120.00 руб.
Пример 2
Ввод
1500
Вывод
Комиссия: 30.00 руб.
Спишется: 1530.00 руб.
Пример 3
Ввод
80000
Вывод
Комиссия: 500.00 руб.
Спишется: 80500.00 руб.
Подсказка

Сначала посчитайте комиссию по формуле. Потом поправьте её, если она вышла за границы. Ветка else здесь не нужна.

Задача 2.4.14

Калькулятор

★★★повышенная

Вводятся число, знак операции и второе число. Знак — один из четырёх: +, -, *, /. Выведите результат. При делении на ноль выведите На ноль делить нельзя, при другом знаке — Неизвестная операция.

Примеры для проверки

Пример 1
Ввод
12
+
8
Вывод
Результат: 20.0
Пример 2
Ввод
7
*
1.5
Вывод
Результат: 10.5
Пример 3
Ввод
9
/
4
Вывод
Результат: 2.25
Пример 4
Ввод
9
/
0
Вывод
На ноль делить нельзя
Пример 5
Ввод
9
%
4
Вывод
Неизвестная операция
Подсказка

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

Задача 2.4.15

Самый дорогой товар

★★★повышенная

Вводятся цены трёх товаров. Выведите наибольшую цену. Цены могут совпадать.

Примеры для проверки

Пример 1
Ввод
300
900
500
Вывод
Наибольшая цена: 900
Пример 2
Ввод
900
300
500
Вывод
Наибольшая цена: 900
Пример 3
Ввод
300
500
900
Вывод
Наибольшая цена: 900
Пример 4
Ввод
700
700
200
Вывод
Наибольшая цена: 700
Подсказка

Первая проверка: первое число не меньше двух других. Если она ложна, наибольшее — одно из двух оставшихся.

§3Как проверить своё решение

  1. Запустите программу и введите значения из колонки «Ввод» — каждое значение отдельной строкой, после каждого Enter.
  2. Сравните то, что напечатала программа, с колонкой «Вывод» — символ в символ: пробелы, двоеточия, количество знаков после точки.
  3. Подсказки input() в примерах не показаны: текст подсказки у каждого свой, проверяется только результат.
  4. Прогоните все примеры, а не только первый: второй обычно ловит ошибку, которую первый пропускает.
Оформление, которое проверяют

Имена переменных называют смысл: total_cost, а не x. Данные — вверху, расчёт — отдельными строками, вывод — в конце. Одно и то же выражение не повторяется: результат сохраняется в переменную и дальше используется по имени.

Задачи к главе 2.4 · Операторы ветвления: if, elif, else · Задачник по Python Автор: Макаров Максим Николаевич