Menu
Coddy logo textTech

מבנים הניתנים לשינוי

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

כברירת מחדל, מופעים של מבנים ב-Rust אינם ניתנים לשינוי — לאחר שיוצרים אותם, אי אפשר לשנות את ערכי השדות שלהם. עם זאת, כמו משתנים אחרים, אפשר להפוך מופע של מבנה לניתן לשינוי על ידי הוספת מילת המפתח mut בעת ההכרזה עליו.

כשמכריזים על מופע של struct כניתן לשינוי, אפשר לשנות כל אחד מהשדות שלו באמצעות סימון נקודה:

let mut player = Player {
    name: String::from("Alice"),
    score: 0,
};

player.score = 100; // זה עובד כי player ניתן לשינוי

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

challenge icon

אתגר

קל

תקבלו ארבעה קלטים: שם של שחקן, ניקוד התחלתי (כמספר שלם), ניקוד בונוס שיש להוסיף (כמספר שלם) והתאמה סופית לניקוד (כמספר שלם). הגדירו struct בשם Player עם שני שדות: name מטיפוס String ו-score מטיפוס i32. צרו מופע בר-שינוי של ה-struct הזה, ואז שנו את שדה הניקוד כמה פעמים באמצעות ערכי הקלט.

דרישות:

  • הגדירו struct בשם Player עם השדות: name: String ו-score: i32
  • קראו את הקלט הראשון בתור שם השחקן
  • קראו את הקלט השני והמירו אותו ל-i32 עבור הניקוד ההתחלתי
  • צרו מופע בר-שינוי של ה-struct Player עם הערכים האלה
  • קראו את הקלט השלישי והמירו אותו ל-i32 עבור ניקוד הבונוס
  • הוסיפו את ניקוד הבונוס לניקוד הנוכחי של השחקן באמצעות תחביר נקודה
  • קראו את הקלט הרביעי והמירו אותו ל-i32 עבור ההתאמה הסופית
  • הוסיפו את ההתאמה הסופית לניקוד הנוכחי של השחקן
  • הדפיסו את פרטי השחקן בפורמט המדויק שמוצג למטה

קלט:

  • שורה ראשונה: שם השחקן (לדוגמה, Alice)
  • שורה שנייה: הניקוד ההתחלתי כמספר שלם (לדוגמה, 50)
  • שורה שלישית: ניקוד הבונוס כמספר שלם (לדוגמה, 30)
  • שורה רביעית: ההתאמה הסופית כמספר שלם (לדוגמה, 20)

פלט:

  • שורה ראשונה: Player: [name]
  • שורה שנייה: Final Score: [score]

נסו בעצמכם

use std::io;

// TODO: הגדירו כאן את המבנה Player עם השדות name ו-score

fn main() {
    // קראו את שם השחקן
    let mut name = String::new();
    io::stdin().read_line(&mut name).expect("Failed to read line");
    let name = name.trim().to_string();
    
    // קראו את הניקוד ההתחלתי
    let mut initial_score = String::new();
    io::stdin().read_line(&mut initial_score).expect("Failed to read line");
    let initial_score: i32 = initial_score.trim().parse().expect("Invalid number");
    
    // קראו את ניקוד הבונוס
    let mut bonus = String::new();
    io::stdin().read_line(&mut bonus).expect("Failed to read line");
    let bonus: i32 = bonus.trim().parse().expect("Invalid number");
    
    // קראו את ההתאמה הסופית
    let mut adjustment = String::new();
    io::stdin().read_line(&mut adjustment).expect("Failed to read line");
    let adjustment: i32 = adjustment.trim().parse().expect("Invalid number");
    
    // TODO: צרו מופע ניתן לשינוי של Player
    
    // TODO: הוסיפו את ניקוד הבונוס לניקוד של השחקן
    
    // TODO: הוסיפו את ההתאמה הסופית לניקוד של השחקן
    
    // TODO: הדפיסו את הפלט בפורמט הנדרש
}
quiz iconבחנו את עצמכם

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

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

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