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

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

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-й даёт пустой вывод, остальные совпадают с таблицей.

Ответ: программа выше.

Шпаргалка

Термины: тестовые данные, ожидаемый результат, граничное значение, линейный алгоритм, ветвление, остаток от деления, кратность.

Мини-тест

← 5.5. Тестирование программы