5.4. Программирование задач. Практическая работа
Информатика, 7 класс. Учебник: Кадыркулов Р. А., Рыскулбекова А. Д., Нурмуханбетова Г. К. (Алматыкітап баспасы, 2023). Раздел 5: Практическое программирование. Страницы 154–156.
Чему научишься
- Создавать блок-схему алгоритма и по ней писать код на Python.
- Решать задачи с линейным алгоритмом и с ветвлением.
- Проверять программу на нескольких тестах, в том числе на граничных.
Разминка
- Какова разница в структуре линейных и ветвящихся алгоритмов? В линейном все шаги идут подряд, по одному разу. В ветвящемся есть проверка условия, и программа выбирает один из путей.
Разбираемся
Что понадобится
Редактор для Python: IDLE, Thonny или онлайн-интерпретатор. Бумага и ручка для блок-схем. Файлы с диска не нужны: данные для проверки даны в самих задачах.
Как решать любую задачу
💡 Вводить сразу несколько чисел удобно так:
a, b = map(int, input().split()). Числа вводятся в одну строку через пробел, как в примерах из задач.
⚠️ Частая ошибка.
input()возвращает текст. Пока не превратишь его в число с помощьюint()илиfloat(), считать с ним нельзя.
👨👩👧 Родителю. Эти задачи хорошо решать парой: ребёнок рисует схему и пишет код, а вы задаёте вопросы вроде «а что будет, если ввести ноль?». Пусть сам придумает тест, на котором программа может сломаться.
Проверь себя
- Чем отличаются линейный и ветвящийся алгоритмы? В ветвящемся есть условие, из которого выходят два пути, а в линейном условий нет.
- Зачем нужны граничные тесты? Ошибки чаще всего прячутся на границах: на самом маленьком или самом большом допустимом числе, при равенстве и т. п.
Решаем упражнения
Практическая работа
Сначала три задачи на линейный алгоритм, потом пять на ветвление.
№ 1
«Практическая работа», задание 1* «Площадь круга» (линейный алгоритм). Найди сумму площадей двух кругов с радиусами R₁ и R₂. Формулы: S₁ = π · R₁², S₂ = π · R₂². Пример: радиусы 3 и 5 дают 106.76.
Как думать. Пример показывает, какое значение π взято: 3.14 · (9 + 25) = 3.14 · 34 = 106.76. Значит, берём π = 3.14. Алгоритм линейный: ввод, вычисление, вывод.
Решение. Схема: Начало, ввод R1, R2, вычисление S, вывод S, Конец.
R1, R2 = map(float, input().split()) # радиусы (могут быть дробными)
S = 3.14 * R1 ** 2 + 3.14 * R2 ** 2 # сумма площадей двух кругов
print(round(S, 2)) # до сотых, чтобы не было лишних знаков
| Ввод | Вычисление | Вывод |
|---|---|---|
| 3 5 | 3.14 · (9 + 25) | 106.76 |
| 1 2 | 3.14 · (1 + 4) | 15.7 |
| 0 10 | 3.14 · 100 | 314.0 |
Ответ: 3.14 * R1 ** 2 + 3.14 * R2 ** 2; для 3 и 5 получается 106.76.
№ 2
«Практическая работа», задание 2** «Единицы измерения» (линейный алгоритм). Давние казахские меры длины: қарыс (1 қарыс = 21–22 см) и тұтам (1 тұтам = 10 см). Длина S см. Выразить её в қарыс и в тұтам. Пример: 220 даёт 10 22.
Как думать. Из примера видно, что взято 22 см на қарыс: 220 / 22 = 10. Тұтам это 220 / 10 = 22. Берём целое число мер, остаток отбрасываем. Для этого используем деление нацело //.
Решение.
S = int(input()) # длина в сантиметрах
print(S // 22, S // 10) # сколько қарыс и сколько тұтам, целыми числами
| Ввод | Вывод |
|---|---|
| 220 | 10 22 |
| 250 | 11 25 |
| 21 | 0 2 |
Пояснение к 250: 250 // 22 = 11 (11 · 22 = 242, остаток 8), 250 // 10 = 25.
Ответ: print(S // 22, S // 10); для 220 выводится 10 22.
№ 3
«Практическая работа», задание 3** «Произведение цифр» (линейный алгоритм). Дано пятизначное число. Найди произведение цифры сотен и цифры тысяч. Пример: 49795 даёт 63.
Как думать. Число 49795 это 4 десятка тысяч, 9 тысяч, 7 сотен, 9 десятков и 5 единиц. Нужны 9 (тысячи) и 7 (сотни): 9 · 7 = 63. Чтобы достать цифру разряда, поделим нацело и возьмём остаток от деления на 10.
Решение.
N = int(input()) # пятизначное число
h = N // 100 % 10 # цифра сотен
t = N // 1000 % 10 # цифра тысяч
print(h * t) # произведение
| Ввод | Сотни | Тысячи | Вывод |
|---|---|---|---|
| 49795 | 7 | 9 | 63 |
| 12345 | 3 | 2 | 6 |
| 10000 | 0 | 0 | 0 |
Ответ: N // 100 % 10 * (N // 1000 % 10); для 49795 это 63.
№ 4
«Практическая работа», задание 4** «Парты» (ветвление). Школа заказывает двухместные парты для трёх кабинетов. В кабинетах N, P и K учеников. Найди наименьшее число парт, которое надо заказать. Пример: 21 27 30 даёт 40.
Как думать. За одной партой двое. Если в классе чётное число учеников, парт ровно N / 2. Если нечётное, то одному ученику парта достанется «в одиночку»: нужна ещё одна. Считаем каждый класс отдельно.
Решение. Для каждого класса: если число учеников чётное, парт N // 2, иначе N // 2 + 1.
N, P, K = map(int, input().split()) # ученики в трёх кабинетах
total = 0
for x in (N, P, K): # проходим по трём числам
if x % 2 == 0:
total += x // 2 # чётное: ровно x / 2 парт
else:
total += x // 2 + 1 # нечётное: ещё одна парта
print(total)
Для 21 27 30: 21 даёт 11, 27 даёт 14, 30 даёт 15, всего 40.
💡 Цикл
forты ещё не проходил, но здесь он просто три раза повторяет одну и ту же проверку. Без него можно писать три одинаковых блокаif / else, результат будет тем же.
| Ввод | Парты | Вывод |
|---|---|---|
| 21 27 30 | 11 + 14 + 15 | 40 |
| 20 20 20 | 10 + 10 + 10 | 30 |
| 1 1 1 | 1 + 1 + 1 | 3 |
Ответ: для 21, 27, 30 нужно 40 парт.
№ 5
«Практическая работа», задание 5*** «Перемена между уроками» (ветвление). Уроки начинаются в 9:00, урок длится 40 минут. После нечётных уроков (1, 3, 5, 7) перемена 5 минут, после чётных (2, 4, 6, 8) перемена 10 минут. По номеру урока (от 1 до 8) вывести время окончания урока. Пример: 3 даёт 11:15.
Как думать. Это ⭐ повышенной сложности. Разобьём день на пары уроков. Пара «нечётный + чётный» вместе с двумя переменами занимает 40 + 5 + 40 + 10 = 95 минут. Дальше смотрим, чётный или нечётный номер у урока.
Решение.
n = int(input()) # номер урока, от 1 до 8
pairs = n // 2 # сколько полных пар уроков до этого
if n % 2 == 1:
total = pairs * 95 + 40 # нечётный урок: последняя перемена ещё не нужна
else:
total = pairs * 95 - 10 # чётный: убираем перемену после последнего урока
h = 9 + total // 60 # часы
m = total % 60 # минуты
print(f"{h}:{m:02d}") # минуты всегда двумя цифрами
| Ввод | Минут от 9:00 | Вывод |
|---|---|---|
| 1 | 40 | 9:40 |
| 2 | 85 | 10:25 |
| 3 | 135 | 11:15 |
| 4 | 180 | 12:00 |
| 8 | 370 | 15:10 |
⚠️ Частая ошибка. Если вывести минуты просто как
m, то вместо12:00получится12:0. Формат{m:02d}добавляет ведущий ноль.
Ответ: программа выше; для 3 выводится 11:15.
№ 6
«Практическая работа», задание 6*** «Нумерация страниц» (ветвление). В книге «Великий Абай» N страниц (N не больше 1300). Сколько цифр нужно, чтобы пронумеровать все страницы? Примеры: 9 даёт 9, 20 даёт 31.
Как думать. Это ⭐ повышенной сложности. Страницы 1–9 по одной цифре (9 цифр), 10–99 по две (всего 180), 100–999 по три (всего 2700), от 1000 по четыре. Поэтому всё зависит от того, в какой «зоне» находится N.
Решение.
N = int(input()) # число страниц
if N <= 9:
digits = N # все страницы однозначные
elif N <= 99:
digits = 9 + 2 * (N - 9) # 9 однозначных + двузначные
elif N <= 999:
digits = 189 + 3 * (N - 99) # 9 + 180 = 189 цифр на страницы 1–99
else:
digits = 2889 + 4 * (N - 999) # 189 + 2700 = 2889 цифр на страницы 1–999
print(digits)
| Ввод | Зона | Вывод |
|---|---|---|
| 9 | до 9 | 9 |
| 20 | до 99 | 31 |
| 99 | граница | 189 |
| 100 | от 100 | 192 |
| 1300 | от 1000 | 4093 |
Ответ: программа выше; для 9 выводится 9, для 20 выводится 31, для 1300 выводится 4093.
№ 7
«Практическая работа», задание 7* «Определение количества разрядов числа». Дано число X от 1 до 9999. Найди, сколько в нём разрядов (цифр). Пример: 8596 даёт 4.
Как думать. Если X меньше 10, то одна цифра. Если меньше 100, то две. Если меньше 1000, то три. Иначе четыре.
Решение.
X = int(input())
if X < 10:
print(1)
elif X < 100:
print(2)
elif X < 1000:
print(3)
else:
print(4)
| Ввод | Вывод |
|---|---|
| 8596 | 4 |
| 7 | 1 |
| 10 | 2 |
| 999 | 3 |
| 9999 | 4 |
Ответ: программа выше; для 8596 выводится 4.
№ 8
«Практическая работа», задание 8** «Целое число». Дано число N (N не больше 1000). Если оно целое, вывести 1, если дробное, вывести 0. Пример: 4.5 даёт 0.
Как думать. Число целое, если оно равно своей целой части. int(N) отбрасывает дробную часть: для 4.5 получится 4, а 4.5 не равно 4. Значит, число дробное.
Решение.
N = float(input()) # вводим как дробное число
if N == int(N): # равно своей целой части?
print(1) # целое
else:
print(0) # дробное
| Ввод | int(N) | Вывод |
|---|---|---|
| 4.5 | 4 | 0 |
| 7 | 7 | 1 |
| 7.0 | 7 | 1 |
| 0.5 | 0 | 0 |
| 1000 | 1000 | 1 |
Число 7.0 мы считаем целым, потому что оно равно 7.
Ответ: программа выше; для 4.5 выводится 0.
Шпаргалка
Термины: блок-схема, линейный алгоритм, ветвление, граничный тест, разряд, деление нацело.