5.6–5.7. Практические задания
Информатика, 7 класс. Учебник: Кадыркулов Р. А., Рыскулбекова А. Д., Нурмуханбетова Г. К. (Алматыкітап баспасы, 2023). Раздел 5: Практическое программирование. Страницы 162–166.
Что понадобится
Это практикум: теории почти нет, зато есть двенадцать задач на Python. Тебе нужно:
- Python 3 и любое место, где можно писать и запускать код: IDLE, Thonny или онлайн-интерпретатор. Сохрани программу в файл и запусти (в IDLE меню Run → Run Module или клавиша F5).
- Привычка делать каждую задачу по одной и той же схеме.
💡 Все числа в строке читаем так:
a, b, c = map(int, input().split()). Ты вводишь числа через пробел и жмёшь Enter, аsplit()разрезает строку на слова,map(int, ...)превращает слова в целые числа.
⚠️ Частая ошибка. Если в строке могут быть дробные числа вроде 12.5, нужно
float, а неint:int("12.5")даёт ошибку.
🌟 Ни одна программа здесь не нужна «на потом»: те же приёмы (остаток
%, целое деление//, условия,min,max) используются в настоящих приложениях, например в калькуляторах тарифов.
Решаем упражнения
Разработка линейных алгоритмов задач и отладка их программ с помощью стандартных тестов
№ 1 · «Практическая работа», задача 1
«Деление поровну», простая. N детей поделили поровну K яблок. Яблоки не делили на части, поэтому некоторые дети получили на одно яблоко меньше, чем другие. Сколько детей получили на яблоко меньше? Подготовь 5 тестов и напиши программу. Образцы: 4 16 даёт 0, 7 30 даёт 5.
Как думать. Каждому достаётся K // N яблок. Остаток K % N яблок раздают по одному, и столько детей получают на одно яблоко больше. Остальные, то есть N - K % N детей, получают на одно меньше. Но если остаток равен 0, то все получили одинаково, и ответ 0. А формула N - 0 дала бы N. Поэтому берём ещё остаток от деления на N: (N - K % N) % N.
Тесты (посчитаны заранее):
| № | Ввод N K | Ожидаем | Что проверяем |
|---|---|---|---|
| 1 | 6 20 | 4 | обычный: по 3, остаток 2, значит 4 ребёнка с «меньше» |
| 2 | 9 27 | 0 | обычный: делится нацело |
| 3 | 5 3 | 2 | граничный: яблок меньше, чем детей (трое по яблоку, двое с нулём) |
| 4 | 1 10 | 0 | граничный: ребёнок один |
| 5 | 10 1 | 9 | граничный: одно яблоко на десятерых |
Решение.
n, k = map(int, input().split()) # детей и яблок
fewer = (n - k % n) % n # сколько детей получили на яблоко меньше
print(fewer)
Программа запущена на этих пяти тестах и на образцах, ответы совпали.
Ответ: (N - K % N) % N (для 6 и 20 получится 4).
№ 2 · «Практическая работа», задача 2
«Прямоугольник», простая. Дан прямоугольник A × B метров. Сколько квадратов со стороной S метров можно из него вырезать? Подготовь 3 теста и напиши программу. Образец: 5 6 5 даёт 1.
Как думать. Режем по сетке, стороны квадратов параллельны сторонам прямоугольника. Вдоль стороны A помещается A // S квадратов, вдоль стороны B помещается B // S. Всего: произведение этих чисел.
| № | Ввод A B S | Ожидаем | Что проверяем |
|---|---|---|---|
| 1 | 10 10 5 | 4 | обычный: 2 × 2 |
| 2 | 4 4 5 | 0 | граничный: квадрат больше прямоугольника |
| 3 | 7 3 1 | 21 | обычный: 7 × 3 |
Решение.
a, b, s = map(int, input().split())
print((a // s) * (b // s)) # сколько квадратов в ширину на сколько в длину
Запущено: 4, 0, 21, образец дал 1.
Ответ: (A // S) * (B // S).
№ 3 · «Практическая работа», задача 3
«Канцелярские товары», средняя. Гаухар купила X ручек, Y линеек и Z ластиков. Ручка на 10 тенге дешевле линейки и на 5 тенге дороже ластика. Ручка стоит P тенге. Сколько Гаухар заплатила за все покупки? Ввод: X, Y, Z, P. Подготовь 3 теста и напиши программу. Образец: 7 10 5 20 даёт 515.
Как думать. Ручка дешевле линейки на 10, значит линейка стоит P + 10. Ручка дороже ластика на 5, значит ластик стоит P - 5. Итого: X*P + Y*(P+10) + Z*(P-5). Проверь знаки на образце: 7·20 + 10·30 + 5·15 = 140 + 300 + 75 = 515.
| № | Ввод X Y Z P | Ожидаем | Что проверяем |
|---|---|---|---|
| 1 | 1 1 1 10 | 35 | обычный: 10 + 20 + 5 |
| 2 | 2 3 4 5 | 55 | граничный: ластик стоит 0 тенге |
| 3 | 0 0 0 100 | 0 | граничный: ничего не куплено |
Решение.
x, y, z, p = map(int, input().split()) # ручки, линейки, ластики, цена ручки
ruler = p + 10 # линейка дороже ручки на 10
eraser = p - 5 # ластик дешевле ручки на 5
print(x * p + y * ruler + z * eraser)
Ответ: X*P + Y*(P+10) + Z*(P-5).
№ 4 · «Практическая работа», задача 4
«Оплата за телефон», повышенной сложности ⭐. Первые A минут разговоров в месяц стоят K тенге за минуту, а каждая минута сверх этого стоит B тенге. Канат говорил P минут. Сколько он платит? Порядок ввода: P, A, K, B (1 ≤ P ≤ 1000, 1 ≤ A ≤ 500, 1 ≤ K ≤ 50, 1 ≤ B ≤ 100). Подготовь 5 тестов. Образец: 392 300 10 25 даёт 5300.
Как думать. Здесь два случая. Если P <= A, платим P * K. Если P > A, то первые A минут по K и остальные P - A минут по B: A*K + (P - A)*B. Проверь образец: 300·10 + 92·25 = 3000 + 2300 = 5300.
| № | Ввод P A K B | Ожидаем | Что проверяем |
|---|---|---|---|
| 1 | 100 300 10 25 | 1000 | обычный: в пределах лимита |
| 2 | 300 300 10 25 | 3000 | граничный: ровно лимит |
| 3 | 301 300 10 25 | 3025 | граничный: на минуту больше лимита |
| 4 | 350 300 10 40 | 5000 | обычный: 3000 + 50·40 |
| 5 | 1000 500 50 100 | 75000 | граничный: максимальные значения |
Решение.
p, a, k, b = map(int, input().split()) # минуты, лимит, цена минуты, цена сверхурочной
if p <= a:
print(p * k) # укладываемся в лимит
else:
print(a * k + (p - a) * b) # лимит по обычной цене, остаток по сверхурочной
Ответ: P*K, если P <= A, иначе A*K + (P - A)*B.
Разработка алгоритмов ветвления задач и отладка их программ с помощью стандартных тестов
№ 5 · «Практическая работа», задача 5
Простая. Даны две блок-схемы. Подготовь для каждой 5 тестов, проверь схемы и напиши по ним программы на Python. Образец для схемы 1: X = 10, Y = 7 даёт X = 3, Y = 7.
Как думать. Блок-схему читаем сверху вниз.
Схема 1: ввод X и Y. Условие X > Y. Если «Да», то X = X % Y, если «Нет», то Y = Y % X. В конце вывод X и Y.
Схема 2: ввод a, b, c. Условие a % b == c. Если «Да», то c = (a + b) // c, если «Нет», то c = (a * b) % c. В конце вывод c.
Решение.
Схема 1.
x, y = map(int, input().split())
if x > y:
x = x % y # ветка «Да»: меняем X
else:
y = y % x # ветка «Нет»: меняем Y
print(x, y)
| № | Ввод X Y | Ожидаем | Ветка |
|---|---|---|---|
| 1 | 10 7 | 3 7 | Да (образец) |
| 2 | 7 10 | 7 3 | Нет |
| 3 | 20 6 | 2 6 | Да |
| 4 | 3 9 | 3 0 | Нет, остаток 0 |
| 5 | 5 5 | 5 0 | Нет (X > Y не выполнено при равных числах) |
Схема 2.
a, b, c = map(int, input().split())
if a % b == c:
c = (a + b) // c # ветка «Да»
else:
c = (a * b) % c # ветка «Нет»
print(c)
| № | Ввод a b c | Ожидаем | Ветка |
|---|---|---|---|
| 1 | 17 5 2 | 11 | Да: 17 % 5 = 2, (17 + 5) // 2 |
| 2 | 17 5 3 | 1 | Нет: 85 % 3 |
| 3 | 14 4 2 | 9 | Да |
| 4 | 6 3 5 | 3 | Нет: 18 % 5 |
| 5 | 20 4 1 | 0 | Нет: 80 % 1 |
⚠️ Частая ошибка. В обеих схемах есть деление и остаток. Если
Y,Xилиcравны 0, Python остановится с ошибкойZeroDivisionError. Например, в схеме 2 ввод6 3 0даст6 % 3 = 0, это равно c, и дальше18 // 0. Такие данные из-за деления на ноль относим к исключительным: программа должна их не принимать.
Ответ: схема 1 печатает два числа, как в таблице (10 7 даёт 3 7), схема 2 печатает одно (14 4 2 даёт 9). Код выше.
№ 6 · «Практическая работа», задача 6
Простая. Даны числа A, B, C. Сколько из них целые? Подготовь 3 теста. Образец: 12.5 14 45 даёт 2.
Как думать. Целое число делится на 1 без остатка: x % 1 == 0. Читаем числа как float, ведь среди них бывают дробные. Для каждого целого число счётчик увеличиваем на 1.
| № | Ввод A B C | Ожидаем | Что проверяем |
|---|---|---|---|
| 1 | 1.5 2.5 3.5 | 0 | нет ни одного целого |
| 2 | 1 2 3 | 3 | все целые |
| 3 | -4 0 2.25 | 2 | отрицательное и ноль считаются целыми |
Решение.
a, b, c = map(float, input().split())
k = 0 # счётчик целых чисел
if a % 1 == 0:
k += 1
if b % 1 == 0:
k += 1
if c % 1 == 0:
k += 1
print(k)
Запущено на тестах и на образце: 0, 3, 2 и 2 (для 12.5 14 45). Ввод 7.0 7.5 8 даёт 2: 7.0 тоже целое число.
Ответ: программа выше; число x целое, если x % 1 == 0.
№ 7 · «Практическая работа», задача 7
Простая. Даны числа A, B, C, D. Скольким из остальных чисел кратно число A? Подготовь 3 теста. Образец: 60 30 15 4 даёт 3.
Как думать. «A кратно x» значит, что A делится на x без остатка: A % x == 0. Проверим три числа B, C, D и посчитаем, сколько раз получился 0. Образец: 60 делится на 30, на 15 и на 4, поэтому ответ 3.
| № | Ввод A B C D | Ожидаем | Что проверяем |
|---|---|---|---|
| 1 | 10 3 4 5 | 1 | только 10 делится на 5 |
| 2 | 7 2 3 4 | 0 | ни на одно |
| 3 | 12 12 6 5 | 2 | на 12 и на 6, на 5 нет |
Решение.
a, b, c, d = map(int, input().split())
k = 0 # сколько чисел делят A нацело
if a % b == 0:
k += 1
if a % c == 0:
k += 1
if a % d == 0:
k += 1
print(k)
Запущено: 1, 0, 2, образец дал 3. Если B, C или D равно 0, на 0 делить нельзя: такие данные в задаче не предполагаются.
Ответ: программа выше, считаем числа x из B, C, D, для которых A % x == 0.
№ 8 · «Практическая работа», задача 8
Средняя. Числа S, L, M, N (0 ≤ S ≤ 10⁷, 0 ≤ L ≤ 10⁷, 0 ≤ M ≤ 10⁷, 1 ≤ N ≤ 10⁷) вводятся в таком порядке. Найди значение по формуле min{max(S, L), min(M, N)}. Подготовь 5 тестов. Образец: 15 3 9 6 даёт 6.
📕 В учебнике сказано найти «наименьшее из этих четырёх чисел», но по формуле считается другое: в образце
15 3 9 6наименьшее из четырёх число 3, а ответ 6. Считать надо по формуле: берём большее из S и L, меньшее из M и N, а потом меньшее из этих двух.
Как думать. Считаем изнутри: max(S, L), потом min(M, N), потом min от результатов. Образец: max(15, 3) = 15, min(9, 6) = 6, min(15, 6) = 6.
| № | Ввод S L M N | Ожидаем | Что проверяем |
|---|---|---|---|
| 1 | 1 1 1 1 | 1 | все числа равны |
| 2 | 0 0 5 5 | 0 | нули, граничный |
| 3 | 4 9 20 30 | 9 | max(4, 9) = 9, min(20, 30) = 20 |
| 4 | 10000000 0 10000000 1 | 1 | максимальные значения |
| 5 | 2 8 7 3 | 3 | max(2, 8) = 8, min(7, 3) = 3 |
Решение.
s, l, m, n = map(int, input().split())
print(min(max(s, l), min(m, n))) # изнутри наружу
Запущено: на образце 6, на тестах 1, 0, 9, 1.
Ответ: min(max(S, L), min(M, N)); для образца 6.
№ 9 · «Практическая работа», задача 9
Простая. По номеру месяца выведи, сколько в нём дней (в феврале 28). Образцы: 7 даёт 31, 2 даёт 28.
Как думать. Месяцев с 30 днями четыре: апрель, июнь, сентябрь, ноябрь (4, 6, 9, 11). Февраль (2) особый, 28 дней. Все остальные 31. Номер вне диапазона 1–12 считаем исключительным и сообщаем об ошибке.
| № | Ввод | Ожидаем | Этап |
|---|---|---|---|
| 1 | 4 | 30 | нормальный |
| 2 | 1 | 31 | граничный (первый месяц) |
| 3 | 12 | 31 | граничный (последний месяц) |
| 4 | 9 | 30 | нормальный |
| 5 | 13 | Такого месяца нет | исключительный |
Решение.
m = int(input())
if m < 1 or m > 12:
print("Такого месяца нет") # исключительные данные
elif m == 2:
print(28)
elif m == 4 or m == 6 or m == 9 or m == 11:
print(30)
else:
print(31)
Запущено на тестах, на значениях 0, 7 и 2: ответы совпали.
Ответ: программа выше: 2 даёт 28; 4, 6, 9, 11 дают 30; остальные от 1 до 12 дают 31.
№ 10 · «Практическая работа», задача 10
Средняя. Казахский 12-летний цикл «бір мүшел» начинается с года Мыши, и 1900 год был годом Мыши. Определи по году K (K ≥ 1900) название года. Образцы: 2020 даёт «мышь», 1974 даёт «барс».
Как думать. Животные идут по кругу по 12. Берём остаток от деления (K - 1900) % 12 и ищем зверя в списке по номеру. Номер 0 — мышь, значит, и 1900, и 2020 (120 = 10·12) попадают на мышь.
| Остаток | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| Зверь | мышь | корова | барс | заяц | улитка | змея |
| Остаток | 6 | 7 | 8 | 9 | 10 | 11 |
|---|---|---|---|---|---|---|
| Зверь | лошадь | овца | обезьяна | курица | собака | свинья |
💡 Это список по номерам:
names[0]— «мышь»,names[2]— «барс». Нумерация идёт с нуля, поэтому остаток 0 как раз попадает на первый элемент.
| № | Ввод K | Ожидаем | Что проверяем |
|---|---|---|---|
| 1 | 1900 | мышь | граничный: самый ранний год |
| 2 | 1901 | корова | сразу следующий |
| 3 | 1911 | свинья | последний зверь цикла |
| 4 | 1912 | мышь | цикл начался заново |
| 5 | 2023 | заяц | обычный |
Решение.
names = ["мышь", "корова", "барс", "заяц", "улитка", "змея",
"лошадь", "овца", "обезьяна", "курица", "собака", "свинья"]
k = int(input())
print(names[(k - 1900) % 12])
Запущено на 1900, 1901, 1911, 1912, 2023, 2024 (улитка) и на образцах 2020 и 1974: ответы верные.
Ответ: names[(K - 1900) % 12].
№ 11 · «Практическая работа», задача 11
«Счастливый билет», повышенной сложности ⭐. Номер билета шестизначный. Билет счастливый, если сумма первых трёх цифр равна сумме последних трёх. В единственной строке входного файла Input.txt записан номер N. Если билет счастливый, в выходной файл Output.txt нужно записать «Да», иначе «Нет». Подготовь 5 тестов и напиши программу. Образцы: 385916 даёт «Да», 900017 даёт «Нет».
📕 В учебнике указано, что 10⁶ ≤ N < 10⁷, но правильно 10⁵ ≤ N < 10⁶: числа от 10⁶ до 10⁷ семизначные, а билет шестизначный (от 100000 до 999999).
Как думать. Номер удобно читать как строку: тогда цифры доступны по номеру s[0], s[1], … s[5], а нули в начале (например 007700) не потеряются. Каждую цифру превращаем в число функцией int().
Файлы до и после запуска (в одной папке с программой):
| Файл | Было до запуска | Стало после запуска |
|---|---|---|
| Input.txt | 385916 |
385916 |
| Output.txt | нет файла, или старое | Да |
| № | Input.txt | Ожидаем в Output.txt | Что проверяем |
|---|---|---|---|
| 1 | 385916 | Да | обычный (образец) |
| 2 | 900017 | Нет | обычный (образец; суммы 9 и 8) |
| 3 | 100000 | Нет | граничный: самый маленький номер |
| 4 | 999999 | Да | граничный: самый большой номер |
| 5 | 123456 | Нет | обычный: 6 и 15 |
Решение.
# читаем номер билета как СТРОКУ, чтобы не потерять нули в начале
with open("Input.txt", encoding="utf-8-sig") as f:
s = f.readline().strip()
left = int(s[0]) + int(s[1]) + int(s[2]) # сумма первых трёх цифр
right = int(s[3]) + int(s[4]) + int(s[5]) # сумма последних трёх цифр
with open("Output.txt", "w", encoding="utf-8") as f:
if left == right:
f.write("Да")
else:
f.write("Нет")
Как проверить: создай в блокноте файл Input.txt в той же папке, что и программа, запиши номер, запусти программу и открой появившийся Output.txt. Если Python не находит файл, укажи полный путь к нему в open(...).
Запускалось с настоящими файлами Input.txt и Output.txt на всех пяти номерах, плюс на 007700 (нули в начале, ответ «Да»). Все результаты совпали с таблицей.
Ответ: программа выше записывает «Да» в Output.txt, если сумма первых трёх цифр равна сумме последних трёх.
№ 12 · «Практическая работа», задача 12
«Сила града», повышенной сложности ⭐. Счётчик Burshaq измеряет силу града. Если сила K ниже A, на экране «Града нет». Если K больше A, но меньше B, на экране «Град». Если K больше B, сообщение не показывается. Ввод: A, B (A < B) и K. Подготовь 5 тестов. Образцы: 10 20 15 даёт «Град», 10 20 5 даёт «Града нет», 10 20 30 даёт пустой экран.
Как думать. Три случая, и в третьем программа ничего не выводит. В условии не сказано, что делать при K == A и K == B. Мы выбираем: K <= A значит «Града нет», A < K <= B значит «Град». Главное, чтобы выбор был одинаковым в программе и в тестах.
| № | Ввод A B K | Ожидаем | Что проверяем |
|---|---|---|---|
| 1 | 10 20 15 | Град | обычный |
| 2 | 10 20 5 | Града нет | обычный |
| 3 | 10 20 30 | (пусто) | обычный: слишком сильный |
| 4 | 10 20 10 | Града нет | граничный: K равно A (наш выбор) |
| 5 | 10 20 20 | Град | граничный: K равно B (наш выбор) |
Решение.
a, b, k = map(int, input().split())
if k <= a:
print("Града нет")
elif k <= b:
print("Град")
# если k больше b, ничего не выводим
Запущено на всех пяти тестах: 3-й даёт пустой вывод, остальные совпадают с таблицей.
Ответ: программа выше.
Шпаргалка
Термины: тестовые данные, ожидаемый результат, граничное значение, линейный алгоритм, ветвление, остаток от деления, кратность.