Menu
Coddy logo textTech

עדכון ערך

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

לפעמים צריך לעדכן ערכים במפת גיבוב בדרכים שונות. כבר למדת ש-.insert() יחליף ערך קיים, אבל מה אם רוצים להוסיף ערך רק כשהמפתח עדיין לא קיים?

Rust מספקת את ממשק ה-API .entry() לעדכוני ערכים מתוחכמים יותר. השיטה השימושית ביותר בממשק API זה היא .or_insert(), שמכניסה ערך רק אם המפתח עדיין לא קיים:

let mut scores = HashMap::new();
scores.insert("Alice", 85);

// פעולה זו לא תדרוס את הניקוד של Alice
scores.entry("Alice").or_insert(90);

// פעולה זו כן תוסיף את הניקוד של Bob, כי הוא עדיין לא נמצא במפה
scores.entry("Bob").or_insert(90);

המתודה .entry() מחזירה enum בשם Entry שמייצג מקום תפוס או פנוי במפת הגיבוב. כשקוראים לה עם .or_insert(), היא מוסיפה את הערך החדש רק אם הרשומה פנויה (המפתח לא קיים).

challenge icon

אתגר

קל

תקבל מספר שלם n המציין את מספר שמות השחקנים שיש לעבד. לאחר מכן תקבל n שמות שחקנים כקלט. צור מפת גיבוב למעקב אחר ניקוד השחקנים (מהסוג HashMap<String, i32>). עבור כל שם שחקן שתקבל, השתמש ב-.entry() עם .or_insert() כדי להוסיף אותו למפה עם ניקוד התחלתי של 100 רק אם הוא עדיין לא מופיע בה. לאחר עיבוד כל השמות, הדפס כל שחקן ואת הניקוד שלו.

דרישות:

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

קלט:

  • שורה ראשונה: מספר שלם n (לדוגמה, 5)
  • n השורות הבאות: שמות שחקנים (לדוגמה, Alice, Bob, Alice, Charlie, Bob)

פלט:

  • שורה אחת עבור כל שחקן ייחודי בפורמט: [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();
    
    // צרו HashMap שניתן לשינוי כדי לאחסן את ניקוד השחקנים
    let mut player_scores: HashMap<String, i32> = HashMap::new();
    
    // TODO: כתבו את הקוד שלכם למטה
    // קראו n שמות שחקנים והשתמשו ב-.entry().or_insert(100) כדי להוסיף אותם למפה
    
    
    
    // הדפיסו כל שחקן ואת הניקוד שלו בפורמט: [name]: [score]
    
}
quiz iconבחנו את עצמכם

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

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

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