5. Арифметика и свойства числа
Занятия 6–7. Арифметика и свойства числа
Занятие 6. Арифметические выражения — и Задание 3
Цель занятия: обучающиеся вычисляют все восемь действий регламента, различая деление целых и дробных чисел и остаток %.
Разминка-вспоминание (5 мин)
- Как ввести двухразрядное число двумя поворотами энкодера?
- Почему введённое значение надо выводить на экран, даже если его никто «не спрашивал»?
- 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 мин)
- (A + B/4)·A при A=2, B=2?
- Чем
-7 / 2отличается отfloor(-7 / 2.0)? - Как датчик отличает белую карточку от чёрной? (интервальный возврат: занятие 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)» — свойства + арифметика + автомат ввода в одной программе.
if/elif для независимых свойств — выводится только первое. (2) Ноль попадает в «чётное-положительное» — а условие дня требует особого состояния. (3) Вывод True/False, когда условие требует ДА/НЕТ (и наоборот — Задание 2 допускает 0/1/True/False, уточните у судьи). (4) n % 2 == 1 как проверка нечётности ломается на отрицательных в некоторых языках — надёжнее n % 2 != 0.Мини-проверка выхода
«Делится ли на 7» сдана на устройстве с трёх разных вводов; блиц: «почему ноль проверяем первым?»