Skip to content
5. Арифметика и свойства числа

5. Арифметика и свойства числа

Занятия 6–7. Арифметика и свойства числа

Занятие 6. Арифметические выражения — и Задание 3

Цель занятия: обучающиеся вычисляют все восемь действий регламента, различая /, // и %.

Разминка-вспоминание (5 мин)

  1. Как ввести двухразрядное число двумя поворотами энкодера?
  2. Почему введённое значение надо выводить на экран, даже если его никто «не спрашивал»?
  3. 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 мин)

  1. (A + B/4)·A при A=2, B=2?
  2. Чем int(-7/2) отличается от -7 // 2?
  3. Как датчик отличает белую карточку от чёрной? (интервальный возврат: занятие 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)» — свойства + арифметика + автомат ввода в одной программе.

Типичные ошибки. (1) Лестница if/elif для независимых свойств — выводится только первое. (2) Ноль попадает в «чётное-положительное» — а условие дня требует особого состояния. (3) Вывод True/False, когда условие требует ДА/НЕТ (и наоборот — Задание 2 допускает 0/1/True/False, уточните у судьи). (4) n % 2 == 1 как проверка нечётности ломается на отрицательных в некоторых языках — надёжнее n % 2 != 0.

Мини-проверка выхода

«Делится ли на 7» сдана на устройстве с трёх разных вводов; блиц: «почему ноль проверяем первым?»

Уровни сложности