Menu
CoddyTech

整合所有内容

本课属于 Coddy Rust 学习旅程的“逻辑与流程”单元。第 53 课,共 66 课。

challenge icon

挑战

简单

你会收到六项输入。第一项输入是一个命令,可以是 add、check 或 sell。第二项输入是物品名称。第三项输入是一个数字,表示要出售的数量(用于 sell 命令)或初始数量(用于 add 命令)。第四项输入是库存中以逗号分隔的物品名称列表。第五项输入是与每件物品对应的、以逗号分隔的价格列表。第六项输入是与每件物品对应的、以逗号分隔的数量列表。

构建一个完整的库存管理系统,处理三种操作:添加物品、检查库存和出售物品。使用 HashMap 存储库存数据,其中键是物品名称,值是包含价格和数量的元组 (f64, i32)。

要求:

  • 从 std::collections 导入 HashMap
  • 读取第一项输入(命令)并去除空白字符
  • 读取第二项输入(物品名称)并去除空白字符
  • 读取第三项输入(数量/价格值)并去除空白字符
  • 将第三项输入解析为 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 stock
      • Price: $[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 inventory
    • Price: $[price]
    • Quantity: 0
  • 对于 check 命令(物品存在):
    • [item_name] is in stock
    • Price: $[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: 在下方编写你的代码
    // 解析以逗号分隔的输入,填充库存
    // 对 command 使用 match 表达式,处理 add、check 和 sell 操作
    // 记得根据命令输出相应的消息
    
}

逻辑与流程中的所有课

自己练习: Rust 在线编译器