5. Арифметика и свойства числа
Занятия 6–7. Арифметика и свойства числа
Занятие 6. Арифметические выражения — и Задание 3
Цель занятия: обучающиеся вычисляют все восемь действий регламента, различая /, // и %.
Разминка-вспоминание (5 мин)
- Как ввести двухразрядное число двумя поворотами энкодера?
- Почему введённое значение надо выводить на экран, даже если его никто «не спрашивал»?
- 17 % 5 и 17 // 5 — чему равны?
Разбор (worked example): полное решение Задания 3 регламента — 15 баллов
Условие (Приложение 1). Шкала 8 делений, стрелка на оси мотора/потенциометре. По команде судьи ввести A (1–8), вывести ≥5 с; ввести B (1–8), вывести ≥5 с; вычислить (A + B/4)·A и вывести ≥5 с. По 5 баллов за каждый вывод.
Ключевая ловушка — B/4. При A=3, B=6 правильный ответ (3 + 1.5)·3 = 13.5. Целочисленное B // 4 даст (3+1)·3 = 12 — вычисление неверно, минус 5 баллов. Правило: в выражениях регламента деление — обычное (/), если из условия явно не следует «целая часть».
from hub import port, button, light_matrix
import motor, runloop
ENC = port.A
def encoder_digit():
pos = motor.absolute_position(ENC)
if pos < 0:
pos += 360
return pos // 45 + 1 # 1..8
async def wait_press(b=button.RIGHT):
while not button.pressed(b):
await runloop.sleep_ms(10)
while button.pressed(b):
await runloop.sleep_ms(10)
def fmt(x):
"""13.0 -> '13', 13.5 -> '13.5' — судье удобнее без лишних .0"""
return str(int(x)) if x == int(x) else str(x)
async def show5(v):
print(v)
await light_matrix.write(fmt(v))
await runloop.sleep_ms(5000) # «не менее 5 секунд»
async def main():
await wait_press(); a = encoder_digit(); await show5(a) # 5 баллов
await wait_press(); b = encoder_digit(); await show5(b) # 5 баллов
rez = (a + b / 4) * a # именно /, не //
await show5(rez) # 5 баллов
runloop.run(main())Разбор: подтверждение кнопкой отделяет «кручу стрелку» от «ввод зафиксирован» — судья командует, участник крутит, участник жмёт; fmt убирает «13.0» на матрице; сначала выводим A и B — эти 10 баллов не зависят от правильности формулы.
a+b; разность a-b; произведение a*b; частное a/b; среднее (a+b)/2 (для трёх — (a+b+c)/3); остаток a % b; целая часть от деления a // b; модуль abs(a). Для отрицательных чисел в Python -7 // 2 = -4 и -7 % 2 = 1 (округление к минус-бесконечности) — если условие дня подразумевает «отбросить дробную часть», используйте int(a / b): int(-7/2) = -3. На пробном туре договоритесь с судьёй о трактовке до попытки.Практика
Сдать Задание 3
Партнёр-судья диктует A и B по жребию, полный протокол, 15/15.
Задачник выражений, часть 1
На устройстве через автомат ввода вычислить и сверить с ручным счётом: (A*3 + B/2) — пример из компетенции 4; среднее(A, B); A % B и A // B; abs(A - B); (A + B) % 3. Сначала ответ на бумаге, потом на устройстве — расхождение означает ловушку типов.
Мини-проверка выхода занятия 6
5 выражений «бумага = устройство» без расхождений; вопрос: «в каком месте Задания 3 теряют баллы чаще всего и почему?» (B/4 как целочисленное; вывод меньше 5 секунд)
Занятие 7. Свойства числа
Цель занятия: обучающиеся определяют чётность, знак, делимость и min/max и выводят ответ в формате условия.
Разминка-вспоминание (5 мин)
- (A + B/4)·A при A=2, B=2?
- Чем
int(-7/2)отличается от-7 // 2? - Как датчик отличает белую карточку от чёрной? (интервальный возврат: занятие 3)
Разбор (worked example): дерево решений «свойства числа»
flowchart TD
N[Число n] --> Z{n == 0?}
Z -- да --> Z0[особый случай: смотри условие дня]
Z -- нет --> P{n % 2 == 0?}
P -- да --> CH[чётное]
P -- нет --> NCH[нечётное]
N --> S{n > 0?}
S -- да --> POS[положительное]
S -- нет --> NEG[отрицательное]
N --> D{n % k == 0?}
D -- да --> DA[делится на k]
D -- нет --> NET[не делится]
Свойства независимы — проверяются отдельными if, а не одной лестницей. Ноль всегда выделяйте первым: в Задании 4 регламента ноль — отдельное состояние системы (ни чётное-зелёное, ни нечётное-красное).
def svoistva(n, k=7):
print("Число:", n)
print("ДА" if n % k == 0 else "НЕТ") # делимость на k (пример 5.1)
print("чётное" if n % 2 == 0 else "нечётное")
if n > 0: print("положительное")
elif n < 0: print("отрицательное")
else: print("ноль")
def minimum(*nums): # min из 2–3 чисел без встроенной функции — уметь руками
m = nums[0]
for x in nums[1:]:
if x < m:
m = x
return mФормат ответа — из условия: пример 5.1 требует буквально слова ДА/НЕТ, не 1/0. Баллы теряют не на логике, а на формате.
Практика
«Делится ли A на 7 → ДА/НЕТ»
Пример 5.1 регламента целиком: ввод A энкодером (двухразрядный — двумя поворотами), вывод ДА/НЕТ в консоль. Проверить на 14, 20, 49, 7, 70.
Задачник, часть 2
min и max из трёх введённых чисел (и через цикл, и через встроенные min/max); чётность отрицательных: убедиться на устройстве, что -4 % 2 == 0; «положительное/отрицательное/ноль» для ввода с ГСЧ от −5 до 5 — прогнать до выпадения нуля.
Комбинированная задача
«Ввести A и B; если A·B чётное — вывести min(A,B), иначе max(A,B)» — свойства + арифметика + автомат ввода в одной программе.
if/elif для независимых свойств — выводится только первое. (2) Ноль попадает в «чётное-положительное» — а условие дня требует особого состояния. (3) Вывод True/False, когда условие требует ДА/НЕТ (и наоборот — Задание 2 допускает 0/1/True/False, уточните у судьи). (4) n % 2 == 1 как проверка нечётности ломается на отрицательных в некоторых языках — надёжнее n % 2 != 0.Мини-проверка выхода
«Делится ли на 7» сдана на устройстве с трёх разных вводов; блиц: «почему ноль проверяем первым?»