Проверить программы онлайн · файлы остаются в браузере

Разработка подпрограмм — практикум

10 класс, углублённый уровень. Занятие одиннадцатое — практическая работа. В прошлой паре функция в задаче была одна. Сегодня их в каждой задаче две: кирпич и функция, которая из него построена. Так и разрабатывают программы — сверху вниз, подзадача за подзадачей.

План на пару. Сначала тренажёр: шесть коротких задач о том, как функции зовут друг друга, — вызов внутри вызова, функция из функций, признак на кирпиче, печатающий кирпич, какая строка упадёт, поиск с ранним return. Потом четыре программы, в каждой две функции с оговорёнными именами. Проверяет их оболочка Проверка.bat из общей папки: она запускает программу на девяти наборах данных, а потом зовёт каждую твою функцию напрямую и смотрит, что та вернула. Интернет не нужен.

Часть 1. Тренажёр: как функции зовут друг друга

Шесть типов задач, по одной на каждый. Считать в уме или на бумаге: найди, какой вызов выполнится первым, подставь аргументы в параметры, а если функция внутри зовёт другую — досчитай сначала её. Ответ — всё напечатанное через пробел; True, False и None пиши так, как их печатает Python. Ошибся — ниже появится разбор рисунком: вызовы лесенкой, что каждый вернул, — и кнопка «Новые числа»: реши такую же ещё раз.

0 верно из 6

Часть 2. Как разрабатывать программу из функций

Сверху вниз: задача — подзадачи — кирпичи

фрагмент программы — набери его сам

Думаем в таком порядке, а в файле все def стоят выше основной программы. Каждая подзадача получает имя — и дальше о ней можно думать одним словом: «если палиндром, то…».

Договор функции

ФункцияПринимаетВозвращаетПример
rev(n)натуральное числочисло задом наперёд rev(120) → 21
is_pal(n)натуральное числоTrue или False is_pal(121) → True
days_in_month(m, y)месяц, потом годчисло дней days_in_month(2, 2024) → 29

Имя, что на входе, что на выходе — этого хватает, чтобы функцией пользоваться, не заглядывая внутрь. Порядок параметров — тоже часть договора: days_in_month(2024, 2) не упадёт, а тихо вернёт 31. Договор удобно записать первой строкой тела — строкой документации в тройных кавычках.

Кирпич проверяем отдельно

фрагмент программы — набери его сам

Две строки — и кирпичу можно доверять. Бери крайние числа: однозначное, с нулём на конце, самое большое. Проверил — убери эти print из файла. Оболочка делает то же самое: зовёт каждую функцию на своих крайних числах, и ошибка в кирпиче не спрячется за удачными данными программы.

Где стоит def

фрагмент программы — набери его сам

def calc только запоминает тело: имя twice внутри ищется, когда calc позвали. Порядок def между собой не важен — важно, чтобы все они были выше первого вызова.

Три ошибки разработки

Часть 3. Четыре программы

Задание 1 Палиндромы

Палиндром — число, которое читается одинаково слева направо и справа налево: 7, 11, 121, 12321. Напиши две функции: код возвращает число код, записанное задом наперёд, а код возвращает код, если код палиндром, — через код. Программа читает два натуральных числа код и код (1 ≤ a ≤ b ≤ 100000), каждое со своей строки, и печатает, сколько палиндромов среди чисел от код до код и какой из них наибольший (0, если палиндромов нет).

Функции: код — возвращает число; код — возвращает код или код.

Вход

10
21

Вывод

Палиндромов: 1
Наибольший: 11

Проверяется: rev и is_pal напрямую — однозначные, ноль на конце (120), 100000; отрезок без палиндромов.

Если застрял

код собирает число с конца: код, код, пока код. код — одна строка: код.

Ловушки, ради которых это задание. С условием код цикл теряет первую цифру. Однозначные числа — тоже палиндромы: «лишняя осторожность» код их выбрасывает.

Задание 2 Избыточные числа

Число избыточное, если сумма его делителей, меньших его самого, больше самого числа: у 12 это 1 + 2 + 3 + 4 + 6 = 16 > 12. Напиши код — сумму делителей код, меньших код, и код — признак через код. Программа читает код и код (1 ≤ a ≤ b ≤ 2000), каждое со своей строки, и печатает, сколько избыточных чисел от код до код и какое из них первое (0, если нет).

Функции: код — возвращает число; код — возвращает код или код.

Вход

1
30

Вывод

Избыточных: 5
Первое: 12

Проверяется: sumdiv и is_abundant напрямую — 1, простое, совершенные 6 и 28, нечётное 945; отрезок без избыточных.

Если застрял

код перебирает код от 1 до код и складывает те, на которые код делится. код — код.

Ловушки, ради которых это задание. код захватывает само код — и избыточными становятся все числа. Совершенное 6 (1 + 2 + 3 = 6) не избыточное: сравнение строгое. Первое запоминай, только пока оно ещё 0.

Задание 3 Счастливые числа

Заменим число суммой квадратов его цифр и будем повторять: 7 → 49 → 97 → 130 → 10 → 1. Если цепочка пришла к 1, число счастливое. Известно, что цепочка всегда приходит либо к 1, либо к 4 — а от 4 крутится по кругу: 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4. Напиши код — сумму квадратов цифр, и код — признак через код. Программа читает количество чисел код (от 1 до 20), затем код натуральных чисел до 1000000000, каждое со своей строки, и печатает, сколько среди них счастливых и какое счастливое наибольшее (0, если нет).

Функции: код — возвращает число; код — возвращает код или код.

Вход

3
1
7
2

Вывод

Счастливых: 2
Наибольшее: 7

Проверяется: sq_digits и is_happy напрямую — 1, 4, 2, 7, 10, миллиард; что is_happy не зависает.

Если застрял

код — знакомый цикл по цифрам, только прибавляем код. код: пока код не 1 и не 4 — код; после цикла код.

Ловушки, ради которых это задание. Условие «пока не 1» на несчастливом числе крутится вечно — оболочка остановит программу через пять секунд. Для этого в условии и нужна 4.

Задание 4 Номер дня в году

Год високосный, если делится на 4 и не делится на 100 — или делится на 400: 2024 и 2000 високосные, 1900 и 2023 — нет. Напиши код и код — сколько дней в месяце код года код (февраль — через код; по 30 дней в 4, 6, 9 и 11-м месяцах — перечисли их через код). Программа читает день код, месяц код и год код (1600 ≤ y ≤ 2400, дата существует), каждое число со своей строки, и печатает номер этого дня в году.

Функции: код — возвращает код или код; код — сначала месяц, потом год, возвращает число.

Вход

1
3
2000

Вывод

Номер дня: 61

Проверяется: is_leap и days_in_month напрямую — 1900, 2000, 2100, февраль и месяцы по 30 дней; порядок параметров (m, y).

Если застрял

Номер дня — сумма дней всех месяцев до текущего плюс само код: цикл код и код.

Ловушки, ради которых это задание. «Делится на 4» — ещё не високосный: 1900 и 2100 обычные. код прибавит текущий месяц целиком. Параметры код вместо код программа переживёт, а договор — нет.

Часть 4. Сдача

  1. Файлы zadanie1.py … zadanie4.py лежат в твоей папке, отладочные print из них убраны.
  2. В общей папке двойной щелчок по Проверка.bat.
  3. «Найти мои файлы» → «Проверить всё».
  4. Покажи учителю два экрана: тренажёр наверху этой страницы и итог оболочки.
Если вместо окна открылся текст программы — файл открылся в IDLE как код. Нажми F5, окно появится.

Оболочка показывает, на каких данных программа ошиблась и что должна была вывести, а если не так ведёт себя функция — какой вызов что вернул и что должен был. Исправляй и проверяй снова, попыток сколько угодно. Отметка: четыре задания — «5», три — «4», два — «3».

Подсказка: разработка подпрограмм

Сверху вниз

Задачу делим на подзадачи: основная программа пишется так, будто нужные функции уже есть, потом каждая функция — отдельно. Кирпич (rev, sumdiv, is_leap) — внизу, из него строится следующая (is_pal, is_abundant, days_in_month).

Договор

Имя, параметры по порядку, что возвращает. days_in_month(m, y) — сначала месяц, потом год: аргументы встают по порядку, а не по смыслу. Договор пишут строкой документации в тройных кавычках.

Кирпич проверяем отдельно

print(rev(7), rev(120)) на крайних числах — до того, как строить из него дальше. Проверил — убрал print.

Вызов внутри вызова

f(g(x)): сначала g, её результат — аргумент f. Функция из функций: вызовы изнутри тела досчитываются раньше, чем внешняя вернёт своё.

Порядок def

Имя внутри функции ищется в момент вызова: def между собой в любом порядке, но все выше первого вызова. Иначе NameError.

Три ошибки

Кирпич печатает вместо return — наверх уходит None. Аргументы не в том порядке — неверный ответ без ошибки. return «не нашёл» внутри цикла — ответ на первом же числе; его место после цикла.

Материалы подготовлены с использованием технологий искусственного интеллекта.