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.
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
HashMaptừ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
matchvớ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à0làm số lượng ban đầu - In ra:
Added [item_name] to inventory - In ra:
Price: $[price] - In ra:
Quantity: 0
- Dùng
- 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 stockPrice: $[price]Quantity: [quantity]
- Nếu là
None, in ra:[item_name] is not in stock
- Dùng
- Với lệnh
sell:- Phân tích đầu vào thứ ba thành
i32là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
- Phân tích đầu vào thứ ba thành
- Với mọi lệnh khác, in ra:
Invalid command
Đầu vào:
- Dòng thứ nhất: Lệnh (
add,checkhoặcsell) - 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 inventoryPrice: $[price]Quantity: 0
- Với lệnh
check(mặt hàng tồn tại):[item_name] is in stockPrice: $[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
1Luồng điều khiển nâng cao
Biểu thức 'match'Khớp nhiều giá trịKhớp các phạm viBiểu thức 'if let'Vòng lặp dưới dạng biểu thứcÔn tập: Trình phân tích cú pháp lệnh đơn giản4Nhóm dữ liệu bằng Struct
Struct là gì?Tổng quan về StructTruy cập các trường của StructStruct có thể thay đổiStruct làm tham số cho hàmStruct dạng tupleÔn tập: Tạo Struct Book2Giới thiệu về vector
Vector là gì?Tạo vectorThêm phần tử bằng pushTruy cập phần tử trong vectorLặp qua vectorLặp có thể thay đổiXóa phần tửÔn tập: Bộ theo dõi điểm số cơ bản5Cặp khóa-giá trị với bảng băm
Bảng băm là gì?Tạo bảng bămThêm cặp khóa-giá trịTruy cập giá trịDuyệt qua bảng bămCập nhật giá trịXóa một cặpÔn tập: Bộ đếm từ8Dự án: Quản lý kho hàng đơn giản
Thiết lập dự ánThêm mặt hàngKiểm tra hàng tồn khoBán mặt hàngKết hợp tất cả11Thử thách cuối cùng
Ôn tập: Các mục duy nhấtÔn tập: Trình xác thực hồ sơ người dùngÔn tập: Tổng hợp điểm3Danh sách việc cần làm trên dòng lệnh
Thiết lập dự ánThêm một việcXem tất cả việcXóa một việcCode hoàn chỉnh6Xử lý giá trị vắng mặt với 'Option'
'Option' là gì?Dùng 'match' với 'Option'is_some() và is_none()Lấy giá trị từ 'Option'expectCung cấp giá trị mặc định: unwrap_orÔn tập: tìm một phần tử9Lát cắt chuỗi và hơn thế nữa
String và &strTạo lát cắt chuỗiLát cắt làm tham số hàmCác lát cắt khácÔn tập: Tìm từ đầu tiênTự luyện tập: Trình biên dịch Rust online