Программирование составных условий — 4.6, Информатика 7 класс, Кадыркулов: разбор и ответы
Ookul.kz · разбор уроков
Қазақша

Разберём любой номер вместе!

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». Это про равенство всех трёх чисел.

Решение.

  1. Программа проверяет, равны ли все три числа между собой. Если числа — стороны треугольника, она отвечает на вопрос «равносторонний ли он?».

  2. Использован оператор and (логическое «и», конъюнкция): «да» печатается, только если верны все три равенства сразу. Блок-схема:

Начало
  |
Ввод a, b, c
  |
a == b and a == c and b == c ?
  | да                  | нет
Вывод «да»          Вывод «нет»
  |___________________|
  |
Конец
  1. У равнобедренного треугольника равны любые две стороны, а не обязательно все три. Поэтому 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 — остаток.

Решение.

  1. a = 10, b = 56. Выражение 1: 10 > 5 верно, значит всё верно, True. Выражение 2: 10 % 5 == 0 верно, 56 > 10 верно, True.
  2. a = 0, b = 1. Выражение 1: 0 > 1 неверно, но 1 == 1 верно, or пропускает, True. Выражение 2: 0 > 1 неверно, значит and не сработает, False.
  3. a = 8, b = -7. Выражение 1: 8 < 50 верно, True. Выражение 2: 8 // 2 равно 4, 4 != 1 верно; -7 + 15 равно 8, 8 == 8 верно; оба верны, True.
  4. a = -8, b = -9. Выражение 1: -8 > -8 неверно и -9 == -8 неверно, False. Выражение 2: (-8) ** 2 равно 64, 64 > 0 верно; a - 1 равно -9, -9 == -9 верно, True.
  5. 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:

  1. a = 15, b = 8.
  2. Первый if: 15 > 1 верно, or даёт True. Тело выполняется: b = 8 + 7 = 15.
  3. Второй if: a > 1 верно, a == b теперь тоже верно (15 == 15). Тело выполняется: b = 15 % 4 = 3.
  4. Выводится 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.

Решение.

  1. a = 20, b = 10.
  2. Первый if: a < 1 неверно, a > b верно (20 > 10). False or True даёт True. Тело выполняется: b = 10 % 3 = 1.
  3. Второй if: 20 // 8 равно 2, значит a // 8 == 2 верно. 2 >= b то есть 2 >= 1 верно. True and True даёт True. Тело выполняется: b = 1 // 1 = 1.
  4. Выводится 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), таблица истинности, палиндром.

Мини-тест

← 4.5. Программирование вложенных условий · 4.7. Практические задания →