Проверить программы онлайн · файлы остаются в браузере
10 класс, углублённый уровень. Занятие девятое: как разрезать большую задачу на куски с понятным входом и выходом — и как узнать, что часть этих кусков уже написана до нас.
Проверка.bat из общей папки: она запускает программу на девяти
наборах данных. Интернет не нужен.
Шесть типов задач, по одной на каждый. Считать в уме или на бумаге: программу читаем этапами, а не строкой за строкой. Где ответ — номер варианта или строки, пиши только число; где порядок — номера через пробел.
«Сколько делителей у числа N и какова их сумма» — задача. Разрезать её можно так, что каждый кусок можно объяснить одной фразой и проверить отдельно:
| Этап | Что на входе | Что на выходе |
|---|---|---|
| 1. граница перебора | N | целая часть корня из N |
| 2. перебор делителей до границы | N и граница | счётчик и сумма |
| 3. вывод | счётчик и сумма | две строки на экране |
Пока кусок нельзя описать так — «что дали, что получилось», — он и не подзадача, а просто кусок текста программы.
Переставить этапы нельзя: каждый следующий пользуется тем, что посчитал
предыдущий. Python скажет об этом прямо — NameError: name 's' is not
defined. А вот два независимых этапа переставляются свободно: это и
есть признак, что они не связаны данными.
Главная выгода от разрезания — ошибку видно сразу. Допиши после этапа
временный print, посмотри на его число, убедись, что оно верное, и
только потом пиши следующий этап:
Такие отладочные print убирают перед сдачей: оболочка сверяет
вывод целиком, и лишняя строка — уже другой ответ.
«Наибольший общий делитель», «целая часть корня», «модуль числа», «факториал», «округлить вверх» — всё это писали до нас. Такой кусок не пишут заново: его зовут по имени.
| Цикл, который мы бы написали | Готовый вызов |
|---|---|
| вычитаем меньшее из большего, пока не сравняются | gcd(a, b) |
| ищем наибольшее d, у которого d · d ≤ n | isqrt(n) |
| умножаем все числа от 2 до n | factorial(n) |
| если число отрицательное — меняем знак | abs(x) |
| сравниваем два числа и берём большее | max(a, b) |
Ошибка «NameError: name 'sqrt' is not defined» почти всегда
значит, что подключение и вызов из разных строчек этой таблички. Мы будем писать
from math import ... и from random import * — так же,
как на доске.
| Модуль | Что берём сегодня |
|---|---|
math | sqrt, isqrt,
floor, ceil, gcd,
factorial, hypot, pi |
random | randint, randrange,
random, seed |
time | time() — узнать, сколько секунд
считалась программа |
Стандартная библиотека уже лежит внутри установленного Python: достаточно
import, скачивать ничего не надо.
Дробное печатается с точкой, и если задание просит целое число, 4.0
будет другим ответом. Целый корень — это isqrt, а не
sqrt.
int — это не //. int отбрасывает
дробную часть (округляет к нулю), // и floor
округляют вниз: int(−7 / 2) даёт −3, а −7 // 2 даёт
−4.round округляет половину к чётному.
round(2.5) — это 2, а round(3.5) — 4. Нужно «вверх»
— есть ceil.from random import *
строка seed = int(input()) занимает имя seed
числом, и вызов seed(...) падает. Входное число для генератора
называем start.Что делает незнакомая функция, написано у её авторов — прямо в Python:
наберите в IDLE help(round) или help(math.isqrt). Это
та же шапка «что на входе, что на выходе», которую мы писали сами в прошлой
паре, только чужая.
Всё, чего нет в поставке Python, ставится отдельно — командой
pip install <имя> в командной строке (не в самой программе).
Так ставят pygame (игры), pillow (картинки),
requests (запросы в сеть), numpy (числа таблицами).
До установки import для них не работает.
pip ставит то, что попросили,
и за содержимое не отвечает: библиотека выполняется так же, как ваша программа.
Поэтому смотрят, кто автор, сколько людей ею пользуется и когда она обновлялась
в последний раз. На школьные машины мы сегодня ничего не ставим — смотрим на
проекторе.
zadanie1.py, zadanie2.py, zadanie3.py.input(). Пиши input(),
а не input("Введите число: ") — вывод читает машина.print из готовой программы убери.# Ввод:, # Вывод:, # Пример:) —
по желанию. Если она есть, пример в ней оболочка проверит запуском.Программа читает натуральное число (от 1 до 1000000000) и
печатает, сколько у него делителей и чему равна их сумма. Делители считаются
все, включая 1 и само
.
Этапы: граница перебора — готовая из
; перебор делителей до границы; вывод.
36
Делителей: 9 Сумма делителей: 91
Проверяется: граница перебора и полный квадрат, у которого пара делителей совпадает сама с собой.
Каждый найденный делитель даёт сразу два:
и
. Поэтому перебирать надо не до
, а до целого корня — дальше начнутся те же пары, только
наоборот. Для 36 это 1 и 36, 2 и 18, 3 и 12, 4 и 9, 6 и 6.
Ловушки, ради которых это задание. У полного квадрата (36 и
) пара — само это число: посчитав его дважды, получишь 10
делителей вместо 9. Оболочка подаст 1 (единственный делитель), 4, 36, 49 и
большое число: перебор до
на нём просто не успеет.
Программа читает количество чисел (от 1 до 20), затем
натуральных чисел от 1 до 1200, каждое со своей строки. Печатает
наибольший общий делитель всех введённых чисел и сколько чисел со второго по
последнее взаимно просты с первым (взаимно простые — те, у которых НОД
равен 1). Списков не нужно: числа читаются по одному.
Этапы: накопить НОД цепочки готовой из
; посчитать взаимно простые с первым; вывод.
3 12 18 30
НОД: 6 Взаимно простых с первым: 0
Проверяется: старт накопителя и то, что первое число не сравнивается само с собой.
НОД цепочки набирается по одному числу: . Начинать
удобно с нуля —
равен
, поэтому первое же
число попадёт в
целиком.
Ловушки, ради которых это задание. Старт портит всё:
всегда 1. Первое число запомни отдельно и со второго
сравнивай с ним; само с собой первое сравнивать нельзя — иначе на вводе,
который начинается с единицы, счётчик станет на один больше. И одно-единственное
число тоже бывает: тогда взаимно простых ноль, а НОД — само число.
Программа читает посев (целое от 0 до 1000000) и
количество бросков
(от 1 до 1000), каждое со своей строки. Затем
делает
и бросает кубик
раз —
. Печатает сумму выпавших очков и сколько раз выпала
шестёрка.
Этапы: ввод; посев; бросков с двумя накопителями; вывод.
Подключать так:
.
42 10
Сумма: 30 Шестёрок: 3
Проверяется: посев до бросков и правильные границы у
. Ответ у всех получится один и тот же — в этом и смысл
посева.
Порядок строгий: сначала , потом ровно
бросков. Посев задаёт, с какого места генератор начнёт свою
последовательность, — поэтому у всех с одним посевом выпадет одно и то же, и
такую программу вообще можно проверить.
Ловушки, ради которых это задание. —
это не кубик: правая граница туда не входит, шестёрка не выпадет никогда
(
— то же, что
). Посев
после бросков ничего не закрепляет. И не называй переменную
: после
это имя занято
функцией.
zadanie1.py … zadanie3.py лежат в твоей
папке, отладочные print из них убраны.Проверка.bat.Оболочка показывает, на каких данных программа ошиблась и что должна была вывести, а если соврала шапка — что она обещала и что вышло на деле. Исправляй и проверяй снова, попыток сколько угодно.
Кусок с понятным входом и выходом, который можно проверить отдельно. Пока кусок нельзя описать словами «что дали — что получилось», это не подзадача.
Задают данные: этап, которому нужна переменная, идёт после того, кто её посчитал. Иначе NameError. Независимые этапы переставляются свободно.
import math — пришло имя math, звать через точку: math.sqrt(16). from math import sqrt — пришло имя sqrt, звать без приставки, а имени math нет. from math import * — пришли все имена библиотеки.
sqrt (дробный корень), isqrt (целый), floor (вниз), ceil (вверх), gcd, factorial, hypot, pi. В random: randint(a, b) — от a до b включительно, randrange(a, b) — правая граница НЕ входит, seed(start) — посев.
sqrt, pow из math и hypot возвращают дробное даже при ровном ответе: печатается 4.0. Целое дают isqrt, gcd, factorial, floor, ceil.
int(a / b) округляет к нулю, а // и floor — вниз: на отрицательных они расходятся. round(2.5) = 2 — половина округляется к чётному. Переменная с именем функции (seed) затирает функцию.
Не входят в Python, ставятся командой pip install <имя> в командной строке: pygame, pillow, requests, numpy. Чужой код работает с вашими правами — смотри, кто автор и живая ли библиотека.
Материалы подготовлены с использованием технологий искусственного интеллекта.