Собираем всё воедино
Часть раздела Logic & Flow путешествия по Rust на Coddy — урок 53 из 66.
Задание
ЛегкоВы получите шесть входных данных. Первый ввод — это команда, которая может быть либо add, либо check, либо sell. Второй ввод — это название товара. Третий ввод — это число, представляющее либо количество для продажи (для команды sell), либо начальную цену (для команды add). Четвертый ввод — это список названий товаров в инвентаре, разделенных запятыми. Пятый ввод — это список цен, соответствующих каждому товару, разделенных запятыми. Шестой ввод — это список количеств, соответствующих каждому товару, разделенных запятыми.
Создайте полную систему управления инвентарем, которая обрабатывает все три операции: добавление товаров, проверку запасов и продажу товаров. Используйте HashMap для хранения данных инвентаря, где ключом является название товара, а значением — кортеж, содержащий цену и количество (f64, i32).
Требования:
- Импортируйте
HashMapизstd::collections - Прочитайте первый ввод (команду) и удалите лишние пробелы
- Прочитайте второй ввод (название товара) и удалите лишние пробелы
- Прочитайте третий ввод (значение количества/цены) и удалите лишние пробелы
- Преобразуйте третий ввод в
f64 - Прочитайте четвертый ввод (названия товаров через запятую) и удалите лишние пробелы
- Прочитайте пятый ввод (цены через запятую) и удалите лишние пробелы
- Прочитайте шестой ввод (количества через запятую) и удалите лишние пробелы
- Создайте изменяемый
HashMap<String, (f64, i32)>для инвентаря - Разделите названия товаров по запятым
- Разделите цены по запятым и преобразуйте каждую в
f64 - Разделите количества по запятым и преобразуйте каждое в
i32 - Вставьте каждый товар в инвентарь с соответствующей ценой и количеством в виде кортежа
- Используйте выражение
matchдля команды, чтобы определить, какую операцию выполнить - Для команды
add:- Используйте
.entry()и.or_insert(), чтобы добавить товар, если он не существует, используя третий ввод в качестве цены и0в качестве начального количества - Выведите:
Added [item_name] to inventory - Выведите:
Price: $[price] - Выведите:
Quantity: 0
- Используйте
- Для команды
check:- Используйте
.get(), чтобы проверить, существует ли товар - Используйте выражение
matchдля обработкиOption - Если
Some, выведите:[item_name] is in stockPrice: $[price]Quantity: [quantity]
- Если
None, выведите:[item_name] is not in stock
- Используйте
- Для команды
sell:- Преобразуйте третий ввод в
i32как количество для продажи - Используйте
.get(), чтобы проверить, существует ли товар - Используйте выражение
matchдля обработкиOption - Если
Some:- Проверьте, достаточно ли текущего количества
- Если да, обновите инвентарь новым количеством и выведите:
Sold [quantity_to_sell] [item_name]Total: $[total_price]Remaining stock: [new_quantity]
- Если нет, выведите:
Insufficient stock for [item_name]Available: [current_quantity]
- Если
None, выведите:[item_name] is not in stock
- Преобразуйте третий ввод в
- Для любой другой команды выведите:
Invalid command
Ввод:
- Первая строка: Команда (
add,checkилиsell) - Вторая строка: Название товара (например,
Tablet) - Третья строка: Число (цена для
add, количество дляsell, игнорируется дляcheck) - Четвертая строка: Названия товаров через запятую (например,
Laptop,Mouse,Keyboard) - Пятая строка: Цены через запятую (например,
999.99,25.50,75.00) - Шестая строка: Количества через запятую (например,
15,50,30)
Вывод:
- Для команды
add:Added [item_name] to inventoryPrice: $[price]Quantity: 0
- Для команды
check(товар существует):[item_name] is in stockPrice: $[price]Quantity: [quantity]
- Для команды
check(товар не существует):[item_name] is not in stock - Для команды
sell(достаточно запасов):Sold [quantity_to_sell] [item_name]Total: $[total_price]Remaining stock: [new_quantity]
- Для команды
sell(недостаточно запасов):Insufficient stock for [item_name]Available: [current_quantity]
- Для команды
sell(товар не существует):[item_name] is not in stock - Для неверной команды:
Invalid command
Попробуйте сами
use std::collections::HashMap;
use std::io;
fn main() {
// Чтение входных данных
let mut command = String::new();
io::stdin().read_line(&mut command).expect("Failed to read line");
let command = command.trim();
let mut item_name = String::new();
io::stdin().read_line(&mut item_name).expect("Failed to read line");
let item_name = item_name.trim();
let mut value_input = String::new();
io::stdin().read_line(&mut value_input).expect("Failed to read line");
let value_input = value_input.trim();
let mut items_input = String::new();
io::stdin().read_line(&mut items_input).expect("Failed to read line");
let items_input = items_input.trim();
let mut prices_input = String::new();
io::stdin().read_line(&mut prices_input).expect("Failed to read line");
let prices_input = prices_input.trim();
let mut quantities_input = String::new();
io::stdin().read_line(&mut quantities_input).expect("Failed to read line");
let quantities_input = quantities_input.trim();
// Создание HashMap для инвентаря
let mut inventory: HashMap<String, (f64, i32)> = HashMap::new();
// TODO: Напишите свой код ниже
// Разберите входные данные, разделенные запятыми, и заполните инвентарь
// Используйте выражение match для команды, чтобы обработать операции add, check и sell
// Не забудьте вывести соответствующие сообщения в зависимости от команды
}Все уроки раздела Logic & Flow
1Продвинутое управление потоком выполнения
Выражение 'match'Сопоставление нескольких значенийСопоставление диапазоновВыражение 'if let'Циклы как выраженияИтоги — Простой парсер команд4Группировка данных с помощью структур
Что такое структура?Обзор структурДоступ к полям структурыИзменяемые структурыСтруктуры как параметры функцийКортежные структурыИтоги: создание структуры Book7Обработка ошибок с помощью 'Result'
Что такое 'Result'?Использование 'match' с 'Result'is_ok() и is_err()Сокращения: unwrap и expectОператор вопросительного знака '?'Парсинг строк в числаИтоги: функция безопасного деления10Замыкания и анонимные функции
Что такое замыкание?Определение простого замыканияЗамыкания с параметрамиЗахват окруженияИтоги: Простое замыкание-сумматор2Введение в векторы
Что такое вектор?Создание вектораДобавление элементов с помощью pushДоступ к элементам вектораИтерация по векторуИзменяемая итерацияУдаление элементовИтоги — Простой счетчик очков5Пары «ключ-значение» в Hash Map
Что такое Hash Map?Создание Hash MapВставка пар «ключ-значение»Доступ к значениямИтерация по Hash MapОбновление значенияУдаление парыИтоги — Счетчик слов8Проект: Простой инвентарь товаров
Настройка проектаДобавление товараПроверка наличияПродажа товараСобираем всё воедино3Список дел в командной строке
Настройка проектаДобавление задачиПросмотр всех задачУдаление задачиИтоговый код6Обработка отсутствия значения с 'Option'
Что такое 'Option'?Использование 'match' с 'Option'is_some() и is_none()Распаковка 'Option'Метод expectЗначение по умолчанию: unwrap_orИтоги: поиск элемента