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

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

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

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

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

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

  1. Как ввести двухразрядное число двумя поворотами энкодера?
  2. Почему введённое значение надо выводить на экран, даже если его никто «не спрашивал»?
  3. 17 % 5 и 17 / 5 для int — чему равны?

Разбор (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. В C++ B / 4, где B — int, — это деление целых: 6 / 4 = 1, и выйдет (3+1)·3 = 12 — вычисление неверно, минус 5 баллов. Правило: в выражениях регламента деление — обычное, поэтому пишем B / 4.0 или храним результат во float, если из условия явно не следует «целая часть».

#include "stend.h"

int encoderDigit() {
  return dialDeg() / 45 + 1;               // 1..8
}

void waitPress(Btn b = BTN_R) {      // ждать нажатие И отпускание — иначе одно нажатие сработает дважды
  while (!pressed(b)) delay(10);
  while (pressed(b))  delay(10);
}

String fmt(float x) {                      // 13.0 -> "13", 13.5 -> "13.5" — судье удобнее без лишних нулей
  String t = String(x, 3);
  while (t.endsWith("0")) t.remove(t.length() - 1);
  if (t.endsWith(".")) t.remove(t.length() - 1);
  return t;
}

void show5(float v) {
  Serial.println(fmt(v));
  screen(fmt(v));
  delay(5000);                             // «не менее 5 секунд»
}

void setup() {
  Serial.begin(115200);
  stendBegin();
  waitPress();  int a = encoderDigit();  show5(a);   // 5 баллов
  waitPress();  int b = encoderDigit();  show5(b);   // 5 баллов
  float rez = (a + b / 4.0) * a;                     // именно 4.0: b / 4 для int даст целое
  show5(rez);                                        // 5 баллов
}

void loop() {}

Разбор: подтверждение кнопкой отделяет «кручу стрелку» от «ввод зафиксирован» — судья командует, участник крутит, участник жмёт; fmt убирает «13.0» на экране; сначала выводим A и B — эти 10 баллов не зависят от правильности формулы.

Восемь действий регламента и их код. Сумма a + b; разность a - b; произведение a * b; частное a / (float)b; среднее (a + b) / 2.0 (для трёх — (a + b + c) / 3.0); остаток a % b; целая часть от деления a / b для int; модуль abs(a). Для отрицательных чисел в C++ деление целых отбрасывает дробную часть к нулю: -7 / 2 = -3 и -7 % 2 = -1. Если условие дня понимает «целую часть» как округление вниз, нужен floor(-7 / 2.0) = -4. На пробном туре договоритесь с судьёй о трактовке до попытки.

Практика

Сдать Задание 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. Чем -7 / 2 отличается от floor(-7 / 2.0)?
  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 регламента ноль — отдельное состояние системы (ни чётное-зелёное, ни нечётное-красное).

void svoistva(int n, int k = 7) {
  Serial.printf("Число: %d\n", n);
  Serial.println(n % k == 0 ? "ДА" : "НЕТ");        // делимость на k (пример 5.1)
  Serial.println(n % 2 == 0 ? "чётное" : "нечётное");
  if (n > 0)      Serial.println("положительное");
  else if (n < 0) Serial.println("отрицательное");
  else            Serial.println("ноль");
}

int minimum3(int a, int b, int c) {       // min без встроенной функции — уметь руками
  int m = a;
  if (b < m) m = b;
  if (c < m) m = c;
  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» сдана на устройстве с трёх разных вводов; блиц: «почему ноль проверяем первым?»

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