Shanraq.org Shanraq.org
Практика: простая сводка
IT

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

Практика: простая сводка

Урок 17. Самостоятельно собрать проверяемую сводку из условий, функций, массива и тестов.

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

Предварительно: уроки 1–16. Нового синтаксиса здесь нет. Если тест не запускается, повторите урок 16; если цикл путает индексы и значения — уроки 13 и 15.

Сначала вспомните

Закройте предыдущие уроки и нарисуйте карту: данные → правило отбора → обход → накопители → вывод → тесты. По памяти объясните u32, [u32; 4], for, if, fn, #[test]. После объяснения сверяйтесь с уроками. Цель — воспроизвести решение, а не только узнать знакомый код.

Числа обозначают минуты четырёх задач. Ноль считаем отсутствующей задачей; короткая задача длится от 1 до 15 минут. Пока программа не хранит названия и не читает ввод. После закрытия данные исчезнут, потому что массив задан прямо в исходном коде.

Разогрев: прочитайте чужую программу

В проекте organizer из урока 6 сохраните старый src/main.rs отдельно, замените файл целиком этим примером и в папке с Cargo.toml выполните cargo run. Команда собирает и запускает программу. Предскажите вывод до запуска; в блоке ниже показан только вывод программы.

fn count_short(minutes: [u32; 4]) -> u32 {
    let mut count = 0;
    for value in minutes {
        if value > 0 && value <= 15 {
            count = count + 1;
        }
    }
    count
}

fn main() {
    let tasks = [0, 8, 20, 15];
    println!("Коротких: {}", count_short(tasks));
}
Коротких: 2

Здесь функция возвращает число, а main отвечает за сообщение. Почему 0 не считается? Почему 20 не считается? Что изменится, если заменить 15 на 16? Проверьте своё предсказание запуском. Числовой массив копируется при передаче; это свойство данного типа не следует переносить на будущие строки.

Задание: самостоятельная работа

Обязательное. Не копируя разогрев, напишите is_short(minutes: u32) -> bool и summarize(minutes: [u32; 4]) -> [u32; 2]. В результате первое число — количество коротких задач, второе — сумма их минут. Для [0, 8, 20, 15] программа должна показать Коротких: 2 и Минут: 23. Вывод делайте в main. Добавьте тесты для [0, 0, 0, 0][0, 0], [1, 15, 16, 0][2, 16] и основного случая. Запустите cargo test, затем cargo run.

Порядок работы. (1) Запишите ожидаемые ответы. (2) Наберите функции по памяти. (3) Проверьте сборку и тесты. (4) Объясните первую ошибку своими словами. (5) Повторите с массивом [15, 15, 15, 15], не меняя функции: ожидаются 4 и 60. (6) Через день воспроизведите решение с пустого файла.

Подсказка

Два накопителя начинаются с нуля. Цикл рассматривает каждое значение. Условие вызывайте через is_short(value). Верните [count, total] как последнее выражение функции. В main возьмите элементы результата по индексам 0 и 1.

Эталон после попытки

fn is_short(minutes: u32) -> bool {
    minutes > 0 && minutes <= 15
}

fn summarize(minutes: [u32; 4]) -> [u32; 2] {
    let mut count = 0;
    let mut total = 0;
    for value in minutes {
        if is_short(value) {
            count = count + 1;
            total = total + value;
        }
    }
    [count, total]
}

fn main() {
    let result = summarize([0, 8, 20, 15]);
    println!("Коротких: {}", result[0]);
    println!("Минут: {}", result[1]);
}

#[test]
fn no_tasks() {
    assert_eq!(summarize([0, 0, 0, 0]), [0, 0]);
}

#[test]
fn boundaries() {
    assert_eq!(summarize([1, 15, 16, 0]), [2, 16]);
}

#[test]
fn ordinary_case() {
    assert_eq!(summarize([0, 8, 20, 15]), [2, 23]);
}
Коротких: 2
Минут: 23

Массив результата [u32; 2] пока удобен, но позиции 0 и 1 приходится помнить. Позже дадим данным осмысленные имена через структуру. Если тесты проходят только после подглядывания, вернитесь к карте и повторите задание самостоятельно.

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

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

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

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