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

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

Задачи 2.1

2.1

Задачи к главе
«Логический тип: and, or, not»

Программа отвечает на вопрос «да или нет». Сравнение даёт True или False, а and, or и not соединяют несколько проверок в одну.

Глава справочника
2.1 Логический тип: and, or, not
Можно использовать
главы 1.1–2.1
Разборов
3 с решением
Практика
15 задач без решения
Уже изучено — этим и решаем

Оператора if пока нет — он появится в главе 2.4. Программа ещё ничего не выбирает: она вычисляет логическое выражение и выводит True или False.

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

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

Разбор 1

Вход в кинозал

★☆☆базовая

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

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

  1. Проверок две: возраст не меньше 18 и билет есть. Каждую сохраняем в свою переменную.
  2. Ответ про билет приходит строкой. Сравнение answer == "да" превращает его в логическое значение.
  3. Войти можно, когда выполнены обе проверки, — значит, соединяем их через and.
main.pyрешение
# Ввод
age = int(input("Возраст: "))
answer = input("Билет есть (да/нет): ")

# Проверки
is_adult = age >= 18
has_ticket = answer == "да"

# Вывод
print("Совершеннолетний:", is_adult)
print("Билет есть:", has_ticket)
print("Можно войти:", is_adult and has_ticket)
Вывод в терминалсиним — то, что ввёл пользователь
Возраст: 20
Билет есть (да/нет): да
Совершеннолетний: True
Билет есть: True
Можно войти: True

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

Пример 1
Ввод
16
да
Вывод
Совершеннолетний: False
Билет есть: True
Можно войти: False
Пример 2
Ввод
30
нет
Вывод
Совершеннолетний: True
Билет есть: False
Можно войти: False
Почему не bool(answer)

Функция bool() считает ложью только пустую строку. Строка "нет" не пустая, поэтому bool("нет") — это True. Чтобы получить логическое значение из ответа, строку сравнивают с ожидаемым словом: answer == "да".

Зачем переменные is_adult и has_ticket

Последнюю строку можно записать как age >= 18 and answer == "да". Результат тот же, но запись is_adult and has_ticket читается без расшифровки чисел и строк.

Разбор 2

Бесплатная доставка

★★☆средняя

Интернет-магазин доставляет заказ бесплатно, если сумма заказа не меньше 3000 рублей или у покупателя есть подписка. Вводятся сумма заказа и ответ про подписку (да или нет). Выведите, бесплатна ли доставка и нужно ли за неё платить.

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

  1. Условий два, и достаточно любого из них. Это оператор or.
  2. Результат сохраняем в is_free: он нужен дважды.
  3. «Нужно платить» — это противоположный ответ. Его даёт not is_free, второй раз условие не записываем.
main.pyрешение
# Ввод
total = int(input("Сумма заказа, руб.: "))
answer = input("Подписка есть (да/нет): ")

# Проверки
is_big_order = total >= 3000
has_subscription = answer == "да"
is_free = is_big_order or has_subscription

# Вывод
print("Доставка бесплатная:", is_free)
print("Доставка платная:", not is_free)
Вывод в терминалсиним — то, что ввёл пользователь
Сумма заказа, руб.: 3500
Подписка есть (да/нет): нет
Доставка бесплатная: True
Доставка платная: False

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

Пример 1
Ввод
900
да
Вывод
Доставка бесплатная: True
Доставка платная: False
Пример 2
Ввод
900
нет
Вывод
Доставка бесплатная: False
Доставка платная: True
Пример 3
Ввод
5000
да
Вывод
Доставка бесплатная: True
Доставка платная: False
Оба условия сразу

В последнем примере выполнены оба условия: и сумма большая, и подписка есть. Оператор or в этом случае тоже даёт True: ему нужно хотя бы одно истинное условие, а не ровно одно.

Разбор 3

Отбор кандидата

★★☆средняя

На вакансию берут кандидата, который подходит по трём требованиям: возраст от 18 лет, стаж от 3 лет и не меньше 60 баллов за тест по английскому. Вводятся возраст, стаж и балл. Выведите, сколько требований выполнено и подходит ли кандидат.

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

  1. Три требования — три проверки, каждая в своей переменной.
  2. Кандидат подходит, когда выполнены все три: соединяем через and.
  3. Количество выполненных требований получаем сложением: True в арифметике равно 1, False — 0.
main.pyрешение
# Ввод
age = int(input("Возраст: "))
experience = int(input("Стаж, лет: "))
english = int(input("Балл за тест: "))

# Проверки
is_adult = age >= 18
is_experienced = experience >= 3
knows_english = english >= 60

# Расчёт
passed = is_adult + is_experienced + knows_english
fits = is_adult and is_experienced and knows_english

# Вывод
print("Выполнено требований:", passed, "из 3")
print("Кандидат подходит:", fits)
Вывод в терминалсиним — то, что ввёл пользователь
Возраст: 25
Стаж, лет: 4
Балл за тест: 72
Выполнено требований: 3 из 3
Кандидат подходит: True

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

Пример 1
Ввод
22
1
80
Вывод
Выполнено требований: 2 из 3
Кандидат подходит: False
Пример 2
Ввод
17
0
40
Вывод
Выполнено требований: 0 из 3
Кандидат подходит: False
Почему логические значения складываются

Тип bool — подкласс int, поэтому True + True + False равно 2. Сумма проверок — это количество истинных среди них.

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

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

Задача 2.1.1

Проходной балл

★☆☆базовая

Тест считается сданным, если набрано не меньше 60 баллов. Вводится балл. Выведите True, если тест сдан, и False, если нет.

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

Пример 1
Ввод
75
Вывод
True
Пример 2
Ввод
60
Вывод
True
Пример 3
Ввод
59
Вывод
False
Подсказка

Сравнение — это выражение. Его результат можно сразу передать в print().

Задача 2.1.2

Длина пароля

★☆☆базовая

Сайт принимает пароль длиной от 8 символов. Вводится пароль. Выведите, подходит ли он по длине.

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

Пример 1
Ввод
qwerty
Вывод
False
Пример 2
Ввод
sunny_day_42
Вывод
True
Пример 3
Ввод
12345678
Вывод
True
Подсказка

Длину строки возвращает len() — глава 1.2.

Задача 2.1.3

Чётная сторона улицы

★☆☆базовая

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

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

Пример 1
Ввод
14
Вывод
True
Пример 2
Ввод
27
Вывод
False
Подсказка

Чётное число делится на 2 без остатка. Остаток даёт оператор %.

Задача 2.1.4

Выходной день

★☆☆базовая

Вводится номер дня недели: 1 — понедельник, 7 — воскресенье. Выведите, выходной ли это день. Выходные — суббота и воскресенье.

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

Пример 1
Ввод
6
Вывод
True
Пример 2
Ввод
3
Вывод
False
Пример 3
Ввод
7
Вывод
True
Подсказка

Подходит любой из двух дней. У каждого сравнения своя полная запись: day == 6 or day == 7.

Задача 2.1.5

Можно ли купить товар

★☆☆базовая

Вводятся остаток товара на складе, цена товара и сумма, которая есть у покупателя. Товар можно купить, если он есть на складе и денег хватает. Выведите ответ.

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

Пример 1
Ввод
5
1200
1500
Вывод
True
Пример 2
Ввод
0
1200
1500
Вывод
False
Пример 3
Ввод
3
1200
1000
Вывод
False
Подсказка

Нужны оба условия одновременно.

Задача 2.1.6

Льготный билет

★★☆средняя

Музей продаёт льготный билет детям младше 18 лет и посетителям от 65 лет. Вводится возраст. Выведите, положен ли льготный билет и нужен ли полный.

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

Пример 1
Ввод
12
Вывод
Льготный билет: True
Полный билет: False
Пример 2
Ввод
40
Вывод
Льготный билет: False
Полный билет: True
Пример 3
Ввод
65
Вывод
Льготный билет: True
Полный билет: False
Подсказка

Льгота положена в одном из двух случаев. Второй ответ — отрицание первого.

Задача 2.1.7

Свет в коридоре

★★☆средняя

Умный дом включает свет в коридоре, если датчик заметил движение и освещённость ниже 50 люкс. Вводятся ответ датчика (да или нет) и освещённость. Выведите, нужно ли включить свет.

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

Пример 1
Ввод
да
20
Вывод
Включить свет: True
Пример 2
Ввод
да
300
Вывод
Включить свет: False
Пример 3
Ввод
нет
10
Вывод
Включить свет: False
Подсказка

Ответ датчика — строка. Логическое значение из неё получается сравнением со словом "да".

Задача 2.1.8

Логин и пароль

★★☆средняя

В системе один пользователь: логин admin, пароль qwerty123. Вводятся логин и пароль. Выведите, верен ли логин, верен ли пароль и разрешён ли вход.

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

Пример 1
Ввод
admin
qwerty123
Вывод
Логин верный: True
Пароль верный: True
Вход разрешён: True
Пример 2
Ввод
admin
12345
Вывод
Логин верный: True
Пароль верный: False
Вход разрешён: False
Пример 3
Ввод
user
qwerty123
Вывод
Логин верный: False
Пароль верный: True
Вход разрешён: False
Подсказка

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

Задача 2.1.9

Аттракцион

★★☆средняя

На аттракцион пускают посетителей ростом от 120 см. Кроме роста нужно одно из двух: возраст от 10 лет или сопровождение взрослого. Вводятся рост, возраст и ответ про сопровождение (да или нет). Выведите, можно ли на аттракцион.

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

Пример 1
Ввод
130
12
нет
Вывод
Можно на аттракцион: True
Пример 2
Ввод
125
8
да
Вывод
Можно на аттракцион: True
Пример 3
Ввод
125
8
нет
Вывод
Можно на аттракцион: False
Пример 4
Ввод
110
12
да
Вывод
Можно на аттракцион: False
Подсказка

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

Задача 2.1.10

Бонусы на карте

★★☆средняя

Вводится количество бонусов на карте покупателя. После возврата товара оно может стать отрицательным. Выведите два значения: результат bool() от количества и результат проверки «бонусов больше нуля».

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

Пример 1
Ввод
150
Вывод
bool(bonus): True
Бонусы есть: True
Пример 2
Ввод
0
Вывод
bool(bonus): False
Бонусы есть: False
Пример 3
Ввод
-30
Вывод
bool(bonus): True
Бонусы есть: False
Подсказка

bool() считает ложью только ноль. Сравните две строки вывода в третьем примере.

Задача 2.1.11

Отправка заказа

★★☆средняя

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

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

Пример 1
Ввод
да
да
да
Вывод
Можно отправлять: True
Позвонить покупателю: False
Пример 2
Ввод
да
да
нет
Вывод
Можно отправлять: False
Позвонить покупателю: True
Пример 3
Ввод
нет
да
нет
Вывод
Можно отправлять: False
Позвонить покупателю: False
Подсказка

Результат сравнения можно сохранить сразу при вводе: is_paid = input() == "да".

Задача 2.1.12

Таблица для двух ответов

★★☆средняя

Вводятся два ответа да или нет. Обозначим их A и B. Выведите три строки: результат A and B, результат A or B и результат not A.

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

Пример 1
Ввод
да
нет
Вывод
A and B: False
A or B: True
not A: False
Пример 2
Ввод
нет
нет
Вывод
A and B: False
A or B: False
not A: True
Пример 3
Ввод
да
да
Вывод
A and B: True
A or B: True
not A: False
Подсказка

Сначала превратите оба ответа в логические значения, потом применяйте операции.

Задача 2.1.13

Сданные экзамены

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

Студент сдал три экзамена. Экзамен сдан, если балл не меньше 40. Вводятся три балла. Выведите, сколько экзаменов сдано и сданы ли все три.

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

Пример 1
Ввод
55
40
90
Вывод
Сдано экзаменов: 3
Сессия закрыта: True
Пример 2
Ввод
39
70
12
Вывод
Сдано экзаменов: 1
Сессия закрыта: False
Подсказка

True в сложении равно 1. Сумма трёх проверок — количество сданных экзаменов.

Задача 2.1.14

Исправьте проверку

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

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

main.pyдано — с ошибками
age = int(input())
answer = input()
has_experience = answer = "да"
fits = age >= 18 and <= 65 and has_experience
print("Подходит:" fits)

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

Пример 1
Ввод
30
да
Вывод
Подходит: True
Пример 2
Ввод
70
да
Вывод
Подходит: False
Пример 3
Ввод
30
нет
Вывод
Подходит: False
Пример 4
Ввод
65
да
Вывод
Подходит: True
Подсказка

Проверьте три места: знак сравнения, левую часть у каждого сравнения и запятую в print().

Задача 2.1.15

Сходится ли касса

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

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

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

Пример 1
Ввод
0.1
0.2
0.3
Вывод
Точное сравнение: False
До копеек: True
Пример 2
Ввод
100.5
200.25
300.75
Вывод
Точное сравнение: True
До копеек: True
Пример 3
Ввод
10.1
5.2
15.4
Вывод
Точное сравнение: False
До копеек: False
Подсказка

Дробные числа хранятся неточно, поэтому 0.1 + 0.2 == 0.3 даёт False. Сумму перед сравнением округляют — глава 1.9.

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

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

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

Задачи к главе 2.1 · Логический тип: and, or, not · Задачник по Python Автор: Макаров Максим Николаевич