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

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

4.5. Программирование вложенных условий

Информатика, 7 класс. Учебник: Кадыркулов Р. А., Рыскулбекова А. Д., Нурмуханбетова Г. К. (Алматыкітап баспасы, 2023). Раздел 4: Программирование алгоритмов на языке Python. Страницы 121–124.

Чему научишься

  • Объяснять, что такое вложенная условная конструкция.
  • Различать три варианта вложенных условий.
  • Писать программы с вложенными if – else и читать чужой код.
  • Строить блок-схемы для вложенных условий.
  • Не путать, к какому if относится else.

Разминка

  • Приведи примеры простых и сложных условий из жизни. Простое: «если идёт дождь, беру зонт», выходов два. Сложное: «если сегодня выходной, то, если хорошая погода, иду на каток, а если плохая, смотрю фильм; а если будний день, делаю уроки». Тут решения вложены друг в друга.

Разбираемся

Когда двух веток мало

Раньше у нас было два выхода: условие истинно или ложно. Но бывают задачи, где исходов три и больше. Например, билет в кино: дошкольнику бесплатно, школьнику детский, остальным взрослый. Одного вопроса «да/нет» не хватает, и нужен второй.

📌 Если внутри оператора проверки условия стоит ещё один оператор проверки условия, такая конструкция называется вложенной условной конструкцией.

Вложить условие можно тремя способами. Разберём каждый на своём примере.

Вариант 1: второе условие внутри else

Структура:

if условие 1:
    блок 1
else:
    if условие 2:
        блок 2
    else:
        блок 3

Задача. Дан возраст. До 7 лет билет бесплатный, от 7 до 17 включительно детский, с 18 лет взрослый.

age = int(input())                    # возраст
if age < 7:
    print("Бесплатно")                # первое условие истинно: дальше не смотрим
else:
    if age < 18:                      # второй вопрос задаём только тем, кому 7 и больше
        print("Детский билет")
    else:
        print("Взрослый билет")
Ввод Вывод
5 Бесплатно
7 Детский билет
17 Детский билет
18 Взрослый билет
30 Взрослый билет

Блок-схема:

      (условие 1?)
      /         \
    Да          Нет
    |             |
[блок 1]    (условие 2?)
    |         /      \
    |       Да       Нет
    |        |         |
    |    [блок 2]   [блок 3]
     \       |        /
      [дальше по программе]

Вариант 2: условия внутри if и внутри else

Структура:

if условие 1:
    if условие 2:
        блок 1
    else:
        блок 2
else:
    блок 3

Задача. В игре у героя есть жизни и монеты. Если жизней нет, выводим Game over. Если жизни есть и монет не меньше 50, открываем бонусный уровень, иначе играем дальше.

lives = int(input())                      # сколько жизней
coins = int(input())                      # сколько монет
if lives > 0:                             # жизни остались?
    if coins >= 50:                       # тогда проверяем монеты
        print("Бонусный уровень")
    else:
        print("Играй дальше")
else:                                     # этот else относится к if lives > 0
    print("Game over")
lives coins Вывод
0 80 Game over
3 80 Бонусный уровень
3 10 Играй дальше
3 50 Бонусный уровень (граница)
1 49 Играй дальше (граница)

Блок-схема:

            (условие 1?)
            /          \
          Да           Нет
          |              |
    (условие 2?)      [блок 3]
     /       \           |
   Да        Нет         |
    |          |         |
[блок 1]   [блок 2]      |
     \        |         /
      [дальше по программе]

Вариант 3: условие только внутри if

Структура:

if условие 1:
    if условие 2:
        блок 1
    else:
        блок 2

Если первое условие ложно, не происходит ничего: у внешнего if нет своего else.

Задача. Если заряд телефона меньше 20 %, подскажи, что делать: включить режим экономии, если он выключен, или сообщить, что он уже включён. В любом случае в конце выведи «Заряд проверен».

charge = int(input())                         # заряд, %
saver = int(input())                          # режим экономии: 1 — включён, 0 — выключен
if charge < 20:                               # внешний if без else
    if saver == 0:
        print("Включи режим экономии")
    else:                                     # относится к if saver == 0
        print("Режим экономии уже включён")
print("Заряд проверен")                       # без отступа: выполняется всегда
charge saver Вывод
15 0 Включи режим экономии, потом Заряд проверен
15 1 Режим экономии уже включён, потом Заряд проверен
80 0 только Заряд проверен
20 0 только Заряд проверен (граница)

Блок-схема:

      (условие 1?)
      /         \
    Да          Нет
    |             |
(условие 2?)      |
  /      \        |
Да       Нет      |
 |        |       |
[блок 1][блок 2]  |
  \       |      /
   [дальше по программе]

Как не запутаться с else

Python смотрит на отступы. Каждый else относится к тому if, который стоит на одном с ним уровне отступа. Поэтому отступы надо ставить очень аккуратно.

📕 В учебнике сказано: «каждый else относится к if, расположенному непосредственно перед ним». Это верно не всегда: в программе про жизни и монеты последний else стоит сразу после внутреннего else, а относится к внешнему if lives > 0. Правильно: else относится к if с тем же отступом.

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

⚠️ Частая ошибка. Много вложений подряд. Больше 2–3 if один в другой делают программу трудной для чтения, и в ней легко ошибиться. Если вложения растут, остановись и подумай: нельзя ли упростить условие?

📕 В учебнике для примера 3 (чётное a и нечётное b) сказано, что при нечётном a «на экране ничего не отобразится». Но в программе перед if стоит k = 0, а print(k) стоит без отступа, поэтому выведется 0. И условие задачи требует «иначе сумма», а код складывает числа только при чётном a и чётном b.

Вот эта программа из примера 3 и её настоящее поведение:

a = int(input())
b = int(input())
k = 0                       # до проверок k равен 0
if a % 2 == 0:
    if b % 2 == 1:
        k = a * b
    else:
        k = a + b
print(k)                    # выполняется всегда, даже при нечётном a
a b Вывод
4 3 12 (чётное и нечётное: произведение)
4 6 10 (чётное и чётное: сумма)
3 4 0 (нечётное a: ничего не меняется, но печать всё равно есть)

👨‍👩‍👧 Родителю. Если у ребёнка программа ведёт себя странно, попросите его пройти по ней «пальцем», подставив конкретные числа: на каждом if говорить вслух «верно или нет?». Чаще всего ошибка прячется в отступах или в знаке > и >=. Хорошо, если ребёнок сам нарисует блок-схему на листке.

Проверь себя

  • Что такое вложенная условная конструкция? Конструкция, где внутри if или else стоит ещё один условный оператор.
  • Когда нужны вложенные условия? Когда исходов больше двух и одного вопроса «да/нет» не хватает.
  • Какие бывают варианты вложенных условий? Второй if внутри else (вариант 1), внутри if и else (вариант 2) и только внутри if (вариант 3).
  • Как понять, к какому if относится else? По отступу: else относится к if на том же уровне.
  • Почему нельзя вкладывать слишком много if? Программа становится сложной для чтения, и в ней легко допустить ошибку.

Решаем упражнения

Анализ

№ 1 · «Анализ»

Вопросы 1–3. Дана программа: вводятся a, b, c; если a чётное, то при нечётном b выводится b // c, иначе a // c; если a нечётное, выводится (a + b) % c. 1) Сравни отличия конструкций вложенных условий друг от друга. 2) Какой вариант записи вложенных условий в этом коде? 3) Что получится при a = 8, b = 5, c = 3?

a = int(input())
b = int(input())
c = int(input())
if a % 2 == 0:
    if b % 2 == 1:
        k = b // c
    else:
        k = a // c
else:
    k = (a + b) % c
print(k)

Как думать. Смотри, где стоят вложенные if: в if, в else или в обоих.

Решение.

  1. Вариант 1: второй if только внутри else (цепочка проверок). Вариант 2: вложенные if и внутри if, и внутри else. Вариант 3: вложенный if только внутри if, у внешнего нет else.
  2. Здесь второй if (b % 2 == 1) стоит внутри ветки if внешнего условия, а у внешнего есть свой else. Это вариант 2.
  3. a = 8, b = 5, c = 3. 8 % 2 == 0 — истина. Дальше 5 % 2 == 1 — тоже истина. Значит, k = 5 // 3 = 1.
a b c Вывод Путь
8 5 3 1 a чётное, b нечётное: b // c
8 4 3 2 a чётное, b чётное: a // c
7 5 3 0 a нечётное: (7 + 5) % 3

Ответ: 1) варианты различаются местом вложенного if; 2) вариант 2; 3) выведется 1.

Синтез

№ 2 · «Синтез»

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

Как думать. Подумай про ситуацию с несколькими исходами. Для варианта 1 подойдёт «шкала» (разряды, оценки, цены), для варианта 2 — «сначала общий вопрос, потом уточнение», для варианта 3 — «уточнение нужно только в одном случае».

Пример ответа. Вариант 1. Дан балл за тест. Если балл 90 и выше, выведи «Оценка 5»; от 70 до 89 — «Оценка 4»; от 50 до 69 — «Оценка 3»; ниже 50 — «Оценка 2».

score = int(input())
if score >= 90:
    print("Оценка 5")
else:
    if score >= 70:
        print("Оценка 4")
    else:
        if score >= 50:
            print("Оценка 3")
        else:
            print("Оценка 2")
Ввод Вывод
95 Оценка 5
90 Оценка 5
75 Оценка 4
70 Оценка 4
55 Оценка 3
50 Оценка 3
49 Оценка 2

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

Оценка

№ 3 · «Оценка»

Задание. Оцени значимость использования вложенных условий в программировании.

Как думать. Что мы получаем, когда можем задавать не один вопрос, а цепочку вопросов?

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

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

Задание

№ 4

«Задание», задача 1 ().* Разработай программу, вычисляющую значение функции: y = x + 100 при x > 0, y = 20 при x = 0, y = x² при x < 0. Какой вариант вложенных условий здесь нужен?

Как думать. Три случая: больше нуля, равно нулю, меньше нуля. Сначала проверяем «больше нуля». Если нет, то второй вопрос «равно нулю?». Это вариант 1.

Решение.

x = float(input())
if x > 0:
    y = x + 100               # x положительное
else:
    if x == 0:
        y = 20                # x равно нулю
    else:
        y = x ** 2            # x отрицательное
print(y)
x Вывод
5 105.0
0 20
-3 9.0
0.5 100.5

Ответ: нужен вариант 1 (второй if внутри else); программа выше.

№ 5

«Задание», задача 2 (**). Разработай блок-схемы использования вложенных условий: а) вариант 1; б) вариант 2; в) вариант 3.

Как думать. Ромб — это проверка условия. У каждого ромба два выхода: «Да» и «Нет». Вложенное условие — это ещё один ромб на одной из веток.

Как сделать. Рисуй на бумаге или в любой программе для схем. Должно получиться так (блоки команд в прямоугольниках).

а) вариант 1: второй ромб на ветке «Нет».

      (условие 1?)
      /         \
    Да          Нет
    |             |
[блок 1]    (условие 2?)
    |         /      \
    |       Да       Нет
    |        |         |
    |    [блок 2]   [блок 3]
     \       |        /
      [конец условного оператора]

б) вариант 2: второй ромб на ветке «Да», а на ветке «Нет» — блок 3.

            (условие 1?)
            /          \
          Да           Нет
          |              |
    (условие 2?)      [блок 3]
     /       \           |
   Да        Нет         |
    |          |         |
[блок 1]   [блок 2]      |
     \        |         /
      [конец условного оператора]

в) вариант 3: второй ромб на ветке «Да», а ветка «Нет» сразу идёт дальше.

      (условие 1?)
      /         \
    Да          Нет
    |             |
(условие 2?)      |
  /      \        |
Да       Нет      |
 |        |       |
[блок 1][блок 2]  |
  \       |      /
   [конец условного оператора]

Ответ: три блок-схемы выше.

№ 6

«Задание», задача 3 (**). Дано число P. Если оно больше нуля, вычисли его куб. Если меньше нуля, прибавь к нему число K. Если равно нулю, вычти из него число Z. Порядок ввода: P, K, Z. Пример: -8 15 -6 даёт 7.

Как думать. Три случая, как в № 4: сначала «больше нуля», потом «меньше нуля», а то, что осталось, и есть «равно нулю».

Решение.

P, K, Z = map(int, input().split())     # три числа в одной строке
if P > 0:
    result = P ** 3                      # куб
else:
    if P < 0:
        result = P + K                   # прибавляем K
    else:
        result = P - Z                   # P равно нулю: вычитаем Z
print(result)
Ввод Вывод Пояснение
-8 15 -6 7 P < 0: −8 + 15
2 5 1 8 P > 0: 2³
0 5 4 -4 P = 0: 0 − 4
-1 -1 9 -2 P < 0: −1 + (−1)

Ответ: программа выше; для -8 15 -6 выведет 7.

№ 7 · «Задание», задача 4

⭐ повышенной сложности. Текстовый файл Input.txt содержит целые числа a, b, c, разделённые пробелами. Найди наименьшее из них с помощью вложенных условий и запиши результат в файл Output.txt. Пример: в Input.txt лежит 45 17 29, в Output.txt должно получиться 17.

Как думать. Сравним a и b: так найдём меньшее из них. Потом сравним это меньшее с c. Получится вариант 2: во вложенной ветке и в else свои сравнения.

Решение. Положи Input.txt в ту же папку, где лежит программа. Содержимое до запуска:

45 17 29

Программа:

f = open("Input.txt")                     # открываем файл для чтения
a, b, c = map(int, f.read().split())      # читаем числа, разделённые пробелами
f.close()
if a < b:                                 # a меньше b?
    if a < c:
        smallest = a                      # a меньше и b, и c
    else:
        smallest = c                      # c не больше a, а a меньше b
else:                                     # b не больше a
    if b < c:
        smallest = b
    else:
        smallest = c
out = open("Output.txt", "w")             # открываем файл для записи
out.write(str(smallest))                  # записываем число как текст
out.close()

После запуска появляется файл Output.txt с таким содержимым:

17

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

Input.txt Output.txt
45 17 29 17
3 8 5 3
9 9 4 4
6 6 6 6
-2 7 -9 -9

Ответ: программа выше; для 45 17 29 в Output.txt будет 17.

Домашнее задание

№ 8 · «Домашнее задание»

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

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

Пример ответа.

Как программа выбирает.

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

Но выходов бывает больше двух. Например, билет в кино: бесплатно, детский или взрослый. Тогда внутрь if или else ставят ещё одно условие. Это вложенные условия.

Задача: по баллу за тест определить оценку. Шаги решения: (1) читаем балл; (2) если он не меньше 90, оценка 5; (3) иначе, если не меньше 70, оценка 4; (4) иначе, если не меньше 50, оценка 3; (5) иначе оценка 2. Программа получается из пяти строк с отступами, и мы проверяем её на границах 90, 70, 50.

Вывод: условия делают программу «думающей». Главное, аккуратно ставить отступы и не вкладывать if слишком глубоко.

Ответ: заметка по плану выше; обязательно есть заголовок, описание if – else, вложенные условия и разбор одной задачи.

Шпаргалка

Термины: вложенная условная конструкция, вложенное условие, отступ, ветка, блок-схема, структура.

Мини-тест

← 4.3–4.4. Программирование алгоритмов ветвления · 4.6. Программирование составных условий →