4.6. Программирование составных условий
Информатика, 7 класс. Учебник: Кадыркулов Р. А., Рыскулбекова А. Д., Нурмуханбетова Г. К. (Алматыкітап баспасы, 2023). Раздел 4: Программирование алгоритмов на языке Python. Страницы 125–129.
Чему научишься
- Объяснять, что такое составное условие и чем оно отличается от простого.
- Соединять условия словами
and(«и»),or(«или») иnot(«не»). - Вычислять значение логического выражения:
TrueилиFalse. - Писать на Python программы с составными условиями и проверять их на тестах.
Разминка
- Как можно объединить несколько связанных условий в одно общее? Приведи примеры. Соединить их словами «и» или «или». Например: «Если сегодня суббота И на улице тепло, идём в парк». Или: «Возьму зонт, если идёт дождь ИЛИ обещают грозу».
- Что такое простое условие? Это одна проверка:
x > 5,age == 12,name != "Айдар". Она бывает только верной (True) или неверной (False). - Что будет, если в программе поставить два
ifподряд, а не один? Каждыйifпроверится отдельно. Для связанных условий это неудобно, нужен один общийif.
Разбираемся
Зачем одного условия мало
Простое условие проверяет одну вещь. Но в жизни часто нужно проверить несколько вещей сразу.
Чтобы покататься на горке в аквапарке, нужно быть выше 120 см и старше 7 лет. Это уже два условия. Их соединяют в одно, и получается составное условие.
📌 Составное условие — несколько простых условий, соединённых логическими операциями. Результат всегда один:
True(истина) илиFalse(ложь).
Логических операций три: and, or, not.
and: нужно, чтобы выполнилось всё
and значит «и» (по-научному конъюнкция, логическое умножение). Всё выражение верно, только если верны оба условия.
Вспомни футбольную секцию: чтобы выйти на поле, нужны и форма, и бутсы. Нет бутс — на поле не пустят.
or: хватит одного
or значит «или» (дизъюнкция, логическое сложение). Выражение верно, если верно хотя бы одно условие. Неверно оно только тогда, когда не выполнено ни одно.
Скидка в кинотеатре: «Ребёнок до 7 лет ИЛИ пенсионер». Хватит любого из двух.
not: наоборот
not значит «не» (инверсия, отрицание). Он переворачивает результат: было True — стало False, и наоборот. not (5 > 6) это «неверно, что 5 больше 6», то есть True.
Таблица истинности
Пусть A и B — два простых условия. Вот что получается при всех сочетаниях:
| A | B | not A | A and B | A or B |
|---|---|---|---|---|
| True | True | False | True | True |
| True | False | False | False | True |
| False | False | True | False | False |
| False | True | True | False | True |
💡 Запомни просто.
andстрогий: нужно всё.orдобрый: достаточно одного.notвредный: говорит наоборот.
📕 В таблице учебника значения записаны с маленькой буквы:
true,false. В Python они пишутся с большой:True,False. Если написатьtrue, Python ответит ошибкойNameError: name 'true' is not defined.
Считаем логические выражения
📌 Приоритет логических операций:
notсамый сильный, потомand, потомor. Сравнения (>,==) считаются раньше всех трёх.
Составное условие в программе
Задача: аттракцион пускает, если возраст не меньше 7 лет и рост не меньше 120 см. Вводим два числа через пробел.
# вводим возраст и рост через пробел
age, height = map(int, input().split())
# оба условия должны быть верны одновременно
if age >= 7 and height >= 120:
print('можно')
else:
print('нельзя')
| Ввод | Что происходит | Вывод |
|---|---|---|
10 130 |
10 >= 7 верно, 130 >= 120 верно | можно |
10 110 |
возраст подходит, рост нет | нельзя |
6 125 |
рост подходит, возраст нет | нельзя |
7 120 |
оба значения ровно на границе, >= их пропускает |
можно |
5 100 |
не подходит ни то, ни другое | нельзя |
Теперь с or: скидка полагается детям до 7 лет и тем, кому 65 или больше.
age = int(input())
# достаточно, чтобы выполнялось любое из условий
if age < 7 or age >= 65:
print('скидка')
else:
print('без скидки')
| Ввод | Вывод |
|---|---|
5 |
скидка |
30 |
без скидки |
65 |
скидка (граница) |
7 |
без скидки (граница) |
64 |
без скидки |
⚠️ Частая ошибка. Нельзя писать
if x == 1 or 2:. Python прочитает это как «x равно 1, или просто число 2», а число 2 для него всегда «истина». Условие сработает всегда, даже приx = 100. Правильно:if x == 1 or x == 2:. С каждой стороны отandиorдолжно стоять полное условие.
Пример из учебника: взаимно обратные числа
Два числа называют взаимно обратными, если их произведение равно 1. Например, 4 и 0.25: 4 · 0.25 = 1. Среди трёх чисел a, b, c нужно найти хотя бы одну такую пару. Подходят три проверки: a * b == 1, a * c == 1, b * c == 1. Хватит любой, значит нужен or.
# числа вводим как дробные: float принимает и 4, и 0.25
a, b, c = map(float, input().split())
# достаточно, чтобы взаимно обратной оказалась любая пара
if (a * b == 1) or (a * c == 1) or (b * c == 1):
print('да')
else:
print('нет')
| Ввод | Проверки | Вывод |
|---|---|---|
4 10 0.25 |
4 · 0.25 = 1, пара нашлась | да |
2 3 5 |
6, 10 и 15, ни одна не равна 1 | нет |
0.5 2 7 |
0.5 · 2 = 1 | да |
1 1 5 |
1 · 1 = 1 | да |
📕 В учебнике программа читает числа через
int(), но тогда ввод4 10 0.25из самого примера даст ошибку:int('0.25')не превращается в число. Правильно использоватьfloat(). Ещё дробные числа вводят с точкой:0.25, а не0,25.
💡 Для дробей сравнение
== 1не всегда надёжно: в компьютере дроби хранятся приближённо. Например,49 * (1 / 49) == 1дастFalse. Для школьных тестов с «хорошими» числами вроде 0.25 или 0.5 всё работает.
👨👩👧 Родителю. Попросите ребёнка придумать составное условие из семейной жизни: «Можно играть в телефон, если уроки сделаны И прошёл час». А потом спросите: что произойдёт, если заменить «И» на «ИЛИ»? Так ребёнок на пальцах увидит разницу между
andиor.
Проверь себя
- Чем составное условие отличается от простого? Простое — одна проверка. Составное — несколько проверок, соединённых
and,orилиnot. - Когда
A and Bверно? Только когда верны и A, и B. - Когда
A or Bневерно? Только когда неверны и A, и B. - Чему равно
not (10 > 3)?False: условие верно, аnotего переворачивает. - Как проверить, что число x лежит между 10 и 20, не включая их?
x > 10 and x < 20.
Решаем упражнения
Практическая работа
№ 1 · «Практическая работа», задание 1
Точка A задана координатами x и y. Определи, в какой четверти координатной плоскости она лежит. Пример: ввод -4 5, результат «II четверть».
Как думать. Четверть зависит от знаков x и y. В каждой четверти знаки свои. Значит, для каждой четверти нужно составное условие: «знак x такой И знак y такой».
| Четверть | Знак x | Знак y | Условие |
|---|---|---|---|
| I | + | + | x > 0 and y > 0 |
| II | − | + | x < 0 and y > 0 |
| III | − | − | x < 0 and y < 0 |
| IV | + | − | x > 0 and y < 0 |
Решение.
# вводим координаты точки
x, y = map(int, input().split())
# для каждой четверти своё составное условие
if x > 0 and y > 0:
print('I четверть')
if x < 0 and y > 0:
print('II четверть')
if x < 0 and y < 0:
print('III четверть')
if x > 0 and y < 0:
print('IV четверть')
Проверяем, перебрав все сочетания знаков:
| Ввод | x | y | Вывод |
|---|---|---|---|
3 7 |
+ | + | I четверть |
-4 5 |
− | + | II четверть |
-2 -9 |
− | − | III четверть |
6 -1 |
+ | − | IV четверть |
0 4 |
ноль | + | ничего не выводится |
💡 Последняя строка — граничный случай. Точка с нулевой координатой лежит на оси, а не в четверти, и ни одно условие не сработает. Если хочешь, чтобы программа это замечала, добавь проверку
if x == 0 or y == 0: print('на оси').
📕 На блок-схеме (рис. 3) в последнем ромбе напечатано
x>0 and y>0, а должно бытьx>0 and y<0: условиеx>0 and y>0уже было в первом ромбе и для IV четверти не годится. В самой программе (рис. 4) здесь написано правильно.
Ответ: для каждой четверти своё условие из таблицы выше. Для ввода -4 5 программа печатает «II четверть».
Анализ
№ 2 · «Анализ»
Дана программа (рис. 5): читаются три числа a, b, c, потом if a==b and a==c and b==c: печатается «да», иначе «нет». 1) Для какой задачи она написана? 2) Какой логический оператор в ней использован? Составь блок-схему. 3) Что изменить, чтобы программа определяла равнобедренность треугольника по трём сторонам (рис. 6)?
Как думать. Прочитай условие вслух: «a равно b, и a равно c, и b равно c». Это про равенство всех трёх чисел.
Решение.
Программа проверяет, равны ли все три числа между собой. Если числа — стороны треугольника, она отвечает на вопрос «равносторонний ли он?».
Использован оператор
and(логическое «и», конъюнкция): «да» печатается, только если верны все три равенства сразу. Блок-схема:
Начало
|
Ввод a, b, c
|
a == b and a == c and b == c ?
| да | нет
Вывод «да» Вывод «нет»
|___________________|
|
Конец
- У равнобедренного треугольника равны любые две стороны, а не обязательно все три. Поэтому
andменяем наor:
a, b, c = map(int, input().split())
# достаточно, чтобы совпала любая пара сторон
if a == b or a == c or b == c:
print('да')
else:
print('нет')
| Ввод | Вывод | Почему |
|---|---|---|
5 5 5 |
да | все равны (равносторонний тоже считается равнобедренным) |
5 5 6 |
да | равны a и b |
6 4 6 |
да | равны a и c |
3 4 5 |
нет | все разные |
⚠️ Частая ошибка. Три числа ещё не делают треугольник. Стороны должны подходить друг другу: каждая меньше суммы двух других. Для
2 2 7программа скажет «да», но треугольника со сторонами 2, 2 и 7 не существует. Чтобы это учесть, добавь условие:a + b > c and a + c > b and b + c > a and (a == b or a == c or b == c).
Ответ: 1) определяет, равны ли три числа (равносторонность); 2) and, блок-схема выше; 3) заменить and на or.
Вопросы для размышления
№ 3 · «Вопросы для размышления», вопрос 1
Чем похожи и чем отличаются составные и вложенные условия?
Как думать. Вспомни прошлый урок про вложенные условия и сравни два способа проверить «и».
Пример ответа. Сходство: и те и другие проверяют несколько условий, а не одно. Различие в записи. Вложенное условие — это if внутри if: сначала проверяется внешний, и только если он верен, внутренний. Составное условие — один if, где условия соединены and, or или not.
Для and оба способа дают один результат:
# вложенные условия
if age >= 7:
if height >= 120:
print('можно')
# то же самое одним составным условием
if age >= 7 and height >= 120:
print('можно')
Но составное условие короче и умеет то, что вложенным неудобно: например, or.
Ответ: оба проверяют несколько условий; вложенное — if внутри if, составное — один if с and/or/not.
№ 4 · «Вопросы для размышления», вопрос 2
В каких случаях в программе нужно составное условие?
Как думать. Ищи в задаче слова «и», «или», «не», «оба», «хотя бы один».
Пример ответа. Когда решение зависит сразу от нескольких условий:
- нужно, чтобы выполнилось всё сразу (
and): все числа положительные, возраст и рост подходят; - хватит любого из условий (
or): число делится на 2 или на 3, одна из сторон равна другой; - нужно перевернуть условие (
not): «пускать всех, кроме...».
Ответ: когда результат зависит от нескольких условий сразу и их надо соединить словами «и», «или» либо «не».
№ 5 · «Вопросы для размышления», вопрос 3
Как написать составное условие, чтобы убедиться, что оба заданных числа a и b нечётные?
Как думать. Нечётное число при делении на 2 даёт остаток 1. Обе проверки нужны сразу, значит and.
Решение.
a, b = map(int, input().split())
# нечётное: остаток от деления на 2 равен 1
if a % 2 == 1 and b % 2 == 1:
print('оба нечётные')
else:
print('нет')
| Ввод | Вывод |
|---|---|
3 7 |
оба нечётные |
3 4 |
нет |
-3 5 |
оба нечётные |
8 9 |
нет |
Для отрицательных чисел это тоже работает: в Python -3 % 2 равно 1.
Ответ: if a % 2 == 1 and b % 2 == 1:.
№ 6 · «Вопросы для размышления», вопрос 4
В чём важность использования логических действий в программировании?
Как думать. Что было бы, если программа умела проверять только одно условие за раз?
Пример ответа. Логические действия позволяют программе принимать решения так, как это делает человек: учитывать сразу несколько условий. Без and, or, not пришлось бы писать длинные цепочки вложенных if. С ними код короче, понятнее и меньше шансов ошибиться. Игры, банковские приложения и пропуска в метро всё время проверяют составные условия.
Ответ: они позволяют учитывать сразу несколько условий, делают программу короче и понятнее.
Задание
№ 7 · «Задание», задача 1
Базовый уровень. Найди значения логических выражений для пар чисел a и b из таблицы (true или false):
| a | b | Выражение 1 | Выражение 2 |
|---|---|---|---|
| 10 | 56 | a>5 or b>a |
a%5==0 and b>a |
| 0 | 1 | a>b or b==1 |
a>b and b==1 |
| 8 | -7 | a<50 or b>a |
a//2!=1 and b+15==a |
| -8 | -9 | a>-8 or b==a |
a**2>0 and b==a-1 |
| 7 | 5 | a==5 or b!=a |
a+b==17 and b!=a |
Как думать. Подставь числа, посчитай каждое простое сравнение, потом соедини результаты по and или or. a // 2 — целая часть от деления, a % 5 — остаток.
Решение.
- a = 10, b = 56. Выражение 1:
10 > 5верно, значит всё верно, True. Выражение 2:10 % 5 == 0верно,56 > 10верно, True. - a = 0, b = 1. Выражение 1:
0 > 1неверно, но1 == 1верно,orпропускает, True. Выражение 2:0 > 1неверно, значитandне сработает, False. - a = 8, b = -7. Выражение 1:
8 < 50верно, True. Выражение 2:8 // 2равно 4,4 != 1верно;-7 + 15равно 8,8 == 8верно; оба верны, True. - a = -8, b = -9. Выражение 1:
-8 > -8неверно и-9 == -8неверно, False. Выражение 2:(-8) ** 2равно 64,64 > 0верно;a - 1равно -9,-9 == -9верно, True. - a = 7, b = 5. Выражение 1:
7 == 5неверно, но5 != 7верно, True. Выражение 2:7 + 5равно 12, а не 17,andне сработает, False.
Ответ:
| a | b | Выражение 1 | Выражение 2 |
|---|---|---|---|
| 10 | 56 | True | True |
| 0 | 1 | True | False |
| 8 | -7 | True | True |
| -8 | -9 | False | True |
| 7 | 5 | True | False |
№ 8 · «Задание», задача 2
Средней сложности. Чему будет равна переменная b после выполнения каждой из двух программ?
Программа 1:
a = 10
b = 5
if a > 5 and a < b:
b -= 10
print(b)
Программа 2:
a = 15
b = 8
if a > 1 or a < b:
b += 7
if a > 1 and a == b:
b %= 4
print(b)
Как думать. Идём по строкам сверху вниз и после каждой записываем значения a и b. b -= 10 значит b = b - 10, а b %= 4 значит b = b % 4.
Решение.
Программа 1: a > 5 верно (10 > 5), а a < b неверно (10 < 5 ложь). True and False даёт False, тело if не выполняется, b остаётся 5.
Программа 2:
- a = 15, b = 8.
- Первый
if:15 > 1верно,orдаёт True. Тело выполняется: b = 8 + 7 = 15. - Второй
if:a > 1верно,a == bтеперь тоже верно (15 == 15). Тело выполняется: b = 15 % 4 = 3. - Выводится 3.
Ответ: программа 1 выведет 5, программа 2 выведет 3 (проверено запуском).
№ 9 · «Задание», задача 3
Базовый уровень. Даны целые числа a, b и c через пробел. Если все три положительные, выведи 1, иначе 0. Пример: ввод 5 -6 8, результат 0.
Как думать. «Все три» значит and. Положительное — строго больше нуля, ноль не подходит.
Решение.
a, b, c = map(int, input().split())
# все три числа должны быть больше нуля
if a > 0 and b > 0 and c > 0:
print(1)
else:
print(0)
| Ввод | Вывод | Почему |
|---|---|---|
5 -6 8 |
0 | b отрицательное |
3 4 5 |
1 | все больше нуля |
0 2 3 |
0 | ноль не положительный (граница) |
-1 -2 -3 |
0 | все отрицательные |
Ответ: if a > 0 and b > 0 and c > 0: print(1), иначе print(0).
№ 10 · «Задание», задача 4
⭐ повышенной сложности. Во входном файле Input.txt записано четырёхзначное число N. С помощью составного условия определи, палиндром ли оно (читается одинаково слева направо и справа налево, например 2662). Если палиндром, запиши в выходной файл Output.txt число 1, иначе 0. Примеры: 4224 даёт 1, 3423 даёт 0.
Как думать. У числа abcd палиндром получается, когда первая цифра равна последней и вторая равна третьей. Цифры достаём делением: n // 1000 — первая, n // 100 % 10 — вторая, n // 10 % 10 — третья, n % 10 — последняя.
Решение. Файл input.txt лежит в одной папке с программой.
Содержимое input.txt до запуска:
4224
# читаем число из файла
with open('input.txt') as f:
n = int(f.readline())
a = n // 1000 # первая цифра
b = n // 100 % 10 # вторая
c = n // 10 % 10 # третья
d = n % 10 # четвёртая
# палиндром: первая равна последней И вторая равна третьей
if a == d and b == c:
result = 1
else:
result = 0
# записываем ответ в файл
with open('output.txt', 'w') as f:
f.write(str(result))
После запуска появится output.txt с одной цифрой:
1
Проверка на других числах (в каждом тесте в input.txt одно число):
| input.txt | output.txt | Почему |
|---|---|---|
4224 |
1 | 4 = 4 и 2 = 2 |
3423 |
0 | 3 == 3, но 4 != 2 |
2662 |
1 | палиндром |
2686 |
0 | 2 не равно 6 |
1001 |
1 | нули в середине не мешают |
1000 |
0 | 1 не равно 0 |
Ответ: if a == d and b == c: пишем 1 в output.txt, иначе 0.
№ 11 · «Задание», задача 5
Средней сложности. K — трёхзначное число. Есть ли в нём две одинаковые цифры? Если да, выведи 1, иначе 0. Примеры: 343 даёт 1, 486 даёт 0.
Как думать. Трёх цифр три пары: первая и вторая, первая и третья, вторая и третья. Хватит совпадения любой пары, значит нужен or.
Решение.
k = int(input())
a = k // 100 # сотни
b = k // 10 % 10 # десятки
c = k % 10 # единицы
# достаточно, чтобы совпала любая пара цифр
if a == b or a == c or b == c:
print(1)
else:
print(0)
| Ввод | Цифры | Вывод |
|---|---|---|
343 |
3, 4, 3: совпали первая и третья | 1 |
486 |
4, 8, 6: все разные | 0 |
111 |
три одинаковые, пары совпадают | 1 |
100 |
1, 0, 0: совпали вторая и третья | 1 |
123 |
все разные | 0 |
Ответ: if a == b or a == c or b == c: печатаем 1, иначе 0.
Домашнее задание
№ 12 · «Домашнее задание», задание 1
Проанализируй программу: каким будет результат? Составь блок-схему.
a = 20
b = 10
if a < 1 or a > b:
b %= 3
if a // 8 == 2 and 2 >= b:
b //= 1
print(b)
Как думать. Выполняем строки по порядку и после каждого if смотрим, что стало с b. b %= 3 значит b = b % 3, а b //= 1 значит b = b // 1.
Решение.
- a = 20, b = 10.
- Первый
if:a < 1неверно,a > bверно (20 > 10).False or Trueдаёт True. Тело выполняется: b = 10 % 3 = 1. - Второй
if:20 // 8равно 2, значитa // 8 == 2верно.2 >= bто есть2 >= 1верно.True and Trueдаёт True. Тело выполняется: b = 1 // 1 = 1. - Выводится 1.
Блок-схема:
Начало
|
a = 20, b = 10
|
a < 1 or a > b ? --да--> b = b % 3
| нет |
|<------------------------
|
a // 8 == 2 and 2 >= b ? --да--> b = b // 1
| нет |
|<----------------------------------
|
Вывод b
|
Конец
Ответ: программа выведет 1 (проверено запуском).
Шпаргалка
Термины: составное условие, логическое выражение, конъюнкция (and), дизъюнкция (or), инверсия (not), таблица истинности, палиндром.