Hiển thị hóa đơn cuối cùng
Thuộc phần Logic và luồng điều khiển trong hành trình Dart của Coddy. Bài học 37 trên 65.
Thử thách
DễTạo một chương trình hoàn thiện dự án máy tính giỏ hàng bằng cách tạo biên lai cuối cùng đầy đủ, hiển thị mọi chi tiết giao dịch theo định dạng chuyên nghiệp. Dựa trên hệ thống giảm giá của bài học trước, chương trình của bạn cần:
- Sử dụng Map danh mục sản phẩm hiện có và chức năng giỏ hàng từ phần thiết lập trước đó
- Đọc nhiều đầu vào dạng chuỗi, đại diện cho các mặt hàng khách muốn thêm vào giỏ hàng (đầu vào kết thúc khi bạn nhận được
"cart_done") - Với mỗi mặt hàng, kiểm tra xem mặt hàng đó có trong danh mục sản phẩm hay không bằng cách dùng
containsKey(), rồi thêm các mặt hàng hợp lệ vào giỏ hàng - Tính tổng phụ bằng cách cộng giá của tất cả mặt hàng trong giỏ hàng
- Đọc một đầu vào dạng chuỗi đại diện cho ngưỡng giảm giá
- Đọc một đầu vào dạng chuỗi đại diện cho phần trăm giảm giá cần áp dụng
- Chỉ áp dụng giảm giá nếu tổng phụ bằng hoặc vượt ngưỡng
- Tính số tiền giảm giá và tổng cuối cùng sau khi áp dụng giảm giá
- Đọc một đầu vào dạng chuỗi đại diện cho tên khách hàng
- Đọc một đầu vào dạng chuỗi đại diện cho mã giao dịch
- Tạo và hiển thị biên lai hoàn chỉnh với mọi chi tiết giao dịch theo đúng định dạng bên dưới
Ví dụ: cửa hàng có các sản phẩm "Apple" giá 1.50, "Banana" giá 0.80, "Orange" giá 2.00, "Milk" giá 3.25; khách muốn thêm "Apple", "Orange", "Milk", "Apple"; ngưỡng giảm giá là 5.00, phần trăm giảm giá là 10, tên khách hàng là "John Smith" và mã giao dịch là "TXN001", chương trình của bạn cần in ra:
Shopping Cart Operations:
Adding 'Apple': Item added to cart successfully
Adding 'Orange': Item added to cart successfully
Adding 'Milk': Item added to cart successfully
Adding 'Apple': Item added to cart successfully
Cart Contents: [Apple, Orange, Milk, Apple]
Cost Calculation:
Apple: $1.50
Orange: $2.00
Milk: $3.25
Apple: $1.50
Subtotal: $8.25
Discount Analysis:
Threshold: $5.00
Discount Rate: 10%
Subtotal ($8.25) meets threshold requirement
Discount Applied: $0.83
Final Total: $7.42
========================================
FINAL RECEIPT
========================================
Transaction ID: TXN001
Customer: John Smith
Date: 2024-01-15
Time: 14:30:25
----------------------------------------
ITEMS PURCHASED:
Apple $1.50
Orange $2.00
Milk $3.25
Apple $1.50
----------------------------------------
Subtotal: $8.25
Discount (10%): -$0.83
----------------------------------------
TOTAL: $7.42
----------------------------------------
Payment Method: Cash
Items Count: 4
Unique Products: 3
Thank you for shopping with us!
========================================Nếu cửa hàng có các sản phẩm "Laptop" giá 999.99, "Mouse" giá 25.50, "Keyboard" giá 75.00; khách muốn thêm "Mouse", "Keyboard"; ngưỡng giảm giá là 150.00, phần trăm giảm giá là 15, tên khách hàng là "Sarah Johnson" và mã giao dịch là "TXN002", chương trình của bạn cần in ra:
Shopping Cart Operations:
Adding 'Mouse': Item added to cart successfully
Adding 'Keyboard': Item added to cart successfully
Cart Contents: [Mouse, Keyboard]
Cost Calculation:
Mouse: $25.50
Keyboard: $75.00
Subtotal: $100.50
Discount Analysis:
Threshold: $150.00
Discount Rate: 15%
Subtotal ($100.50) does not meet threshold requirement
Discount Applied: $0.00
Final Total: $100.50
========================================
FINAL RECEIPT
========================================
Transaction ID: TXN002
Customer: Sarah Johnson
Date: 2024-01-15
Time: 14:30:25
----------------------------------------
ITEMS PURCHASED:
Mouse $25.50
Keyboard $75.00
----------------------------------------
Subtotal: $100.50
Discount (15%): $0.00
----------------------------------------
TOTAL: $100.50
----------------------------------------
Payment Method: Cash
Items Count: 2
Unique Products: 2
Thank you for shopping with us!
========================================Nếu cửa hàng có các sản phẩm "Novel" giá 12.99, "Magazine" giá 4.50, "Textbook" giá 89.00; khách muốn thêm "Novel", "Textbook", "Magazine", "Novel"; ngưỡng giảm giá là 75.00, phần trăm giảm giá là 20, tên khách hàng là "Mike Davis" và mã giao dịch là "TXN003", chương trình của bạn cần in ra:
Shopping Cart Operations:
Adding 'Novel': Item added to cart successfully
Adding 'Textbook': Item added to cart successfully
Adding 'Magazine': Item added to cart successfully
Adding 'Novel': Item added to cart successfully
Cart Contents: [Novel, Textbook, Magazine, Novel]
Cost Calculation:
Novel: $12.99
Textbook: $89.00
Magazine: $4.50
Novel: $12.99
Subtotal: $119.48
Discount Analysis:
Threshold: $75.00
Discount Rate: 20%
Subtotal ($119.48) meets threshold requirement
Discount Applied: $23.90
Final Total: $95.58
========================================
FINAL RECEIPT
========================================
Transaction ID: TXN003
Customer: Mike Davis
Date: 2024-01-15
Time: 14:30:25
----------------------------------------
ITEMS PURCHASED:
Novel $12.99
Textbook $89.00
Magazine $4.50
Novel $12.99
----------------------------------------
Subtotal: $119.48
Discount (20%): -$23.90
----------------------------------------
TOTAL: $95.58
----------------------------------------
Payment Method: Cash
Items Count: 4
Unique Products: 3
Thank you for shopping with us!
========================================Chương trình cần định dạng biên lai cuối cùng với căn chỉnh và khoảng cách phù hợp. Dùng nội suy chuỗi để hiển thị mọi chi tiết giao dịch, bao gồm thông tin khách hàng, các mặt hàng đã mua, phép tính giá và số liệu thống kê tổng hợp. Biên lai cần có các giá trị cố định cho ngày (2024-01-15), giờ (14:30:25) và phương thức thanh toán (Cash). Định dạng mọi giá trị tiền tệ với chính xác 2 chữ số thập phân. Tính số lượng mặt hàng bằng độ dài giỏ hàng và số sản phẩm duy nhất bằng cách chuyển giỏ hàng thành một Set. Định dạng đầu vào sẽ là: tên các mặt hàng cần thêm vào giỏ hàng, kết thúc bằng "cart_done", sau đó là ngưỡng giảm giá, phần trăm giảm giá, tên khách hàng và mã giao dịch (tất cả đều ở dạng chuỗi).
Tự làm thử
import 'dart:io';
void main() {
// Product catalog
Map<String, double> products = {
'Apple': 1.50,
'Banana': 0.80,
'Orange': 2.00,
'Milk': 3.25,
'Laptop': 999.99,
'Mouse': 25.50,
'Keyboard': 75.00,
'Novel': 12.99,
'Magazine': 4.50,
'Textbook': 89.00
};
List<String> cart = [];
int itemsAdded = 0;
int itemsNotFound = 0;
print('Shopping Cart Operations:');
// Read items until "cart_done"
while (true) {
String? item = stdin.readLineSync();
if (item == 'cart_done') break;
if (products.containsKey(item)) {
cart.add(item!);
print("Adding '$item': Item added to cart successfully");
itemsAdded++;
} else {
print("Adding '$item': Item not found in catalog");
itemsNotFound++;
}
}
print('Cart Contents: $cart');
// Calculate subtotal
print('Cost Calculation:');
double subtotal = 0.0;
for (String item in cart) {
double price = products[item]!;
print('$item: \$${price.toStringAsFixed(2)}');
subtotal += price;
}
print('Subtotal: \$${subtotal.toStringAsFixed(2)}');
// Read discount threshold and percentage
String? thresholdInput = stdin.readLineSync();
String? discountPercentageInput = stdin.readLineSync();
double threshold = double.parse(thresholdInput!);
int discountPercentage = int.parse(discountPercentageInput!);
// Discount analysis
print('Discount Analysis:');
print('Threshold: \$${threshold.toStringAsFixed(2)}');
print('Discount Rate: $discountPercentage%');
double discountAmount = 0.0;
double finalTotal = subtotal;
String discountStatus = 'No discount applied';
if (subtotal >= threshold) {
print('Subtotal (\$${subtotal.toStringAsFixed(2)}) meets threshold requirement');
discountAmount = subtotal * (discountPercentage / 100);
finalTotal = subtotal - discountAmount;
discountStatus = '$discountPercentage% discount applied';
} else {
print('Subtotal (\$${subtotal.toStringAsFixed(2)}) does not meet threshold requirement');
}
print('Discount Applied: \$${discountAmount.toStringAsFixed(2)}');
print('Final Total: \$${finalTotal.toStringAsFixed(2)}');
// Cart summary
Set<String> uniqueProducts = cart.toSet();
print('Cart Summary:');
print('Total items in cart: ${cart.length}');
print('Unique products in cart: ${uniqueProducts.length}');
print('Items successfully added: $itemsAdded');
print('Items not found: $itemsNotFound');
print('Discount Status: $discountStatus');
print('Cart Status: Ready for checkout');
}Tất cả bài học trong Logic và luồng điều khiển
1Thao tác nâng cao với danh sách
Thuộc tính danh sách: đầu và cuốiTrạng thái danh sách: isEmpty và isNotEmpĐảo ngược danh sáchThêm vào danh sách: insertXóa khỏi danh sách: removeWhereTìm trong danh sách: indexOfSắp xếp danh sáchXáo trộn danh sáchÔn tập: trình sắp xếp danh sách4Thao tác nâng cao với Map
Duyệt qua MapKiểm tra khóa và giá trịCác thuộc tính của Map: khóa và giá trịThêm có điều kiện: putIfAbsentXóa mục khỏi MapMap lồng nhauÔn tập: Cập nhật kho hàng2Thao tác hàm trên danh sách
Biến đổi bằng 'map'Lọc bằng 'where'Dùng '.toList()'Kiểm tra điều kiện bằng 'any'Điều kiện với 'every'Tìm phần tử bằng 'firstWhere'Ôn tập: lọc dữ liệu5Dự án: Tính tiền giỏ hàng
Thiết lập dự ánThêm mặt hàng vào giỏ8Dự án: Trình phân tích văn bản đơn giản
Tổng quan và thiết lập dự ánĐếm ký tự3Tập hợp
Tập hợp là gì?Tạo tập hợpThêm và xóa phần tử khỏi tập hợpKiểm tra phần tử trong tập hợpChuyển danh sách thành tập hợpPhép hợp của các tập hợpPhép giao của các tập hợpPhép hiệu của các tập hợpÔn tập: danh sách khách mời không trùng lặpTự luyện tập: Trình biên dịch Dart online