Menu
Coddy logo textTech

הוספה מותנית: putIfAbsent

חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Dart של Coddy. שיעור 29 מתוך 65.

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

המתודה הזו מקבלת שני פרמטרים: המפתח שיש לבדוק, והערך שיש להוסיף אם המפתח אינו קיים. אם המפתח כבר קיים, putIfAbsent() לא עושה דבר ומשאירה את הערך הקיים ללא שינוי. אם המפתח חסר, היא מוסיפה למפה את צמד המפתח-ערך החדש.

Map<String, int> gameScores = {
  'Alice': 150,
  'Bob': 200
};

// זה יוסיף את Charlie כי הוא לא נמצא במפה
gameScores.putIfAbsent('Charlie', () => 0);
print(gameScores);  // {Alice: 150, Bob: 200, Charlie: 0}

// זה לא ישנה את הניקוד של Alice כי היא כבר קיימת
gameScores.putIfAbsent('Alice', () => 0);
print(gameScores);  // {Alice: 150, Bob: 200, Charlie: 0}

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

challenge icon

אתגר

קל

צרו תוכנית שמנהלת מערכת הרשמה לטורניר משחקים באמצעות מעקב אחר ציוני השחקנים והבטחה שלכל השחקנים יהיו ערכי פתיחה כברירת מחדל. התוכנית שלכם צריכה:

  1. לקרוא קלט מסוג מחרוזת שמייצג את שם הטורניר
  2. לקרוא כמה זוגות של קלטים שמייצגים את שמות השחקנים ואת הציונים הנוכחיים שלהם (הקלט יסתיים כשתקבלו "scores_done")
  3. לקרוא כמה קלטים מסוג מחרוזת שמייצגים שחקנים חדשים שרוצים להצטרף לטורניר (הקלט יסתיים כשתקבלו "players_done")
  4. ליצור Map לאחסון שמות השחקנים כמפתחות והציונים שלהם כערכים
  5. להשתמש בשיטה putIfAbsent() כדי להוסיף כל שחקן חדש עם ציון ברירת מחדל של 0, אך רק אם הוא עדיין לא רשום
  6. לחשב את הסטטיסטיקות של הטורניר ולהדפיס את דוח ההרשמה בדיוק בפורמט שמוצג למטה

לדוגמה, אם שם הטורניר הוא "Spring Championship", הציונים הקיימים כוללים את "Alice" עם 150, את "Bob" עם 200, את "Charlie" עם 75, והשחקנים החדשים הם "Diana", "Alice", "Eve", התוכנית שלכם צריכה להציג:

Tournament: Spring Championship
Initial Scores: {Alice: 150, Bob: 200, Charlie: 75}
Registration Process:
Adding Diana: New player registered with score 0
Adding Alice: Player already exists, keeping score 150
Adding Eve: New player registered with score 0
Final Scores: {Alice: 150, Bob: 200, Charlie: 75, Diana: 0, Eve: 0}
Tournament Statistics:
Total registered players: 5
Players with scores above 0: 3
New players added: 2
Average score: 85.0
Status: Registration completed successfully

אם שם הטורניר הוא "Winter Cup", הציונים הקיימים כוללים את "John" עם 300, את "Mary" עם 250, והשחקנים החדשים הם "Sarah", "Tom", "John", התוכנית שלכם צריכה להציג:

Tournament: Winter Cup
Initial Scores: {John: 300, Mary: 250}
Registration Process:
Adding Sarah: New player registered with score 0
Adding Tom: New player registered with score 0
Adding John: Player already exists, keeping score 300
Final Scores: {John: 300, Mary: 250, Sarah: 0, Tom: 0}
Tournament Statistics:
Total registered players: 4
Players with scores above 0: 2
New players added: 2
Average score: 137.5
Status: Registration completed successfully

אם שם הטורניר הוא "Summer League", הציונים הקיימים כוללים את "Alex" עם 180, את "Jordan" עם 220, את "Taylor" עם 160, את "Morgan" עם 190, והשחקנים החדשים הם "Casey", "Riley", התוכנית שלכם צריכה להציג:

Tournament: Summer League
Initial Scores: {Alex: 180, Jordan: 220, Taylor: 160, Morgan: 190}
Registration Process:
Adding Casey: New player registered with score 0
Adding Riley: New player registered with score 0
Final Scores: {Alex: 180, Jordan: 220, Taylor: 160, Morgan: 190, Casey: 0, Riley: 0}
Tournament Statistics:
Total registered players: 6
Players with scores above 0: 4
New players added: 2
Average score: 158.33333333333334
Status: Registration completed successfully

התוכנית שלכם חייבת להשתמש בשיטה putIfAbsent() כדי להוסיף שחקנים חדשים עם ציון ברירת מחדל של 0, תוך הבטחה ששחקנים קיימים ישמרו על הציונים הנוכחיים שלהם ללא שינוי. חשבו את הציון הממוצע על ידי חלוקת סכום כל הציונים במספר השחקנים. ספרו כמה שחקנים קיבלו ציון גבוה מ-0 וכמה שחקנים חדשים נוספו בפועל (למעט אלה שכבר היו רשומים). פורמט הקלט יהיה: שם הטורניר, אחריו שמות שחקנים וציונים לסירוגין (כמחרוזות שיש להמיר למספרים שלמים), עד "scores_done", ולאחר מכן שמות השחקנים החדשים עד "players_done".

נסו בעצמכם

import 'dart:io';

void main() {
  // קראו את שם הטורניר
  String? tournamentName = stdin.readLineSync();
  
  // צרו מפה לאחסון הניקוד של השחקנים
  Map<String, int> playerScores = {};
  
  // קראו את הניקוד של השחקנים הקיימים
  while (true) {
    String? input = stdin.readLineSync();
    if (input == "scores_done") break;
    
    String playerName = input!;
    String? scoreInput = stdin.readLineSync();
    int score = int.parse(scoreInput!);
    playerScores[playerName] = score;
  }
  
  // שמרו את הניקוד ההתחלתי לצורך הצגה
  Map<String, int> initialScores = Map.from(playerScores);
  
  // קראו את פרטי השחקנים החדשים לרישום
  List<String> newPlayers = [];
  while (true) {
    String? input = stdin.readLineSync();
    if (input == "players_done") break;
    newPlayers.add(input!);
  }
  
  // TODO: כתבו את הקוד שלכם למטה
  // השתמשו במתודה putIfAbsent() כדי להוסיף שחקנים חדשים עם ניקוד ברירת מחדל של 0
  // עקבו אחר תהליך הרישום וחשבו נתונים סטטיסטיים
  
  // הדפיסו את דוח הרישום לטורניר
  print("Tournament: $tournamentName");
  print("Initial Scores: $initialScores");
  print("Registration Process:");
  // הדפיסו כאן את פרטי תהליך הרישום
  print("Final Scores: $playerScores");
  print("Tournament Statistics:");
  // הדפיסו כאן נתונים סטטיסטיים
  print("Status: Registration completed successfully");
}
quiz iconבחנו את עצמכם

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

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

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