Menu
Coddy logo textTech

מעבר על מפת גיבוב

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Rust של Coddy. שיעור 31 מתוך 66.

לפעמים צריך לבדוק כל זוג מפתח-ערך במפת הגיבוב שלך, במקום לחפש מפתחות מסוימים. Rust מספקת דרך פשוטה לעבור בלולאה על כל הנתונים באמצעות לולאת for:

for (key, value) in &my_map {
    println!("{}: {}", key, value);
}

שימו לב ל־& שלפני my_map — כך נוצרת הפניה למפת הגיבוב, כדי שתוכלו לבצע איטרציה בלי לקבל בעלות. הלולאה מספקת לכם כל זוג מפתח־ערך בתור טאפל, שאותו תוכלו לפרק ישירות בהצהרת הלולאה.

הנה דוגמה מעשית עם רשימת מחירים:

let mut prices = HashMap::new();
prices.insert("apple", 1.20);
prices.insert("banana", 0.80);

for (item, price) in &prices {
    println!("{} costs ${:.2}", item, price);
}

יש פרט חשוב אחד שכדאי לזכור: מפות גיבוב אינן מבטיחות סדר איטרציה מסוים. ייתכן שהזוגות יופיעו בכל פעם ברצף שונה כשתריצו את התוכנית. הסיבה לכך היא שמפות גיבוב נותנות עדיפות לחיפוש מהיר על פני שמירה על סדר ההוספה, לכן אל תסתמכו על כך שהפריטים יופיעו ברצף מסוים כשתעברו עליהם באיטרציה.

challenge icon

אתגר

קל

יתקבל מספר שלם n המציין את מספר זוגות השם והציון של התלמידים שיש לעבד. לאחר מכן יתקבלו n זוגות של קלט: שם של תלמיד ואחריו ציון המבחן שלו (כמספר שלם). יש ליצור מפת גיבוב לאחסון שמות התלמידים כמפתחות והציונים שלהם כערכים. לאחר הוספת כל הזוגות, יש לעבור על מפת הגיבוב ולהדפיס את שמו של כל תלמיד ואת הציון שלו.

דרישות:

  • יש לייבא את HashMap מתוך std::collections
  • יש ליצור מפת גיבוב ניתנת לשינוי מהטיפוס HashMap<String, i32>
  • יש לקרוא את הקלט הראשון ולהמיר אותו ל-i32 כדי לקבל את מספר הזוגות
  • יש להשתמש בלולאה כדי לקרוא n זוגות של קלט (שם התלמיד, ואז הציון)
  • יש להוסיף כל שם של תלמיד ואת הציון שלו למפת הגיבוב
  • יש להשתמש בלולאת for כדי לעבור על מפת הגיבוב באמצעות &map
  • יש להדפיס את הפרטים של כל תלמיד בפורמט: [name]: [score]
  • יש להדפיס את הזוגות בכל סדר שהוא (מפות גיבוב אינן מבטיחות סדר)

קלט:

  • שורה ראשונה: מספר שלם n (לדוגמה, 3)
  • לאחר מכן n זוגות של שורות:
    • שם התלמיד (לדוגמה, Alice)
    • ציון המבחן כמספר שלם (לדוגמה, 95)

פלט:

  • שורה אחת לכל תלמיד בפורמט: [name]: [score]
  • סדר שורות הפלט עשוי להשתנות בין הרצות בדיקה

נסו בעצמכם

use std::collections::HashMap;
use std::io::{self, BufRead};

fn main() {
    let stdin = io::stdin();
    let mut lines = stdin.lock().lines();
    
    // קרא את מספר הזוגות של תלמיד וציון
    let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
    
    // צור מפת גיבוב ניתנת לשינוי לאחסון שמות התלמידים והציונים שלהם
    let mut students: HashMap<String, i32> = HashMap::new();
    
    // TODO: כתוב את הקוד שלך למטה
    // קרא n זוגות של נתוני קלט (שם תלמיד וציון) והכנס אותם למפת הגיבוב
    
    
    
    // TODO: עבור על מפת הגיבוב והדפס את השם והציון של כל תלמיד
    
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

תרגלו בעצמכם: קומפיילר Rust אונליין