Menu
CoddyTech

Kết hợp tất cả

Thuộc phần Logic và luồng chương trình trong hành trình Rust của Coddy. Bài học 53 trên 66.

challenge icon

Thử thách

Dễ

Bạn sẽ nhận được sáu đầu vào. Đầu vào thứ nhất là một lệnh, có thể là add, check hoặc sell. Đầu vào thứ hai là tên mặt hàng. Đầu vào thứ ba là một số, biểu thị số lượng cần bán (với lệnh sell) hoặc số lượng ban đầu (với lệnh add). Đầu vào thứ tư là danh sách tên mặt hàng trong kho, phân tách bằng dấu phẩy. Đầu vào thứ năm là danh sách giá tương ứng với từng mặt hàng, phân tách bằng dấu phẩy. Đầu vào thứ sáu là danh sách số lượng tương ứng với từng mặt hàng, phân tách bằng dấu phẩy.

Xây dựng một hệ thống quản lý kho hoàn chỉnh, xử lý cả ba thao tác: thêm mặt hàng, kiểm tra hàng tồn kho và bán mặt hàng. Dùng HashMap để lưu dữ liệu kho, trong đó khóa là tên mặt hàng và giá trị là một tuple chứa giá và số lượng (f64, i32).

Yêu cầu:

  • Nhập HashMap từ std::collections
  • Đọc đầu vào thứ nhất (lệnh) và loại bỏ khoảng trắng ở đầu và cuối
  • Đọc đầu vào thứ hai (tên mặt hàng) và loại bỏ khoảng trắng ở đầu và cuối
  • Đọc đầu vào thứ ba (giá trị số lượng/giá) và loại bỏ khoảng trắng ở đầu và cuối
  • Phân tích đầu vào thứ ba thành f64
  • Đọc đầu vào thứ tư (tên mặt hàng, phân tách bằng dấu phẩy) và loại bỏ khoảng trắng ở đầu và cuối
  • Đọc đầu vào thứ năm (giá, phân tách bằng dấu phẩy) và loại bỏ khoảng trắng ở đầu và cuối
  • Đọc đầu vào thứ sáu (số lượng, phân tách bằng dấu phẩy) và loại bỏ khoảng trắng ở đầu và cuối
  • Tạo một HashMap<String, (f64, i32)> có thể thay đổi để lưu kho
  • Tách tên mặt hàng theo dấu phẩy
  • Tách giá theo dấu phẩy và phân tích từng giá thành f64
  • Tách số lượng theo dấu phẩy và phân tích từng số lượng thành i32
  • Chèn từng mặt hàng vào kho cùng với giá và số lượng tương ứng dưới dạng một tuple
  • Dùng biểu thức match với lệnh để xác định thao tác cần thực hiện
  • Với lệnh add:
    • Dùng .entry() và .or_insert() để thêm mặt hàng nếu mặt hàng đó chưa tồn tại, dùng đầu vào thứ ba làm giá và 0 làm số lượng ban đầu
    • In ra: Added [item_name] to inventory
    • In ra: Price: $[price]
    • In ra: Quantity: 0
  • Với lệnh check:
    • Dùng .get() để kiểm tra mặt hàng có tồn tại hay không
    • Dùng biểu thức match để xử lý Option
    • Nếu là Some, in ra:
      • [item_name] is in stock
      • Price: $[price]
      • Quantity: [quantity]
    • Nếu là None, in ra: [item_name] is not in stock
  • Với lệnh sell:
    • Phân tích đầu vào thứ ba thành i32 làm số lượng cần bán
    • Dùng .get() để kiểm tra mặt hàng có tồn tại hay không
    • Dùng biểu thức match để xử lý Option
    • Nếu là Some:
      • Kiểm tra xem số lượng hiện có có đủ hay không
      • Nếu đủ, cập nhật kho với số lượng mới và in ra:
        • Sold [quantity_to_sell] [item_name]
        • Total: $[total_price]
        • Remaining stock: [new_quantity]
      • Nếu không đủ, in ra:
        • Insufficient stock for [item_name]
        • Available: [current_quantity]
    • Nếu là None, in ra: [item_name] is not in stock
  • Với mọi lệnh khác, in ra: Invalid command

Đầu vào:

  • Dòng thứ nhất: Lệnh (add, check hoặc sell)
  • Dòng thứ hai: Tên mặt hàng (ví dụ: Tablet)
  • Dòng thứ ba: Số (giá nếu là add, số lượng nếu là sell, không dùng nếu là check)
  • Dòng thứ tư: Tên mặt hàng, phân tách bằng dấu phẩy (ví dụ: Laptop,Mouse,Keyboard)
  • Dòng thứ năm: Giá, phân tách bằng dấu phẩy (ví dụ: 999.99,25.50,75.00)
  • Dòng thứ sáu: Số lượng, phân tách bằng dấu phẩy (ví dụ: 15,50,30)

Đầu ra:

  • Với lệnh add:
    • Added [item_name] to inventory
    • Price: $[price]
    • Quantity: 0
  • Với lệnh check (mặt hàng tồn tại):
    • [item_name] is in stock
    • Price: $[price]
    • Quantity: [quantity]
  • Với lệnh check (mặt hàng không tồn tại): [item_name] is not in stock
  • Với lệnh sell (đủ hàng):
    • Sold [quantity_to_sell] [item_name]
    • Total: $[total_price]
    • Remaining stock: [new_quantity]
  • Với lệnh sell (không đủ hàng):
    • Insufficient stock for [item_name]
    • Available: [current_quantity]
  • Với lệnh sell (mặt hàng không tồn tại): [item_name] is not in stock
  • Với lệnh không hợp lệ: Invalid command

Tự làm thử

use std::collections::HashMap;
use std::io;

fn main() {
    // Đọc các đầu vào
    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();
    
    // Tạo HashMap inventory
    let mut inventory: HashMap<String, (f64, i32)> = HashMap::new();
    
    // TODO: Viết code của bạn bên dưới
    // Phân tích các đầu vào phân tách bằng dấu phẩy và điền dữ liệu vào inventory
    // Dùng biểu thức (expression) match với command để xử lý các thao tác add, check và sell
    // Nhớ in ra thông báo phù hợp với command
    
}

Tất cả bài học trong Logic và luồng chương trình

Tự luyện tập: Trình biên dịch Rust online