חיבור כל החלקים
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Rust של Coddy. שיעור 53 מתוך 66.
אתגר
קליתקבלו שישה קלטים. הקלט הראשון הוא פקודה שיכולה להיות add, check או sell. הקלט השני הוא שם של פריט. הקלט השלישי הוא מספר שמייצג את הכמות למכירה (עבור הפקודה sell) או את הכמות ההתחלתית (עבור הפקודה add). הקלט הרביעי הוא רשימה מופרדת בפסיקים של שמות הפריטים שבמלאי. הקלט החמישי הוא רשימה מופרדת בפסיקים של המחירים המתאימים לכל פריט. הקלט השישי הוא רשימה מופרדת בפסיקים של הכמויות המתאימות לכל פריט.
בנו מערכת מלאה לניהול מלאי שמטפלת בכל שלוש הפעולות: הוספת פריטים, בדיקת המלאי ומכירת פריטים. השתמשו ב-HashMap לאחסון נתוני המלאי, כאשר המפתח הוא שם הפריט והערך הוא tuple שמכיל את המחיר והכמות (f64, i32).
דרישות:
- ייבאו את
HashMapמתוךstd::collections - קראו את הקלט הראשון (פקודה) והסירו רווחים לבנים
- קראו את הקלט השני (שם הפריט) והסירו רווחים לבנים
- קראו את הקלט השלישי (ערך כמות/מחיר) והסירו רווחים לבנים
- נתחו את הקלט השלישי ל-
f64 - קראו את הקלט הרביעי (שמות פריטים מופרדים בפסיקים) והסירו רווחים לבנים
- קראו את הקלט החמישי (מחירים מופרדים בפסיקים) והסירו רווחים לבנים
- קראו את הקלט השישי (כמויות מופרדות בפסיקים) והסירו רווחים לבנים
- צרו
HashMap<String, (f64, i32)>משתנה עבור המלאי - פצלו את שמות הפריטים לפי פסיקים
- פצלו את המחירים לפי פסיקים ונתחו כל אחד מהם ל-
f64 - פצלו את הכמויות לפי פסיקים ונתחו כל אחת מהן ל-
i32 - הכניסו כל פריט למלאי עם המחיר והכמות המתאימים לו כ-tuple
- השתמשו בביטוי
matchעל הפקודה כדי לקבוע איזו פעולה לבצע - עבור הפקודה
add:- השתמשו ב-
.entry()וב-.or_insert()כדי להוסיף את הפריט אם הוא לא קיים, תוך שימוש בקלט השלישי כמחיר וב-0ככמות ההתחלתית - הדפיסו:
Added [item_name] to inventory - הדפיסו:
Price: $[price] - הדפיסו:
Quantity: 0
- השתמשו ב-
- עבור הפקודה
check:- השתמשו ב-
.get()כדי לבדוק אם הפריט קיים - השתמשו בביטוי
matchכדי לטפל ב-Option - אם התוצאה היא
Some, הדפיסו:[item_name] is in stockPrice: $[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 inventoryPrice: $[price]Quantity: 0
- עבור הפקודה
check(הפריט קיים):[item_name] is in stockPrice: $[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: כתבו את הקוד שלכם למטה
// נתחו את הקלטים המופרדים בפסיקים ומלאו את המלאי
// השתמשו בביטוי match על command כדי לטפל בפעולות add, check ו-sell
// זכרו להדפיס את ההודעות המתאימות בהתאם ל-command
}כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1זרימת בקרה מתקדמת
ביטוי 'match'התאמה למספר ערכיםהתאמה לטווחיםביטוי 'if let'לולאות כביטוייםסיכום – מנתח פקודות פשוט4קיבוץ נתונים באמצעות מבנים
מהו מבנה?סקירה כללית על מבניםגישה לשדות במבנהמבנים הניתנים לשינוימבנים כפרמטרים של פונקציהמבני טופלסיכום – יצירת מבנה ספר7טיפול בשגיאות באמצעות 'Result'
מהו 'Result'?שימוש ב-'match' עם 'Result'is_ok() ו-is_err()קיצורי דרך: unwrap ו-expectאופרטור סימן השאלה '?'המרת מחרוזות למספריםסיכום - פונקציית חילוק בטוחה10Closures ופונקציות אנונימיות
מהו Closure?הגדרת Closure פשוטClosures עם פרמטריםלכידת הסביבהסיכום – Closure פשוט לחיבור2מבוא לווקטורים
מהו וקטור?יצירת וקטורהוספת איברים באמצעות pushגישה לאיברי וקטורמעבר על וקטורמעבר ניתן לשינויהסרת איבריםסיכום – מעקב בסיסי אחר ניקוד5זוגות מפתח-ערך באמצעות מפות גיבוב
מהי מפת גיבוב?יצירת מפת גיבובהוספת זוגות מפתח-ערךגישה לערכיםמעבר על מפת גיבובעדכון ערךהסרת זוגסיכום – מונה מיליםתרגלו בעצמכם: קומפיילר Rust אונליין