Shanraq.org Shanraq.org
Числа и арифметика
IT

Rust: с нуля до своего органайзера Урок 10 из 10

Числа и арифметика

Урок 10. Проверить расчёт оставшихся задач.

Текст переведён с помощью ИИ.

Предварительно: уроки 1–9.

Зачем это нужно

У органайзера появились числа. Теперь научимся считать и замечать границы. Целые числа не содержат дробной части; числа с плавающей точкой приближённо представляют широкий диапазон чисел. Бит — двоичная единица; байт состоит из восьми битов. Количество битов ограничивает представимые значения, как вместимость мерки.

Сразу целиком

Замените src/main.rs и выполните cargo run:

fn main() {
    let total: u32 = 7;
    let done: u32 = 2;
    let remaining = total - done;
    println!("Осталось: {remaining}");
    println!("Полных пар: {}", remaining / 2);
    println!("Без пары: {}", remaining % 2);
}

Вывод программы:

Осталось: 5
Полных пар: 2
Без пары: 1

Знак - вычитает, / делит, % получает остаток. В println! пустые {} подставляют следующий аргумент после запятой. Это полезно, когда печатаем вычисление, а не переменную по имени.

Семь дел минус два выполненных — пять. При целочисленном делении 5 / 2 получается 2, остаток 5 % 2 равен 1. Дробная часть целочисленного деления отбрасывается к нулю. Деление на ноль недопустимо.

Как выбирать тип

u8 хранит числа от 0 до 255 включительно; i8 — от −128 до 127. u32 хранит числа от 0 до 4 294 967 295 включительно; i32 — от −2 147 483 648 до 2 147 483 647. Префикс u означает беззнаковый, i — знаковый; число — количество битов. Есть также 16-, 64- и 128-битные варианты. usize зависит от платформы и используется для размеров и индексов; позже это станет важно для коллекций. У типа есть диапазон, даже если сегодня число маленькое.

f32 и f64 — типы с плавающей точкой на 32 и 64 битах; у f64 обычно больше точность и диапазон. Без дополнительных ограничений тип дробного литерала — f64. Не все десятичные дроби точно представимы в двоичном виде. Для количества задач нужен целый тип, а для точного учёта денег нельзя бездумно выбирать дробный. Сейчас деньги не считаем.

Операции +, -, *, / и % означают сложение, вычитание, умножение, деление и остаток. Умножение и деление выполняются раньше сложения; круглые скобки явно задают нужный порядок.

Сравните дробное деление и порядок действий. Указываем f64 явно; десятичный разделитель в коде — точка. Для примера выбраны числа с точным двоичным представлением. average означает «среднее»; здесь это результат деления, а не счётчик задач. Сначала предскажите все три строки.

fn main() {
    let average: f64 = 5.0 / 2.0;
    println!("{average}");
    println!("{}", 2 + 3 * 4);
    println!("{}", (2 + 3) * 4);
}
2.5
14
20

Переполнение и разные типы

Переполнение означает, что результат не помещается в тип. При наших фиксированных данных done не больше total. Если это условие нарушить, вычитание u32 не даст нормальное отрицательное число. Проверяемая сборка может остановиться; поведение при отключённых проверках не следует использовать как правильный результат. В уроках про условия и проверку ввода защитим это правило явно.

Отрицательное значение нельзя получить применением минуса к беззнаковому u32. Намеренно ошибочный пример ожидает E0600:

fn main() {
    let count: u32 = -1;
    println!("{count}");
}

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

Опорная карта

Смысл числа → подходящий тип → диапазон → операция → ожидаемый ответ → проверка. Успешная сборка не доказывает, что total и done выбраны разумно.

Разминка

  1. Предскажите результат 6 / 2 и 6 % 2 до запуска.
  2. Заполните: remaining = total ___ done.
  3. Почините отрицательное количество: сначала решите, допустимо ли оно по смыслу, а не просто смените тип.

Задание

Обязательное. Для total = 10 и done = 4 получите «Осталось: 6», «Полных пар: 3», «Без пары: 0». Вычисляйте результаты, не печатайте готовые числа вручную.

На своих данных. Проверьте случай total = done: должно остаться ноль, включая пары и остаток.

Подсказка и эталон

Эталон приведён ниже. В нём изменены входные данные, а формулы остались прежними. Ответ для нулевого остатка помогает проверить, что вы не перепутали вычитание и сложение.

Готовы к следующему блоку, если можете без подсказки создать переменную, объяснить тип, изменить значение и вычислить остаток задач. Урок 11 пока запланирован; не ищите отсутствующую страницу.

Сверка после самостоятельной попытки

6 / 2 = 3, 6 % 2 = 0; пропуск — знак минуса; для количества задач отрицательное значение недопустимо.

fn main() {
    let total: u32 = 10;
    let done: u32 = 4;
    let remaining = total - done;
    println!("Осталось: {remaining}");
    println!("Полных пар: {}", remaining / 2);
    println!("Без пары: {}", remaining % 2);
}

Ожидаемый вывод эталона:

Осталось: 6
Полных пар: 3
Без пары: 0

Предыдущий урок · Оглавление

Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом

Комментарии (0)

Пока нет комментариев. Будьте первым.