Проект: Калькулятор, проверяющий введенные данные.

Свяжите входы, проверки границ, функции и коды выхода.

Wave Foundation

Цели и действия

Введите количество и цену за единицу и рассчитайте общую сумму. Введите два целых числа, разделенных пробелом или разрывом строки. В этом примере принимаются только количества от 1 до 1000 и цены за единицу от 0 до 100 000, поэтому он рассчитывается в диапазоне умножения i32.

Сохраните его в main.wave, запустите wavec run main.wave, затем введите 3 1200. Результаты, выдаваемые программой, следующие. Видимость символов, введенных в терминал, отделена от вывода программы.

fun total(quantity: i32, price: i32) -> i32 {
    return quantity * price;
}

fun main() -> i32 {
    var quantity: i32 = 0;
    var price: i32 = 0;
    input("{} {}", quantity, price);
    if (quantity < 1 || quantity > 1000 || price < 0 || price > 100000) {
        println("out of range");
        return 1;
    }

    println("total={}", total(quantity, price));
    return 0;
}

Результат выполнения:

total=3600

Также проверьте наличие сбоев

Если вы введете 0 1200, он ожидает out of range и код завершения 1. Ошибка числового анализа в input и проверка объема работы программы — это два разных шага. Нечисловой токен/тип превышает диапазон/перед требуемым вводом EOF — ошибка ввода. Этот встроенный ввод не является интерфейсом, который возвращает ошибку и требует повторного ввода. Если вам нужен восстанавливаемый парсер, настройте процесс проверки самостоятельно, прочитав байты с помощью io.

Расширенные упражнения и комментарии

Возьмите ставку дисконтирования в качестве третьего входного параметра и проверьте, находится ли она в диапазоне от 0 до 100. Чтобы избежать больших промежуточных умножений, вам необходимо расширить диапазон вычислений с помощью i64 и проверить диапазон при сужении результата. Если вы просто расширите последний тип результата, промежуточные вычисления, возможно, уже были выполнены для узких типов.

Консоль I/O · Далее: Чтение файлов

Зачем сначала определять объем вычислений?

Самыми большими входными данными являются количество 1000 и цена за единицу 100000. Умножение двух значений дает 100000000, поэтому оно попадает в диапазон i32. Эта проверка диапазона необходима для того, чтобы результат умножения функции total можно было использовать как есть.

main, который получает входные данные, отвечает за ввод и сообщения об ошибках, а total отвечает только за вычисления. Даже если позже вы перейдете на чтение ордеров из файла, вы все равно сможете использовать функцию расчета.

Полный расчет скидки

Вы можете умножить сумму на 100, добавив процент скидки. Преобразуйте для выполнения промежуточных вычислений как i64, а затем примените ставку дисконтирования. Поскольку дробная часть целочисленного деления отбрасывается, в этом примере сумма после скидки усекается до целого числа.

fun discounted_total(quantity: i32, price: i32, discount: i32) -> i64 {
    var subtotal: i64 = (quantity as i64) * (price as i64);
    var remaining: i64 = 100 - (discount as i64);
    return subtotal * remaining / 100;
}

fun main() -> i32 {
    var quantity: i32 = 0;
    var price: i32 = 0;
    var discount: i32 = 0;

    input("{} {} {}", quantity, price, discount);

    if (quantity < 1 || quantity > 1000) {
        println("invalid quantity");
        return 1;
    }

    if (price < 0 || price > 100000) {
        println("invalid price");
        return 2;
    }

    if (discount < 0 || discount > 100) {
        println("invalid discount");
        return 3;
    }

    println("total={}", discounted_total(quantity, price, discount));
    return 0;
}

Результат выполнения:

total=3240

Вышеупомянутый результат получен при вводе 3 1200 10. Результат составит 3240, что составляет 10% от исходной суммы 3600.

ввод ожидаемый результат путь для проверки
3 1200 0 total=3600 нет скидки
3 1200 100 total=0 Полная скидка
3 1200 101 invalid discount Ставка дисконтирования превышает диапазон
1000 100000 0 total=100000000 максимальный вход
0 1200 10 invalid quantity Количество ниже диапазона

следующее упражнение

Попробуйте изменить функцию на округление десятичных сумм. В этой программе, которая принимает только положительные суммы, добавление 50 перед делением на 100 приведет к округлению до целых чисел. Когда вы вводите 99 за 1 и ставку дисконтирования 50, вы можете сравнить результат сокращения 49 и результат округления 50.