הצגת הקבלה הסופית
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Dart של Coddy. שיעור 37 מתוך 65.
אתגר
קלצרו תוכנית שמשלימה את פרויקט מחשבון עגלת הקניות באמצעות הפקת קבלה סופית מקיפה המציגה את כל פרטי העסקה בפורמט מקצועי. בהמשך למערכת ההנחות מהשיעור הקודם, התוכנית שלכם צריכה:
- להשתמש ב־Map של קטלוג המוצרים הקיים ובפונקציונליות של עגלת הקניות מההגדרה הקודמת
- לקרוא כמה קלטים מסוג מחרוזת המייצגים פריטים שלקוחות רוצים להוסיף לעגלה שלהם (הקלט יסתיים כשתקבלו
"cart_done") - לבדוק עבור כל פריט אם הוא קיים בקטלוג המוצרים באמצעות
containsKey()ולהוסיף לעגלה פריטים תקינים - לחשב את סכום הביניים באמצעות חיבור המחירים של כל הפריטים בעגלה
- לקרוא קלט מסוג מחרוזת המייצג את סכום הסף להנחה
- לקרוא קלט מסוג מחרוזת המייצג את אחוז ההנחה שיש להחיל
- להחיל את ההנחה רק אם סכום הביניים שווה לסכום הסף או עולה עליו
- לחשב את סכום ההנחה ואת הסכום הסופי לאחר החלת ההנחה
- לקרוא קלט מסוג מחרוזת המייצג את שם הלקוח
- לקרוא קלט מסוג מחרוזת המייצג את מזהה העסקה
- להפיק ולהציג קבלה מלאה עם כל פרטי העסקה, בדיוק בפורמט המוצג להלן
לדוגמה, אם בחנות יש מוצרים "Apple" במחיר 1.50, "Banana" במחיר 0.80, "Orange" במחיר 2.00, "Milk" במחיר 3.25, הלקוחות רוצים להוסיף "Apple", "Orange", "Milk", "Apple", סף ההנחה הוא 5.00, אחוז ההנחה הוא 10, שם הלקוח הוא "John Smith", ומזהה העסקה הוא "TXN001", התוכנית שלכם צריכה להפיק:
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!
========================================אם בחנות יש מוצרים "Laptop" במחיר 999.99, "Mouse" במחיר 25.50, "Keyboard" במחיר 75.00, הלקוחות רוצים להוסיף "Mouse", "Keyboard", סף ההנחה הוא 150.00, אחוז ההנחה הוא 15, שם הלקוח הוא "Sarah Johnson", ומזהה העסקה הוא "TXN002", התוכנית שלכם צריכה להפיק:
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!
========================================אם בחנות יש מוצרים "Novel" במחיר 12.99, "Magazine" במחיר 4.50, "Textbook" במחיר 89.00, הלקוחות רוצים להוסיף "Novel", "Textbook", "Magazine", "Novel", סף ההנחה הוא 75.00, אחוז ההנחה הוא 20, שם הלקוח הוא "Mike Davis", ומזהה העסקה הוא "TXN003", התוכנית שלכם צריכה להפיק:
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!
========================================על התוכנית שלכם לעצב את הקבלה הסופית עם יישור וריווח מתאימים. השתמשו באינטרפולציה של מחרוזות כדי להציג את כל פרטי העסקה, כולל פרטי הלקוח, פריטי הרכישה, חישובי התמחור ונתוני הסיכום. הקבלה צריכה לכלול ערכים קבועים עבור התאריך (2024-01-15), השעה (14:30:25) ואמצעי התשלום (Cash). עצבו את כל הערכים הכספיים כך שיוצגו בדיוק עם 2 ספרות אחרי הנקודה העשרונית. חשבו את מספר הפריטים באמצעות אורך העגלה ואת מספר המוצרים הייחודיים באמצעות המרת העגלה ל־Set. פורמט הקלט יהיה: שמות הפריטים להוספה לעגלה, עד לסיום באמצעות "cart_done", ולאחר מכן סכום סף ההנחה, אחוז ההנחה, שם הלקוח ומזהה העסקה (כולם כמחרוזות).
נסו בעצמכם
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');
}כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1מניפולציות מתקדמות ברשימות
מאפייני רשימה: ראשון ואחרוןמצב הרשימה: isEmpty ו-isNotEmpהיפוך רשימההוספה לרשימה: insertהסרת פריטים מרשימה: removeWhereחיפוש ברשימה: indexOfמיון רשימהערבוב רשימהסיכום – מארגן רשימות4מניפולציה מתקדמת של Map
מעבר על Mapבדיקה אם מפתחות וערכים קיימיםמאפייני Map: מפתחות וערכיםהוספה מותנית: putIfAbsentהסרת רשומות מ־MapMaps מקונניםסיכום – עדכון מלאי2פעולות פונקציונליות על רשימות
טרנספורמציה באמצעות 'map'סינון באמצעות 'where'שימוש ב-'.toList()'בדיקת תנאים באמצעות 'any'תנאים באמצעות 'every'איתור באמצעות 'firstWhere'סיכום – סינון נתונים5פרויקט: חישוב עגלת קניות
הגדרת הפרויקטהוספת פריטים לעגלה3קבוצות
מהי קבוצה?יצירת קבוצההוספה והסרה מקבוצותבדיקת נוכחות של איברים בקבוצההמרת רשימה לקבוצהאיחוד קבוצותחיתוך קבוצותהפרש קבוצותסיכום – רשימת אורחים ייחודית6טיפול בסיסי בשגיאות
מהן חריגות?בלוק ה-try-catchתפיסת חריגות באמצעות onבלוק ה-finallyהשלכת חריגהסיכום – חלוקה בטוחה9טיפוסי מנייה (Enums)
מה הם Enums?הגדרת Enum פשוטשימוש ב-Enums במשתניםEnums במשפטי 'switch'סיכום – רמזורתרגלו בעצמכם: קומפיילר Dart אונליין