Menu
CoddyTech

לולאת for משופרת

חלק מהיחידה יסודות במסלול ה-Rust של Coddy. שיעור 66 מתוך 75.

יש דרכים שונות לעבור על מערך, הנה כמה מהן:
נתבונן במערך הבא:

let numbers = [1, 2, 3, 4, 5];
  • איטרטור ישיר:

    for num in numbers.iter() {}
    // ערכים: 1, 2, 3, 4, 5
  • אינדקס וערך:

    for (index, value) in numbers.iter().enumerate() { }
    // ערכים: (0,1), (1,2), (2,3), (3,4), (4,5)
  • פרוסות בגודל מסוים:

    for chunk in numbers.chunks(2) { }
    // ערכים: [1,2], [3,4], [5]

    כל מקטע הוא פרוסה, כך שאפשר להשתמש בו בשיטות של פרוסות. לדוגמה, chunk.len() מחזירה את מספר האיברים במקטע הזה. המקטע האחרון עשוי להיות קטן יותר אם המערך לא מתחלק באופן שווה.

אפשר גם לשרשר את .enumerate() אל .chunks() כדי לקבל גם אינדקס וגם את המקטע בו-זמנית:

for (i, chunk) in numbers.chunks(2).enumerate() { }
// ערכים: (0,[1,2]), (1,[3,4]), (2,[5])

כאן, .chunks(2) מייצרת תחילה את הפרוסות, ואז .enumerate() עוטפת כל אחת מהן במונה, כך ש-i הוא האינדקס של המקטע ו-chunk היא הפרוסה.

  • איטרציה עם שינוי:

    let mut numbers = [1, 2, 3, 4, 5];
    for num in numbers.iter_mut() { 
    	*num *= 2;
    }
    // המערך הופך ל: [2, 4, 6, 8, 10]
challenge icon

אתגר

קל

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

התוכנית צריכה:

  1. להדפיס את מספרו של כל פריט ואת מחירו (באמצעות enumerate). יש לעצב כך: Item N: $Price (לדוגמה, Item 1: $2.75).
  2. להדפיס את המחירים בזוגות (באמצעות chunks) בתור "עסקאות חבילה". אם יש בחבילה 2 פריטים, יש להדפיס את הסכום: Bundle N: $Price1 + $Price2 = $Sum. אם יש בה פריט אחד בלבד, יש להדפיס: Bundle N: $Price.
  3. להחיל הנחה של 10% על כל המחירים (באמצעות iter_mut).
  4. להדפיס את המחירים הסופיים לאחר ההנחה, כל אחד בשורה חדשה, בפורמט של 2 ספרות אחרי הנקודה העשרונית (לדוגמה, $2.48).

רמז: אפשר לשרשר איטרטורים, למשל, prices.chunks(2).enumerate() מספק גם את האינדקס של כל מקטע וגם את פרוסת המקטע בבת אחת. כל chunk הוא פרוסה, ולכן אפשר לקרוא לו עם chunk.len() ולגשת לאיברים שלו באמצעות אינדקס, למשל chunk[0], chunk[1] וכן הלאה.

פורמט הפלט הצפוי למחירים:
השתמשו ב-${:.2} כדי לעצב מחירים עם 2 ספרות אחרי הנקודה העשרונית.

הטקסט המדויק הוא Bundle 4: $7.90.

נסו בעצמכם

fn main() {
    let mut prices = [2.75, 1.50, 5.00, 3.5, 4.1, 2.25, 7.9];

    println!("Original Prices:");
    // TODO: השתמשו ב-enumerate() כדי להדפיס את המספר והמחיר של כל פריט
    // רמז: prices.iter().enumerate() מחזיר זוגות של (index, &price)
    // עצבו את המחירים עם 2 ספרות אחרי הנקודה העשרונית באמצעות {:.2}; הפורמט המדויק מופיע בהוראות


    println!("\nBundle Deals:");
    // TODO: שרשרו יחד את chunks(2) ואת enumerate(): prices.chunks(2).enumerate()
    // הפעולה מחזירה זוגות של (index, chunk); כל chunk הוא פרוסה, ולכן chunk.len() מציין את גודלה
    // אם chunk.len() == 2, הדפיסו: "Bundle 1: $2.75 + $1.50 = $4.25"
    // אם chunk.len() == 1, הדפיסו את השורה של הפריט הבודד המתוארת בהוראות
    // השתמשו ב-{:.2} כדי לעצב את כל המחירים עם 2 ספרות אחרי הנקודה העשרונית


    // TODO: השתמשו ב-iter_mut() כדי להחיל 10% discount על כל המחירים
    // רמז: הכפילו כל *price ב-0.9


    println!("\nPrices after 10% discount:");
    // TODO: הדפיסו כל מחיר לאחר ההנחה עם 2 ספרות אחרי הנקודה העשרונית
    // פורמט הפלט הצפוי מופיע בהוראות

}
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה יסודות

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