Чему научитесь
- Переносить формулу из условия в код, не теряя скобок
- Выбирать между двумя делениями: / для дробных величин, // для штук
- Работать с вещественным ответом и не портить его округлением
Как устроено занятие
Сначала разбор с примерами и короткими проверками понимания — они нужны, чтобы поймать непонятое сразу, а не через три темы.
Дальше 15 задач лестницей: разминка, основа, со звёздочкой. Занятие засчитывается, когда решено 10 — остальные не пропадают и учитываются отдельно.
После занятия — вторая часть, ещё 15 задач на те же приёмы в новых сюжетах.
Сколько это займёт
Примерно час-полтора вместе с задачами. Сроков нет: можно закрыть вкладку и вернуться когда удобно — прогресс сохранится.
Программа как формула
На прошлом занятии программа читала данные и печатала их почти без изменений. Теперь между чтением и печатью появится главное — вычисление.
Задача такого типа всегда устроена одинаково: в условии дана формула или её можно вывести из описания, а ваше дело — аккуратно перенести её в код. Звучит просто, но именно здесь теряется больше всего баллов, и всегда по одной из трёх причин: перепутан порядок действий, забыты скобки, выбран не тот вид деления.
Разберём все три.
Порядок действий и скобки
Python считает по тем же правилам, что и математика:
- возведение в степень
**; - умножение и деление
*,/,//,%; - сложение и вычитание
+,-.
Действия одного уровня выполняются слева направо. Скобки перебивают любой порядок.
Сравните две записи одной и той же строки:
print(2 + 3 * 4) # 14: сначала умножение
print((2 + 3) * 4) # 20: сначала скобка
Теперь настоящая ловушка. Периметр прямоугольника — это . Если написать без скобок, получится другая формула:
p = 2 * a + b # неверно: удвоилось только a
p = 2 * (a + b) # верно
Правило простое: если в формуле есть дробь или множитель перед суммой — ставьте скобки, даже если кажется, что можно без них. Лишняя пара скобок ничего не стоит, а пропущенная стоит задачи.
Проверка: порядок действий
Чему равно 10 - 2 * 3 ** 2?
Два деления: / и //
В Python два разных деления, и это не прихоть языка — они отвечают на разные вопросы.
| запись | что делает | 7 и 2 |
тип ответа |
|---|---|---|---|
/ |
обычное деление | 3.5 |
вещественный |
// |
целое деление вниз | 3 |
целый |
Главное, что надо запомнить: / всегда даёт вещественное число, даже когда делится нацело. 10 / 5 — это 2.0, а не 2. И печатается это как 2.0.
Отсюда практическое правило:
- в условии просят целый ответ (штуки, люди, коробки) — деление
//; - в условии ответ дробный (скорость, средняя величина, площадь с половиной) — деление
/.
Спутать легко, а цена ошибки высокая: 2.0 вместо 2 — это неверный ответ, потому что проверяющая система сравнивает вывод как текст.
Целое деление и его напарник — остаток % — тема следующего занятия, там мы разберём их подробно. Сейчас достаточно знать, что они существуют и чем отличаются от /.
Проверка: что напечатается
Что напечатает print(10 / 5)?
Вещественный ответ и точность
Когда ответ дробный, точное совпадение текста требовать нельзя: 3.5, 3.50 и 3.4999999999 — это одно и то же число, записанное по-разному. Поэтому у таких задач проверяющая программа сравнивает ответы с допуском.
В условии это записано так: «с точностью не хуже ». Значит ваш ответ примут, если он отличается от правильного меньше чем на одну десятитысячную.
Что из этого следует на практике:
- печатайте результат как есть,
print(s / t)— Python выведет достаточно знаков; - не округляйте сами до одного-двух знаков: округление до
3.5при правильном ответе3.4712уже не пройдёт; - не подставляйте своё приближение вида
3.14— точности не хватит, беритеpiиз модуляmath.
from math import pi
r = int(input())
print(2 * pi * r)
Строка from math import pi берёт из стандартной библиотеки готовое значение с большим числом знаков. Так же оттуда берут корень (sqrt) и другие функции — они понадобятся дальше.
Проверка: значение выражения
Чему равно (2 + 3) * (10 - 4)? Введите целое число.
Три ошибки этого занятия
Пропущенные скобки. Самая частая и самая обидная: формула выглядит похоже, ответ неверный. Проверяйте себя на примере из условия — если сходится, скобки, скорее всего, на месте.
Не тот вид деления. Просили штуки — вышло 2.0; просили среднее — вышло 3 вместо 3.5. Смотрите на природу ответа, а не на то, делится ли нацело в примере.
Самовольное округление. print(round(s / t, 2)) кажется аккуратным, но выбрасывает знаки, которые нужны для сравнения с допуском. Печатайте как есть.
Как проверять себя
К трём проверкам с прошлого занятия — пример, минимум, максимум — добавьте четвёртую: посчитайте формулу на бумаге для примера из условия. Если руками получается одно, а программа печатает другое, ошибка в переносе формулы, а не в понимании задачи. Это отличает «не понял условие» от «опечатался», а лечатся они по-разному.
Практика: пятнадцать задач
Лестница та же: пять разминочных, семь основных, три со звёздочкой. Зачёт при десяти решённых.
В части задач ответ целый, в части — дробный. Первым делом определяйте, какой именно: от этого зависит вид деления и то, как печатать ответ.
Объясните, почему ответы разные
Два ученика решали задачу «найдите среднее арифметическое двух целых чисел».
Первый написал:
a, b = map(int, input().split())
print((a + b) // 2)
Второй написал:
a, b = map(int, input().split())
print(round((a + b) / 2, 2))
Оба решения не приняты. Объясните, что не так у каждого и на каких данных это видно.