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 выбраны разумно.
Разминка
- Предскажите результат 6 / 2 и 6 % 2 до запуска.
- Заполните: remaining = total ___ done.
- Почините отрицательное количество: сначала решите, допустимо ли оно по смыслу, а не просто смените тип.
Задание
Обязательное. Для 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)
Войдите, чтобы оставить комментарий →
Пока нет комментариев. Будьте первым.