Проверить программы онлайн · файлы остаются в браузере
10 класс, углублённый уровень. Занятие одиннадцатое — практическая работа. В прошлой паре функция в задаче была одна. Сегодня их в каждой задаче две: кирпич и функция, которая из него построена. Так и разрабатывают программы — сверху вниз, подзадача за подзадачей.
return. Потом четыре программы, в каждой две функции с
оговорёнными именами. Проверяет их оболочка Проверка.bat из общей
папки: она запускает программу на девяти наборах данных, а потом зовёт
каждую твою функцию напрямую и смотрит, что та вернула. Интернет не
нужен.
Шесть типов задач, по одной на каждый. Считать в уме или на бумаге:
найди, какой вызов выполнится первым, подставь аргументы в параметры, а если
функция внутри зовёт другую — досчитай сначала её. Ответ — всё напечатанное через
пробел; True, False и None пиши так, как их
печатает Python. Ошибся — ниже появится разбор рисунком: вызовы лесенкой, что
каждый вернул, — и кнопка «Новые числа»: реши такую же ещё раз.
Думаем в таком порядке, а в файле все 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 calc только запоминает тело: имя twice внутри
ищется, когда calc позвали. Порядок def между собой не
важен — важно, чтобы все они были выше первого вызова.
return. Наверх уходит
None: half(x) + 1 — TypeError, а
if is_leap(y): молча ложно.return -1 в else
отвечает на первом же числе. «Нашёл» — return в цикле,
«не нашёл» — после цикла.zadanie1.py … zadanie4.py. Заведи для этой пары
новую папку — в прошлой были свои zadanie1.py.def и зовёт каждую напрямую на своих
числах. Функции нет, она печатает вместо return или параметры
стоят не в том порядке — задание не принято, даже если вывод программы
верный.input(). Пиши input(),
а не input("Введите число: ") — вывод читает машина.# Ввод:, # Вывод:, # Пример:) —
по желанию. Если она есть, пример в ней оболочка проверит запуском.Палиндром — число, которое читается одинаково слева направо и справа
налево: 7, 11, 121, 12321. Напиши две функции: возвращает
число
, записанное задом наперёд, а
возвращает
, если
палиндром, — через
. Программа читает два натуральных числа
и
(1 ≤ a ≤ b ≤ 100000), каждое со своей строки, и печатает, сколько
палиндромов среди чисел от
до
и какой из них
наибольший (0, если палиндромов нет).
Функции: — возвращает число;
— возвращает
или
.
10 21
Палиндромов: 1 Наибольший: 11
Проверяется: rev и is_pal напрямую — однозначные, ноль на конце (120), 100000; отрезок без палиндромов.
собирает число с конца:
,
, пока
.
—
одна строка:
.
Ловушки, ради которых это задание. С условием
цикл теряет первую цифру. Однозначные числа — тоже палиндромы: «лишняя
осторожность»
их выбрасывает.
Число избыточное, если сумма его делителей, меньших его самого,
больше самого числа: у 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.
Заменим число суммой квадратов его цифр и будем повторять:
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 и не делится на 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 обычные. прибавит
текущий месяц целиком. Параметры
вместо
программа переживёт, а договор — нет.
zadanie1.py … zadanie4.py лежат в твоей
папке, отладочные print из них убраны.Проверка.bat.Оболочка показывает, на каких данных программа ошиблась и что должна была вывести, а если не так ведёт себя функция — какой вызов что вернул и что должен был. Исправляй и проверяй снова, попыток сколько угодно. Отметка: четыре задания — «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 между собой в любом порядке, но все выше первого вызова. Иначе NameError.
Кирпич печатает вместо return — наверх уходит None. Аргументы не в том порядке — неверный ответ без ошибки. return «не нашёл» внутри цикла — ответ на первом же числе; его место после цикла.
Материалы подготовлены с использованием технологий искусственного интеллекта.