Проверить программы онлайн · файлы остаются в браузере
10 класс, углублённый уровень. Занятие третье: четыре типа данных, целые и вещественные числа, случайные числа и то, где каждый из них подводит.
Проверка.bat из общей папки: она запускает программу на семи
наборах данных. Интернет не нужен.
Шесть типов задач, по две на каждый. Считать в уме или на бумаге: запустив
программу, вы узнаете ответ, но не научитесь. Ответ — ровно то, что появится
на экране: 2.0 и 2 — разные ответы, потому что это
разные типы. Если программа упадёт с ошибкой, так и пиши: ошибка.
| Тип | Что хранит | Как получить | Ловушка |
|---|---|---|---|
int | целые, любого размера | int("7"), a // b, round(x) |
у отрицательных // округляет вниз: -17 // 5 — это
-4, а остаток 3 |
float | вещественные, ~16 верных знаков | float("3.5"), a / b, round(x, 2) |
0.1 + 0.2 не равно 0.3; на равенство не сравнивать |
str | строки, в том числе из одного символа | input(), str(5), кавычки |
"5" + "3" — это "53", а "5" + 3 — ошибка |
bool | True или False |
любое сравнение, bool(x) |
True + True — это 2; bool("0") — True |
В C++, Java и C# тип объявляют заранее: int x = 5; — и строку в
x уже не положить. Это статическая типизация: ошибки типов
ловятся до запуска. В Python тип принадлежит значению, а переменная —
просто имя, привязанное к нему: после x = 5 можно написать
x = "пять". Это динамическая типизация. Узнать тип значения —
type(x).
Тождество, которое держит всё: a == (a // b) * b + a % b. Отсюда
цифры числа (n % 10 и n // 10) и проверка делимости:
n % d == 0.
Дроби вроде 0.1 в двоичной системе бесконечны, как 1/3 в десятичной, и
хранятся с округлением. Поэтому вещественные числа сравнивают через
допуск: abs(a - b) < 0.000001, либо округляют до нужного
знака: round(a, 2) == round(b, 2).
Подключаем модуль так, чтобы звать функции по имени, без приставки:
from random import *. После этого своим переменным нельзя
давать имена функций — переменная seed затрёт функцию
seed().
| Вызов | Что даёт |
|---|---|
randint(a, b) | целое от a до b, оба конца включаются |
randrange(a, b) | целое от a до b−1, как range |
random() | вещественное от 0 включительно до 1 не включая |
randrange(a, b, s) | от a до b−1 с шагом s: 0, 5, 10, … |
seed(число) | задаёт начало: дальше числа при каждом запуске одни и те же |
Случайности внутри компьютера нет: следующее число вычисляется из предыдущего
по формуле, поэтому числа псевдослучайные. Начальное значение обычно
берётся от часов, и запуски различаются. seed закрепляет начало —
так повторяют тест, розыгрыш или ошибку.
zadanie1.py, zadanie2.py, zadanie3.py.input(). Пиши input(),
а не input("Введите n: ") — вывод читает машина.Заказ из одинаковых коробок надо выложить прямоугольником —
рядами по одинаковому числу коробок. Сколько коробок может быть в ряду?
Столько, на сколько
делится нацело. Программа читает
натуральное число
(не больше 10 000) и печатает все его
делители по возрастанию через пробел, а второй строкой — сколько их.
12
1 2 3 4 6 12 Делителей: 6
Проверяется: в цикле, границы
.
Это первый шаг к заданию 25 ЕГЭ — там перебирают делители точно так же.
Перебери все от 1 до
и проверь каждое:
. Печатать в одну строку помогает
, а после цикла — пустой
,
чтобы перейти на новую строку.
Проверь на бумаге края: у числа 1 один делитель, у 36 — девять
(шестёрка считается один раз), у простого 97 — два. Если у тебя у 12
вышло пять делителей — посмотри, входит ли правая граница в
.
Курьеру платят за километры. Программа читает ставку в рублях за километр,
дневной план в километрах, число поездок , а потом
расстояний в километрах — все с одним знаком после точки. Печатает общий
пробег и заработок с двумя знаками после точки, а третьей строкой —
выполнен ли план: пробег не меньше плана.
35.5 10.0 3 4.2 3.5 2.3
Пробег: 10.00 км Заработок: 355.00 руб. План выполнен
Проверяется: , накопление суммы,
формат
— и сравнение вещественных.
Сумму копи в цикле: . Два знака
после точки даёт только формат:
;
напечатает
, а не
.
Ловушка, ради которой это задание. Поездки 0.7 и 0.1, план 0.8.
По арифметике план выполнен ровно. Но в компьютере —
это
, и
скажет
«не выполнен». Оболочка подаст именно такие данные. Сравнивай с точностью до
сотых:
, — либо с допуском:
.
Программа читает два целых числа: начальное число и
количество бросков
. Перед бросками вызывается
— чтобы серию можно было повторить и проверить.
Дальше кубик бросается
раз. Печатай три строки: сами броски
через пробел, их сумму и сколько раз выпала шестёрка.
7 5
Броски: 3 6 1 6 2 # числа у всех свои
Сумма: 18
Шестёрок: 2Проверяется: ,
, границы
диапазона, накопление суммы и счётчик. Правильного ответа у задания нет —
оболочка проверяет, что бросков ровно
и все от 1 до 6, что
сумма и число шестёрок сходятся с напечатанными бросками, что при одном
начальном числе серия повторяется, а при другом — нет.
Бросок — это . Печатать в одну строку помогает
, а после цикла пустой
—
ровно как в первом задании с делителями. Сумму и счётчик шестёрок копи в
переменных прямо в цикле:
Переменную с начальным числом не называй : после
это имя функции, и
её затрёт —
упадёт
с ошибкой.
Ловушка, ради которой это задание. Следи за границей:
шестёрку включает, а
— нет, она даёт только от 1 до 5. Оболочка подаст серию из сотни с лишним
бросков: в ней обязаны встретиться все шесть граней, и кубик без шестёрки
сразу виден.
zadanie1.py … zadanie3.py лежат в твоей
папке, отладочные print из них убраны.Проверка.bat.Оболочка показывает, на каких данных программа ошиблась и что должна была вывести. Это подсказка: исправляй и проверяй снова, попыток сколько угодно.
| тип | что хранит | как получить | ловушка |
|---|---|---|---|
| int | целые любого размера | int("7"), a // b, round(x) | -17 // 5 = -4, -17 % 5 = 3: вниз, остаток от 0 до b−1 |
| float | вещественные, ~16 знаков | float("3.5"), a / b | 0.1 + 0.2 ≠ 0.3; на равенство не сравнивать |
| str | строки; символ — строка длины 1 | input(), str(5) | "5" + "3" = "53"; "5" + 3 — ошибка |
| bool | True / False | сравнения, bool(x) | True + True = 2; bool("0") = True |
В C++, Java, C# тип у переменной и объявляется заранее (статическая типизация). В Python тип у значения, переменная — ярлык: после x = 5 можно x = "пять" (динамическая). Узнать тип: type(x). Целые в Python не ограничены размером; в C++ int — 32 бита, около 2 миллиардов.
a == (a // b) * b + a % b — всегда, и для отрицательных. divmod(17, 5) даёт (3, 2). Цифры числа: n % 10 — последняя, n // 10 — отрезать её. Делимость: n % d == 0 — так перебирают делители (задание 25 ЕГЭ).
0.1 в двоичной системе — бесконечная дробь, хранится с округлением: 0.1 + 0.2 = 0.30000000000000004, 0.7 + 0.1 < 0.8. Сравнивать через допуск abs(a − b) < 1e-6 или округлять: round(a, 2). «/» всегда даёт float (6 / 3 = 2.0), «//» с вещественным — тоже float (7 // 2.0 = 3.0). round(x) → int, половина к чётному: round(2.5) = 2, round(3.5) = 4. int(x) отбрасывает дробную часть: int(-3.9) = -3. Формат f"{x:.2f}" меняет вид, а не число: 2.5 → "2.50".
input() всегда строка: "5" * 3 = "555", "9" > "10" (сравнение посимвольно). int("5.0") — ошибка, сначала float(). True хранится как 1, False как 0; bool от нуля и пустой строки — False, от всего остального — True. 3 == 3.0 → True, "3" == 3 → False. Цепочка 1 < x < 10 — это 1 < x and x < 10.
Подключение: from random import * — функции зовутся по имени. Своим переменным имена функций не давать: seed = … затрёт seed().
| вызов | что даёт |
|---|---|
| randint(a, b) | целое от a до b, оба конца включаются |
| randrange(a, b) | от a до b−1, как range |
| random() | вещественное от 0 включительно до 1 не включая |
| randrange(a, b, s) | от a до b−1 с шагом s |
| seed(число) | начало последовательности: запуски совпадают |
Числа псевдослучайные: следующее считается из предыдущего по формуле. Без seed начало берётся от часов. seed нужен, чтобы повторить тест, розыгрыш или ошибку.
Материалы подготовлены с использованием технологий искусственного интеллекта.