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

Разбиение на подзадачи и библиотеки — практикум

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

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

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

Шесть типов задач, по одной на каждый. Считать в уме или на бумаге: программу читаем этапами, а не строкой за строкой. Где ответ — номер варианта или строки, пиши только число; где порядок — номера через пробел.

0 верно из 6

Часть 2. Как резать задачу на подзадачи

Подзадача — это кусок с входом и выходом

«Сколько делителей у числа N и какова их сумма» — задача. Разрезать её можно так, что каждый кусок можно объяснить одной фразой и проверить отдельно:

ЭтапЧто на входеЧто на выходе
1. граница перебораNцелая часть корня из N
2. перебор делителей до границыN и границасчётчик и сумма
3. выводсчётчик и суммадве строки на экране

Пока кусок нельзя описать так — «что дали, что получилось», — он и не подзадача, а просто кусок текста программы.

Порядок задают данные, а не наше желание

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

Переставить этапы нельзя: каждый следующий пользуется тем, что посчитал предыдущий. Python скажет об этом прямо — NameError: name 's' is not defined. А вот два независимых этапа переставляются свободно: это и есть признак, что они не связаны данными.

Проверять по одному

Главная выгода от разрезания — ошибку видно сразу. Допиши после этапа временный print, посмотри на его число, убедись, что оно верное, и только потом пиши следующий этап:

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

Такие отладочные print убирают перед сдачей: оболочка сверяет вывод целиком, и лишняя строка — уже другой ответ.

Часть подзадач уже решена

«Наибольший общий делитель», «целая часть корня», «модуль числа», «факториал», «округлить вверх» — всё это писали до нас. Такой кусок не пишут заново: его зовут по имени.

Цикл, который мы бы написалиГотовый вызов
вычитаем меньшее из большего, пока не сравняютсяgcd(a, b)
ищем наибольшее d, у которого d · d ≤ nisqrt(n)
умножаем все числа от 2 до nfactorial(n)
если число отрицательное — меняем знакabs(x)
сравниваем два числа и берём большееmax(a, b)

Часть 3. Библиотеки

Три способа подключить

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

Ошибка «NameError: name 'sqrt' is not defined» почти всегда значит, что подключение и вызов из разных строчек этой таблички. Мы будем писать from math import ... и from random import * — так же, как на доске.

Что лежит в стандартной библиотеке

МодульЧто берём сегодня
mathsqrt, isqrt, floor, ceil, gcd, factorial, hypot, pi
randomrandint, randrange, random, seed
timetime() — узнать, сколько секунд считалась программа

Стандартная библиотека уже лежит внутри установленного Python: достаточно import, скачивать ничего не надо.

Целое или дробное — смотри, что возвращает функция

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

Дробное печатается с точкой, и если задание просит целое число, 4.0 будет другим ответом. Целый корень — это isqrt, а не sqrt.

Три ловушки чужих функций

Чужая документация

Что делает незнакомая функция, написано у её авторов — прямо в Python: наберите в IDLE help(round) или help(math.isqrt). Это та же шапка «что на входе, что на выходе», которую мы писали сами в прошлой паре, только чужая.

Сторонние библиотеки

Всё, чего нет в поставке Python, ставится отдельно — командой pip install <имя> в командной строке (не в самой программе). Так ставят pygame (игры), pillow (картинки), requests (запросы в сеть), numpy (числа таблицами). До установки import для них не работает.

Чужой код получает ваши права. pip ставит то, что попросили, и за содержимое не отвечает: библиотека выполняется так же, как ваша программа. Поэтому смотрят, кто автор, сколько людей ею пользуется и когда она обновлялась в последний раз. На школьные машины мы сегодня ничего не ставим — смотрим на проекторе.

Часть 4. Три программы

Задание 1 Делители числа

Программа читает натуральное число код (от 1 до 1000000000) и печатает, сколько у него делителей и чему равна их сумма. Делители считаются все, включая 1 и само код.

Этапы: граница перебора — готовая код из код; перебор делителей до границы; вывод.

Вход

36

Вывод

Делителей: 9
Сумма делителей: 91

Проверяется: граница перебора и полный квадрат, у которого пара делителей совпадает сама с собой.

Если застрял

Каждый найденный делитель код даёт сразу два: код и код. Поэтому перебирать надо не до код, а до целого корня — дальше начнутся те же пары, только наоборот. Для 36 это 1 и 36, 2 и 18, 3 и 12, 4 и 9, 6 и 6.

Ловушки, ради которых это задание. У полного квадрата (36 и код) пара — само это число: посчитав его дважды, получишь 10 делителей вместо 9. Оболочка подаст 1 (единственный делитель), 4, 36, 49 и большое число: перебор до код на нём просто не успеет.

Задание 2 НОД цепочки

Программа читает количество чисел код (от 1 до 20), затем код натуральных чисел от 1 до 1200, каждое со своей строки. Печатает наибольший общий делитель всех введённых чисел и сколько чисел со второго по последнее взаимно просты с первым (взаимно простые — те, у которых НОД равен 1). Списков не нужно: числа читаются по одному.

Этапы: накопить НОД цепочки готовой код из код; посчитать взаимно простые с первым; вывод.

Вход

3
12
18
30

Вывод

НОД: 6
Взаимно простых с первым: 0

Проверяется: старт накопителя и то, что первое число не сравнивается само с собой.

Если застрял

НОД цепочки набирается по одному числу: код. Начинать удобно с нуля — код равен код, поэтому первое же число попадёт в код целиком.

Ловушки, ради которых это задание. Старт код портит всё: код всегда 1. Первое число запомни отдельно и со второго сравнивай с ним; само с собой первое сравнивать нельзя — иначе на вводе, который начинается с единицы, счётчик станет на один больше. И одно-единственное число тоже бывает: тогда взаимно простых ноль, а НОД — само число.

Задание 3 Броски кубика

Программа читает посев код (целое от 0 до 1000000) и количество бросков код (от 1 до 1000), каждое со своей строки. Затем делает код и бросает кубик код раз — код. Печатает сумму выпавших очков и сколько раз выпала шестёрка.

Этапы: ввод; посев; код бросков с двумя накопителями; вывод. Подключать так: код.

Вход

42
10

Вывод

Сумма: 30
Шестёрок: 3

Проверяется: посев до бросков и правильные границы у код. Ответ у всех получится один и тот же — в этом и смысл посева.

Если застрял

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

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

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

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

Оболочка показывает, на каких данных программа ошиблась и что должна была вывести, а если соврала шапка — что она обещала и что вышло на деле. Исправляй и проверяй снова, попыток сколько угодно.

Подсказка: подзадачи и библиотеки

Подзадача

Кусок с понятным входом и выходом, который можно проверить отдельно. Пока кусок нельзя описать словами «что дали — что получилось», это не подзадача.

Порядок этапов

Задают данные: этап, которому нужна переменная, идёт после того, кто её посчитал. Иначе NameError. Независимые этапы переставляются свободно.

Подключение

import math — пришло имя math, звать через точку: math.sqrt(16). from math import sqrt — пришло имя sqrt, звать без приставки, а имени math нет. from math import * — пришли все имена библиотеки.

Что лежит в math

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. Чужой код работает с вашими правами — смотри, кто автор и живая ли библиотека.

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