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: второй
ifтолько внутриelse(цепочка проверок). Вариант 2: вложенныеifи внутриif, и внутриelse. Вариант 3: вложенныйifтолько внутриif, у внешнего нетelse. - Здесь второй
if(b % 2 == 1) стоит внутри веткиifвнешнего условия, а у внешнего есть свойelse. Это вариант 2. - 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, вложенные условия и разбор одной задачи.
Шпаргалка
Термины: вложенная условная конструкция, вложенное условие, отступ, ветка, блок-схема, структура.