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

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

Задачи 2.5

2.5

Задачи к главе
«Вложенные условия»

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

Глава справочника
2.5 Вложенные условия
Можно использовать
главы 1.1–2.5
Разборов
3 с решением
Практика
15 задач без решения
Уже изучено — этим и решаем

Тернарного оператора пока нет — он в главе 2.6. Циклов тоже нет — они в модуле 3: программа проверяет данные один раз и завершается.

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

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

Разбор 1

Вход в личный кабинет

★☆☆базовая

В системе один пользователь: логин student, пароль python2026. Вводятся логин и пароль. Если логин неверный, выведите Пользователь не найден. Если логин верный, а пароль нет — Неверный пароль. Если всё верно — Добро пожаловать.

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

  1. Проверять пароль есть смысл только для существующего логина. Значит, проверка логина внешняя, проверка пароля — внутри неё.
  2. У каждого if свой else. Он стоит на том же уровне отступа, что и его if.
  3. Сообщений три, и каждое объясняет, что именно не так.
main.pyрешение
# Ввод
login = input("Логин: ")
password = input("Пароль: ")

# Проверка
if login == "student":
    if password == "python2026":
        print("Добро пожаловать")
    else:
        print("Неверный пароль")
else:
    print("Пользователь не найден")
Вывод в терминалсиним — то, что ввёл пользователь
Логин: student
Пароль: python2026
Добро пожаловать

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

Пример 1
Ввод
student
12345
Вывод
Неверный пароль
Пример 2
Ввод
admin
python2026
Вывод
Пользователь не найден
Почему не and

Условие login == "student" and password == "python2026" отвечает только на вопрос «всё ли верно». Оно не различает две причины отказа. Когда для каждой причины нужно своё сообщение, проверки вкладывают.

Разбор 2

Выдача наличных

★★☆средняя

Банкомат выдаёт купюры по 100 рублей. Вводятся баланс счёта и запрошенная сумма. Если сумма не кратна 100, выведите Сумма должна быть кратна 100. Если кратна, но денег на счёте меньше — Недостаточно средств. Иначе выведите число купюр и остаток на счёте.

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

  1. Внешняя проверка — кратность: некратную сумму банкомат не выдаст при любом балансе.
  2. Внутри неё вторая проверка: хватает ли денег.
  3. Число купюр считаем целочисленным делением. Списание и вывод — в самой внутренней ветке.
main.pyрешение
# Ввод
balance = int(input("Баланс, руб.: "))
amount = int(input("Сумма, руб.: "))

# Проверка
if amount % 100 == 0:
    if amount <= balance:
        notes = amount // 100
        balance -= amount
        print("Купюр выдано:", notes)
        print("Остаток:", balance, "руб.")
    else:
        print("Недостаточно средств")
else:
    print("Сумма должна быть кратна 100")
Вывод в терминалсиним — то, что ввёл пользователь
Баланс, руб.: 5000
Сумма, руб.: 1500
Купюр выдано: 15
Остаток: 3500 руб.

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

Пример 1
Ввод
5000
1550
Вывод
Сумма должна быть кратна 100
Пример 2
Ввод
1000
1500
Вывод
Недостаточно средств
Пример 3
Ввод
1500
1500
Вывод
Купюр выдано: 15
Остаток: 0 руб.
Как читать вложенный код

Отступ показывает, при каких условиях строка выполнится. Строка balance -= amount стоит на втором уровне: она сработает, только если истинны оба условия над ней — и про кратность, и про баланс.

Разбор 3

Билет в музей

★★☆средняя

Цена билета в музей зависит от дня недели и возраста. В будни детям до 7 лет вход бесплатный, остальным — 300 рублей. В выходные детям до 7 лет — 100 рублей, посетителям до 18 лет — 250 рублей, взрослым — 500 рублей. Вводятся номер дня недели (1 — понедельник, 7 — воскресенье) и возраст. Выведите тип дня и цену билета.

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

  1. Сначала решаем, будний день или выходной: от этого зависит весь прайс. Это внешняя проверка.
  2. Внутри каждой ветки — своя проверка возраста. В будни вариантов два, в выходные три.
  3. В ветках только выбираем цену. Выводим её один раз после всех проверок.
main.pyрешение
# Ввод
day = int(input("День недели (1-7): "))
age = int(input("Возраст: "))

# Выбор цены
if day <= 5:
    print("Будний день")
    if age < 7:
        price = 0
    else:
        price = 300
else:
    print("Выходной день")
    if age < 7:
        price = 100
    elif age < 18:
        price = 250
    else:
        price = 500

# Вывод
print("Цена билета:", price, "руб.")
Вывод в терминалсиним — то, что ввёл пользователь
День недели (1-7): 3
Возраст: 30
Будний день
Цена билета: 300 руб.

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

Пример 1
Ввод
2
5
Вывод
Будний день
Цена билета: 0 руб.
Пример 2
Ввод
6
5
Вывод
Выходной день
Цена билета: 100 руб.
Пример 3
Ввод
7
15
Вывод
Выходной день
Цена билета: 250 руб.
Пример 4
Ввод
6
40
Вывод
Выходной день
Цена билета: 500 руб.
Действие между проверками

Строка print("Будний день") стоит во внешней ветке перед внутренним if. Она выполняется для любого возраста. Это одна из причин вкладывать условия: у внешней ветки есть общее действие.

Когда хватило бы and

Если от программы нужен только ответ на один вопрос, например «бесплатный ли вход», вложение не требуется: day <= 5 and age < 7. Вложение нужно, когда у разных сочетаний разные действия.

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

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

Задача 2.5.1

Турникет в метро

★☆☆базовая

Поездка стоит 50 рублей. Вводятся ответ, приложена ли карта (да или нет), и баланс карты. Если карта не приложена, выведите Приложите карту. Если приложена и денег хватает — Проходите, если не хватает — Недостаточно средств.

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

Пример 1
Ввод
да
120
Вывод
Проходите
Пример 2
Ввод
да
30
Вывод
Недостаточно средств
Пример 3
Ввод
нет
500
Вывод
Приложите карту
Пример 4
Ввод
да
50
Вывод
Проходите
Подсказка

Баланс проверяют только у приложенной карты. Проверка карты — внешняя.

Задача 2.5.2

Доставка пиццы

★☆☆базовая

Пиццерия доставляет заказы только в своей зоне. В зоне доставка бесплатна при заказе от 800 рублей, иначе стоит 150 рублей. Вводятся ответ, входит ли адрес в зону (да или нет), и сумма заказа. Выведите Доставка бесплатная, Доставка 150 руб. или По этому адресу не доставляем.

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

Пример 1
Ввод
да
1200
Вывод
Доставка бесплатная
Пример 2
Ввод
да
500
Вывод
Доставка 150 руб.
Пример 3
Ввод
нет
3000
Вывод
По этому адресу не доставляем
Подсказка

Сумма заказа важна только для адреса в зоне доставки.

Задача 2.5.3

Количество товара

★☆☆базовая

Покупатель вводит количество товара. Если число не положительное, выведите Количество должно быть больше нуля. Товар продают парами: при положительном чётном числе выведите Заказ принят, при нечётном — Товар продаётся парами.

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

Пример 1
Ввод
6
Вывод
Заказ принят
Пример 2
Ввод
5
Вывод
Товар продаётся парами
Пример 3
Ввод
0
Вывод
Количество должно быть больше нуля
Пример 4
Ввод
-2
Вывод
Количество должно быть больше нуля
Подсказка

Чётность проверяют только у положительного числа.

Задача 2.5.4

Допуск к защите

★☆☆базовая

К защите проекта допускают студентов с зачётом по курсу, которые сдали не меньше 8 лабораторных работ. Вводятся ответ про зачёт (да или нет) и число сданных работ. Выведите Допущен, Не хватает работ: N или Сначала получите зачёт.

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

Пример 1
Ввод
да
9
Вывод
Допущен
Пример 2
Ввод
да
5
Вывод
Не хватает работ: 3
Пример 3
Ввод
нет
10
Вывод
Сначала получите зачёт
Подсказка

Число недостающих работ — разность между нормой и сданным.

Задача 2.5.5

Зонт

★☆☆базовая

Вводятся два ответа да или нет: идёт ли дождь и есть ли зонт. Без дождя выведите Зонт не нужен. В дождь с зонтом — Возьмите зонт, без зонта — Подождите дома.

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

Пример 1
Ввод
да
да
Вывод
Возьмите зонт
Пример 2
Ввод
да
нет
Вывод
Подождите дома
Пример 3
Ввод
нет
нет
Вывод
Зонт не нужен
Подсказка

Логическая переменная сама служит условием: if is_raining:.

Задача 2.5.6

Оформление заказа

★★☆средняя

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

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

Пример 1
Ввод
10
3
450
карта
Вывод
Сумма заказа: 1350 руб.
Оплата онлайн
Пример 2
Ввод
10
10
450
наличные
Вывод
Сумма заказа: 4500 руб.
Оплата курьеру
Пример 3
Ввод
2
3
450
карта
Вывод
На складе только: 2
Подсказка

Сумму считают и выводят во внешней ветке до проверки способа оплаты: она нужна при любом способе.

Задача 2.5.7

Скидка постоянным покупателям

★★☆средняя

Постоянный покупатель получает скидку 15% при чеке от 3000 рублей и 10% при меньшем чеке. Остальные покупатели получают 5% при чеке от 5000 рублей, а при меньшем чеке скидки нет. Вводятся ответ, постоянный ли покупатель (да или нет), и сумма чека. Выведите скидку и сумму к оплате с копейками.

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

Пример 1
Ввод
да
4000
Вывод
Скидка: 15%
К оплате: 3400.00 руб.
Пример 2
Ввод
да
1200
Вывод
Скидка: 10%
К оплате: 1080.00 руб.
Пример 3
Ввод
нет
6000
Вывод
Скидка: 5%
К оплате: 5700.00 руб.
Пример 4
Ввод
нет
4000
Вывод
Скидка: 0%
К оплате: 4000.00 руб.
Подсказка

Внешняя проверка делит покупателей на две группы. У каждой группы своя граница суммы.

Задача 2.5.8

Наибольшее из трёх

★★☆средняя

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

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

Пример 1
Ввод
12
30
18
Вывод
Больше всего заказов: 30
Пример 2
Ввод
30
12
18
Вывод
Больше всего заказов: 30
Пример 3
Ввод
12
18
30
Вывод
Больше всего заказов: 30
Пример 4
Ввод
20
20
5
Вывод
Больше всего заказов: 20
Подсказка

После первого сравнения остаётся один претендент из первых двух. Его сравнивают с третьим числом.

Задача 2.5.9

Существует ли дата

★★☆средняя

Вводятся номер месяца и день. Год не високосный: в феврале 28 дней, в апреле, июне, сентябре и ноябре — 30, в остальных месяцах — 31. Если месяц неверный, выведите Нет такого месяца. Иначе выведите число дней в месяце и ответ: Дата существует или Нет такого дня.

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

Пример 1
Ввод
2
28
Вывод
Дней в месяце: 28
Дата существует
Пример 2
Ввод
2
30
Вывод
Дней в месяце: 28
Нет такого дня
Пример 3
Ввод
4
31
Вывод
Дней в месяце: 30
Нет такого дня
Пример 4
Ввод
12
31
Вывод
Дней в месяце: 31
Дата существует
Пример 5
Ввод
13
1
Вывод
Нет такого месяца
Подсказка

Внутри ветки с верным месяцем две проверки подряд: первая выбирает число дней, вторая сравнивает с ним введённый день.

Задача 2.5.10

Поездка на такси

★★☆средняя

Километр в тарифе эконом стоит 25 рублей днём и 35 рублей ночью. В тарифе комфорт — 40 рублей днём и 55 рублей ночью. Ночь — с 23 часов до 6 часов утра. Вводятся тариф, час начала поездки (0–23) и расстояние в километрах. Выведите цену километра и стоимость поездки.

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

Пример 1
Ввод
эконом
14
12
Вывод
Цена километра: 25 руб.
Стоимость поездки: 300 руб.
Пример 2
Ввод
эконом
23
12
Вывод
Цена километра: 35 руб.
Стоимость поездки: 420 руб.
Пример 3
Ввод
комфорт
5
8
Вывод
Цена километра: 55 руб.
Стоимость поездки: 440 руб.
Пример 4
Ввод
комфорт
6
8
Вывод
Цена километра: 40 руб.
Стоимость поездки: 320 руб.
Подсказка

Условие «ночь» запишите один раз в логическую переменную до ветвления — оно нужно в обеих внешних ветках.

Задача 2.5.11

Зачисление

★★☆средняя

С баллом от 75 абитуриента зачисляют на бюджет. С баллом от 50 до 74 предлагают платное место, и всё зависит от его согласия. С баллом ниже 50 не зачисляют. Вводятся балл и ответ, согласен ли абитуриент на платное обучение (да или нет). Выведите Зачислен на бюджет, Зачислен на платное, Отказался от места или Не прошёл по баллам.

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

Пример 1
Ввод
80
нет
Вывод
Зачислен на бюджет
Пример 2
Ввод
60
да
Вывод
Зачислен на платное
Пример 3
Ввод
60
нет
Вывод
Отказался от места
Пример 4
Ввод
40
да
Вывод
Не прошёл по баллам
Подсказка

Согласие важно только в средней ветке. Вложенный if может стоять внутри elif.

Задача 2.5.12

Парковка торгового центра

★★☆средняя

С чеком из магазина первые 3 часа парковки бесплатны, каждый следующий час стоит 50 рублей. Без чека бесплатен только первый час, каждый следующий стоит 100 рублей. Вводятся ответ про чек (да или нет) и число часов. Выведите стоимость парковки.

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

Пример 1
Ввод
да
2
Вывод
К оплате: 0 руб.
Пример 2
Ввод
да
5
Вывод
К оплате: 100 руб.
Пример 3
Ввод
нет
1
Вывод
К оплате: 0 руб.
Пример 4
Ввод
нет
4
Вывод
К оплате: 300 руб.
Подсказка

Платные часы — это все часы минус бесплатные. Формулу применяют, только когда часов больше, чем бесплатных.

Задача 2.5.13

Заказ в аптеке

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

Интернет-аптека принимает заказ только у совершеннолетних. Лекарство без рецепта продают сразу. Рецептурное продают, только если покупатель загрузил рецепт. Вводятся возраст и два ответа да или нет: рецептурное ли лекарство и загружен ли рецепт. Выведите Заказ принят, Загрузите рецепт или Заказ доступен с 18 лет.

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

Пример 1
Ввод
25
да
да
Вывод
Заказ принят
Пример 2
Ввод
25
да
нет
Вывод
Загрузите рецепт
Пример 3
Ввод
25
нет
нет
Вывод
Заказ принят
Пример 4
Ввод
16
нет
нет
Вывод
Заказ доступен с 18 лет
Подсказка

Уровней вложения три: возраст, вид лекарства, наличие рецепта. Рецепт проверяют только у рецептурного лекарства.

Задача 2.5.14

Чей это else

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

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

main.pyдано — работает неверно
age = int(input())
in_list = input() == "да"
if age >= 18:
    if in_list:
        print("Добро пожаловать")
    else:
        print("Вход только с 18 лет")

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

Пример 1
Ввод
20
да
Вывод
Добро пожаловать
Пример 2
Ввод
20
нет
Вывод
Вас нет в списке
Пример 3
Ввод
16
да
Вывод
Вход только с 18 лет
Подсказка

Ветка else относится к тому if, под которым стоит с тем же отступом. В программе не хватает одной ветки.

Задача 2.5.15

Меньше вложенности

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

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

main.pyдано — переписать
has_card = input() == "да"
has_debt = input() == "да"
in_stock = input() == "да"
if has_card:
    if not has_debt:
        if in_stock:
            print("Книга выдана")
        else:
            print("Отказ")
    else:
        print("Отказ")
else:
    print("Отказ")

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

Пример 1
Ввод
да
нет
да
Вывод
Книга выдана
Пример 2
Ввод
да
да
да
Вывод
Отказ
Пример 3
Ввод
нет
нет
да
Вывод
Отказ
Пример 4
Ввод
да
нет
нет
Вывод
Отказ
Подсказка

Во всех ветках else одно и то же сообщение. Значит, причины отказа программа не различает, и три проверки можно соединить через and.

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

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

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

Задачи к главе 2.5 · Вложенные условия · Задачник по Python Автор: Макаров Максим Николаевич