EduBrick
классная работа

Арифметика и порядок действий

Программирование на Python: от нуля до олимпиад

0/19решено 0 из 19до зачёта осталось 10

Чему научитесь

  • Переносить формулу из условия в код, не теряя скобок
  • Выбирать между двумя делениями: / для дробных величин, // для штук
  • Работать с вещественным ответом и не портить его округлением

Как устроено занятие

Сначала разбор с примерами и короткими проверками понимания — они нужны, чтобы поймать непонятое сразу, а не через три темы.

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

После занятия — вторая часть, ещё 15 задач на те же приёмы в новых сюжетах.

Сколько это займёт

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

теория

Программа как формула

На прошлом занятии программа читала данные и печатала их почти без изменений. Теперь между чтением и печатью появится главное — вычисление.

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

Разберём все три.

теория

Порядок действий и скобки

Python считает по тем же правилам, что и математика:

  1. возведение в степень **;
  2. умножение и деление *, /, //, %;
  3. сложение и вычитание +, -.

Действия одного уровня выполняются слева направо. Скобки перебивают любой порядок.

Сравните две записи одной и той же строки:

print(2 + 3 * 4)      # 14: сначала умножение
print((2 + 3) * 4)    # 20: сначала скобка

Теперь настоящая ловушка. Периметр прямоугольника — это 2(a+b)2(a + b). Если написать без скобок, получится другая формула:

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 — это одно и то же число, записанное по-разному. Поэтому у таких задач проверяющая программа сравнивает ответы с допуском.

В условии это записано так: «с точностью не хуже 10410^{-4}». Значит ваш ответ примут, если он отличается от правильного меньше чем на одну десятитысячную.

Что из этого следует на практике:

  • печатайте результат как есть, print(s / t) — Python выведет достаточно знаков;
  • не округляйте сами до одного-двух знаков: округление до 3.5 при правильном ответе 3.4712 уже не пройдёт;
  • не подставляйте своё приближение π\pi вида 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))

Оба решения не приняты. Объясните, что не так у каждого и на каких данных это видно.

Войдите, чтобы ответить.