5.1. Постановка проблемы
Информатика, 7 класс. Учебник: Кадыркулов Р. А., Рыскулбекова А. Д., Нурмуханбетова Г. К. (Алматыкітап баспасы, 2023). Раздел 5: Практическое программирование. Страницы 140–143.
Чему научишься
- Называть пять этапов разработки программы: от постановки проблемы до компьютерного эксперимента.
- Объяснять, что такое постановка проблемы и зачем она нужна.
- Выяснять, что дано, что надо найти и какие есть ограничения.
- Разбирать готовую программу с ветвлением вручную, подставляя числа.
- Решать задачи с ветвлением на Python по всем этапам.
Разминка
- Что такое модель задачи? Это упрощённое описание задачи: оставляем только то, что важно для решения, а лишнее выбрасываем. Например, для задачи про скидку в магазине важны цена и процент, а цвет упаковки не важен.
- Какие знания нужны, чтобы построить модель? Знания из самой области задачи (математика, физика, жизнь), умение выделять главное и умение записывать условие формулами и словами.
- Из каких этапов состоит решение задачи в среде программирования? Постановка проблемы, модель (словесная и математическая), алгоритм, программа на языке программирования, проверка и исправление ошибок.
Разбираемся
Не спеши набирать код
Хочется сразу открыть IDLE или Thonny и печатать. Но так делают только новички, и потом удивляются, почему программа выдаёт чушь. Опытный программист сначала думает, потом пишет. Его путь состоит из пяти этапов.
| Этап | Что делаем | Как он выглядит на деле |
|---|---|---|
| 1. Постановка проблемы | Понимаем, что дано, что найти и какие есть ограничения | Читаем условие и выписываем данные |
| 2. Формализация | Записываем условие чётко: словами, формулами | Придумываем формулу или правило |
| 3. Алгоритмизация | Разрабатываем алгоритм | Расписываем шаги или рисуем блок-схему |
| 4. Программирование | Переводим алгоритм на язык Python | Набираем код |
| 5. Компьютерный эксперимент | Запускаем, тестируем, исправляем ошибки | Проверяем на разных данных |
📌 Постановка проблемы — это вопрос, на который нужен ответ. Она показывает, чего нам не хватает (знаний или умений), чтобы получить результат. Чем точнее она сделана, тем увереннее мы будем в ответе программы.
Пять вопросов постановки проблемы
Когда ты ставишь проблему, отвечай по порядку на пять вопросов. Возьмём свою задачу: три друга скинулись на пиццу. Хватит ли денег? Если да, сколько сдачи, а если нет, сколько не хватает?
- Какая цель и какой общий способ? Узнать, хватает ли денег. Способ: сложить деньги и сравнить с ценой.
- Сколько решений? Одно. При одних и тех же числах ответ всегда один.
- Какие свойства у объекта и что умеет язык? Деньги целые, в Python есть
+,-и проверкаif. - Какие начальные данные? Четыре целых числа: деньги каждого друга и цена пиццы.
- Какие ограничения и как их учесть? Деньги и цена не бывают отрицательными. А ещё разные случаи: хватает и не хватает, поэтому нужно ветвление.
a = int(input()) # деньги первого друга
b = int(input()) # деньги второго
c = int(input()) # деньги третьего
price = int(input()) # цена пиццы
total = a + b + c # сколько всего собрали
if total >= price:
print("Хватает, сдача", total - price)
else:
print("Не хватает", price - total)
Запускали программу (Python 3.12) на таких данных:
| Ввод (a, b, c, price) | Вывод |
|---|---|
| 1500, 2000, 1000, 4000 | Хватает, сдача 500 |
| 2000, 2000, 1500, 5500 | Хватает, сдача 0 |
| 1500, 2000, 1000, 5000 | Не хватает 500 |
⚠️ Частая ошибка. Забыть про граничный случай. Если денег ровно столько, сколько стоит пицца, сдача равна 0. Поэтому знак
>=, а не>. С>программа в таком случае сказала бы «Не хватает 0», а это нелепо.
Ограничения — это часть задачи
Ограничение — условие, которое нельзя нарушать. В пицце это «деньги не отрицательные». В задаче про коробки с шариками из упражнения ниже ограничение такое: шарики нельзя разрезать, поэтому поровну разделить можно, только если общее число делится на 3. Нашёл ограничение — значит, знаешь, где в программе нужна проверка if.
💡 Хорошая привычка: после чтения условия выпиши три строки — «Дано», «Найти», «Ограничения». Так половина задачи уже решена.
👨👩👧 Родителю. Попросите ребёнка перед каждой задачей по программированию вслух ответить: что дано, что надо найти и что может пойти не так. Это тренирует инженерное мышление и пригодится не только в информатике, но и в физике.
Проверь себя
- Что такое постановка проблемы? Это вопрос, на который нужен ответ: чёткое понимание, что дано, что нужно получить и какие есть ограничения.
- Почему нельзя сразу писать код? Без понимания условия легко решить не ту задачу или забыть частный случай, и программа даст неверный ответ.
- Назови этапы разработки программы по порядку. Постановка проблемы, формализация, алгоритмизация, программирование, компьютерный эксперимент.
- Что такое ограничения задачи? Приведи пример. Условия, которые нужно учесть. Например, число шариков целое, поэтому делить поровну можно, только когда сумма делится на 3.
Решаем упражнения
Практическая работа
№ 1 · «Практическая работа»
Анализ. У Марата, Самал и Айнуры три коробки с шариками: в них a, b, c шариков (целые положительные числа). Можно ли уравнять количество? Если да, надо вывести, сколько шариков переложить, а если нет, то «−1». Разбери программу и вручную проверь её на двух наборах: a = 7, b = 20, c = 9 и a = 13, b = 11, c = 0. Запиши результат каждой команды и скажи, какой алгоритм решает задачу. Пример из учебника: 13 15 5 даёт 6.
Как думать. Файл «с диска» нам недоступен, но программу легко составить самому. Условие поровну: сумма делится на 3. Тогда в каждой коробке должно стать k = сумма / 3 шариков. Лишние шарики есть в коробках, где больше k. Сколько таких «лишних» всего, столько и надо переложить.
Решение. Программа:
a, b, c = map(int, input().split()) # три числа в одной строке
t = k = h = p = s = 0 # обнуляем все переменные сразу
if (a + b + c) % 3 == 0: # поровну можно, только если сумма делится на 3
k = (a + b + c) // 3 # сколько должно стать в каждой коробке
t = a - k; p = b - k; h = c - k # избыток (или недостаток) в каждой коробке
if t > 0: # если в первой коробке лишние
s = s + t
if p > 0: # если во второй
s = s + p
if h > 0: # если в третьей
s = s + h
print(s) # сколько шариков перекладываем
else:
print(-1) # уравнять нельзя
Второй набор: a = 13, b = 11, c = 0. Сумма 24, остаток 0. k = 8. t = 5, p = 3, h = −8. Лишние есть в первой (5) и во второй (3): s = 5 + 3 = 8. Программа выводит 8.
Для 13 15 5 из условия: сумма 33, k = 11, t = 2, p = 4, h = −6, s = 2 + 4 = 6. Сходится с примером.
Алгоритм: ветвление по условию «сумма делится на 3» (с else), а внутри него три неполных ветвления (if без else) и накопление суммы s. Мы запускали программу на этих числах, а также на 4 4 4 (ответ 0), 1 1 2 (ответ −1), 1 2 3 (ответ 1).
Ответ: для 7, 20, 9 выведется 8; для 13, 11, 0 тоже 8. Задачу решает ветвление с проверкой делимости суммы на 3 и накоплением числа лишних шариков.
Задание
№ 2
«Задание», задача 1 (⭐ повышенной сложности, метка «***»). Ты уже знаешь, как найти наибольшее из трёх чисел. Как найти второе по величине из целых a, b, c? Разработай программу по этапам схемы и скажи, как ты выполнил этап постановки задачи. Вывод — на экран. Пример: 7 4 9 даёт 7.
Как думать. Второе по величине — число, которое лежит «посередине»: оно не самое большое и не самое маленькое. Проверим каждое число: лежит ли оно между двумя другими.
Решение.
- Постановка. Дано: три целых числа в одной строке. Найти: среднее по величине. Ограничение: числа могут повторяться. Если два числа равны, например 5 5 3, то «второе по величине» равно 5, и мы договариваемся выводить именно его.
- Формализация. Число
aпосередине, еслиb <= a <= cилиc <= a <= b. То же дляbиc. - Алгоритм. Ввести a, b, c. Если a посередине, вывести a. Иначе, если b посередине, вывести b. Иначе вывести c.
- Программа.
a, b, c = map(int, input().split())
if b <= a <= c or c <= a <= b: # a лежит между двумя другими
print(a)
elif a <= b <= c or c <= b <= a: # b лежит между двумя другими
print(b)
else: # значит, посередине c
print(c)
- Эксперимент.
| Ввод | Вывод | Почему |
|---|---|---|
| 7 4 9 | 7 | 4 < 7 < 9 |
| 9 7 4 | 7 | 4 < 7 < 9 |
| 4 9 7 | 7 | 4 < 7 < 9 |
| 5 5 3 | 5 | повторяются, берём 5 |
| 6 6 6 | 6 | все равны |
Запускали на всех этих входах, результаты совпали с таблицей.
Ответ: программа выше выводит число, лежащее по значению между двумя другими. Для 7 4 9 это 7.
№ 3
«Задание», задача 2 (метка «**», средний уровень). Даны три значения температуры. Нужно проверить, нет ли среди них температуры таяния льда (0) и кипения воды (100). Если есть температура таяния льда, выведи «1», если кипения воды, то «2», если оба значения, то «3». Пример: 100 12 0 даёт 3.
Как думать. Сначала проверим два вопроса отдельно: «есть ли 0 среди трёх?» и «есть ли 100?». Потом разберём четыре случая.
Решение.
- Постановка. Дано три числа. Найти: код 1, 2 или 3. Ограничение: в условии не сказано, что делать, если нет ни 0, ни 100. Мы выбрали вывод слова «нет». Считаем, что вода кипит при 100 °C в обычных условиях.
- Алгоритм. Запоминаем два ответа:
ice(есть 0) иwater(есть 100). Если оба верны, выводим 3. Если толькоice, выводим 1. Если толькоwater, выводим 2. - Программа.
a, b, c = map(int, input().split())
ice = (a == 0) or (b == 0) or (c == 0) # есть ли температура таяния льда
water = (a == 100) or (b == 100) or (c == 100) # есть ли температура кипения воды
if ice and water:
print(3)
elif ice:
print(1)
elif water:
print(2)
else:
print("нет")
- Тесты (запускали программу):
| Ввод | Вывод |
|---|---|
| 100 12 0 | 3 |
| 0 5 7 | 1 |
| 5 100 7 | 2 |
| 5 6 7 | нет |
| 0 100 100 | 3 |
Ответ: программа выше; для 100 12 0 выводится 3.
Домашнее задание
№ 4 · «Домашнее задание», задание 1
Дано четырёхзначное число N. Определи, все ли его цифры чётные. Если все чётные, выведи «0», иначе выведи «Имеется нечетная цифра». Примеры: 4284 даёт 0, 8412 даёт «Имеется нечетная цифра».
Как думать. Чтобы проверить каждую цифру, её нужно сначала достать из числа. Тысячи получаем делением нацело на 1000, сотни — через // 100 % 10, десятки — // 10 % 10, единицы — % 10.
Решение.
n = int(input())
d1 = n // 1000 # тысячи
d2 = n // 100 % 10 # сотни
d3 = n // 10 % 10 # десятки
d4 = n % 10 # единицы
if d1 % 2 == 0 and d2 % 2 == 0 and d3 % 2 == 0 and d4 % 2 == 0:
print(0) # все цифры чётные
else:
print("Имеется нечетная цифра")
| Ввод | Вывод |
|---|---|
| 4284 | 0 |
| 8412 | Имеется нечетная цифра |
| 2468 | 0 |
| 2000 | 0 |
| 1000 | Имеется нечетная цифра |
Все пять строк получены запуском программы.
Ответ: программа выше выводит 0, если все четыре цифры чётные, и «Имеется нечетная цифра» в остальных случаях.
Шпаргалка
Термины: постановка проблемы, формализация, алгоритмизация, программирование, компьютерный эксперимент, модель задачи, ограничение.