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

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

5.1. Постановка проблемы

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

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

  • Называть пять этапов разработки программы: от постановки проблемы до компьютерного эксперимента.
  • Объяснять, что такое постановка проблемы и зачем она нужна.
  • Выяснять, что дано, что надо найти и какие есть ограничения.
  • Разбирать готовую программу с ветвлением вручную, подставляя числа.
  • Решать задачи с ветвлением на Python по всем этапам.

Разминка

  • Что такое модель задачи? Это упрощённое описание задачи: оставляем только то, что важно для решения, а лишнее выбрасываем. Например, для задачи про скидку в магазине важны цена и процент, а цвет упаковки не важен.
  • Какие знания нужны, чтобы построить модель? Знания из самой области задачи (математика, физика, жизнь), умение выделять главное и умение записывать условие формулами и словами.
  • Из каких этапов состоит решение задачи в среде программирования? Постановка проблемы, модель (словесная и математическая), алгоритм, программа на языке программирования, проверка и исправление ошибок.

Разбираемся

Не спеши набирать код

Хочется сразу открыть IDLE или Thonny и печатать. Но так делают только новички, и потом удивляются, почему программа выдаёт чушь. Опытный программист сначала думает, потом пишет. Его путь состоит из пяти этапов.

Этап Что делаем Как он выглядит на деле
1. Постановка проблемы Понимаем, что дано, что найти и какие есть ограничения Читаем условие и выписываем данные
2. Формализация Записываем условие чётко: словами, формулами Придумываем формулу или правило
3. Алгоритмизация Разрабатываем алгоритм Расписываем шаги или рисуем блок-схему
4. Программирование Переводим алгоритм на язык Python Набираем код
5. Компьютерный эксперимент Запускаем, тестируем, исправляем ошибки Проверяем на разных данных

📌 Постановка проблемы — это вопрос, на который нужен ответ. Она показывает, чего нам не хватает (знаний или умений), чтобы получить результат. Чем точнее она сделана, тем увереннее мы будем в ответе программы.

Пять вопросов постановки проблемы

Когда ты ставишь проблему, отвечай по порядку на пять вопросов. Возьмём свою задачу: три друга скинулись на пиццу. Хватит ли денег? Если да, сколько сдачи, а если нет, сколько не хватает?

  1. Какая цель и какой общий способ? Узнать, хватает ли денег. Способ: сложить деньги и сравнить с ценой.
  2. Сколько решений? Одно. При одних и тех же числах ответ всегда один.
  3. Какие свойства у объекта и что умеет язык? Деньги целые, в Python есть +, - и проверка if.
  4. Какие начальные данные? Четыре целых числа: деньги каждого друга и цена пиццы.
  5. Какие ограничения и как их учесть? Деньги и цена не бывают отрицательными. А ещё разные случаи: хватает и не хватает, поэтому нужно ветвление.
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.

Как думать. Второе по величине — число, которое лежит «посередине»: оно не самое большое и не самое маленькое. Проверим каждое число: лежит ли оно между двумя другими.

Решение.

  1. Постановка. Дано: три целых числа в одной строке. Найти: среднее по величине. Ограничение: числа могут повторяться. Если два числа равны, например 5 5 3, то «второе по величине» равно 5, и мы договариваемся выводить именно его.
  2. Формализация. Число a посередине, если b <= a <= c или c <= a <= b. То же для b и c.
  3. Алгоритм. Ввести a, b, c. Если a посередине, вывести a. Иначе, если b посередине, вывести b. Иначе вывести c.
  4. Программа.
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)
  1. Эксперимент.
Ввод Вывод Почему
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. Постановка. Дано три числа. Найти: код 1, 2 или 3. Ограничение: в условии не сказано, что делать, если нет ни 0, ни 100. Мы выбрали вывод слова «нет». Считаем, что вода кипит при 100 °C в обычных условиях.
  2. Алгоритм. Запоминаем два ответа: ice (есть 0) и water (есть 100). Если оба верны, выводим 3. Если только ice, выводим 1. Если только water, выводим 2.
  3. Программа.
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("нет")
  1. Тесты (запускали программу):
Ввод Вывод
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, если все четыре цифры чётные, и «Имеется нечетная цифра» в остальных случаях.

Шпаргалка

Термины: постановка проблемы, формализация, алгоритмизация, программирование, компьютерный эксперимент, модель задачи, ограничение.

Мини-тест

← 4.9–4.10. Практические задания · 5.2. Разработка алгоритма →