פרק 8 - מערך דו-ממדי
עד עכשיו המערכים שלנו היו "שורה" אחת של תאים. אבל לפעמים המידע מסודר כמו טבלה - שורות ועמודות, כמו לוח שחמט, גיליון ציונים, או תמונה. בשביל זה יש מערך דו-ממדי (2D Array).
1. מהו מערך דו-ממדי?
מערך דו-ממדי הוא טבלה מסודרת של תאים, עם מספר שורות ומספר עמודות קבוע. כדי לגשת לאיבר, נצטרך שני אינדקסים: אחד לשורה ואחד לעמודה.
2. יצירת מערך דו-ממדי
ב-C# מערך דו-ממדי מוגדר עם פסיק בתוך הסוגריים המרובעים: [,].
int[,] grid = {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
יצרנו מטריצה בגודל 3 שורות על 3 עמודות (3x3).
כל זוג { } פנימי הוא שורה אחת שלמה.
3. גישה לאיבר: שורה ועמודה
שימו לב: ב-C#, בשונה מ-Java, לא כותבים שני סוגריים מרובעים נפרדים - כותבים את שני האינדקסים בתוך אותו זוג סוגריים, מופרדים בפסיק.
Console.WriteLine(grid[0, 0]);
Console.WriteLine(grid[1, 2]);
grid[0, 0] - שורה 0, עמודה 0: האיבר 1.
grid[1, 2] - שורה 1 (השנייה), עמודה 2 (השלישית): האיבר 6.
[שורה, עמודה], ולא הפוך.
4. מעבר על כל התאים: לולאות מקוננות
כדי לבקר בכל תא במטריצה, נשתמש בשתי לולאות מקוננות שלמדנו בפרק הלולאות - הלולאה החיצונית עוברת על
השורות, והפנימית עוברת על העמודות. מספר השורות והעמודות מקבלים בעזרת GetLength.
for (int row = 0; row < grid.GetLength(0); row++)
{
for (int col = 0; col < grid.GetLength(1); col++)
{
Console.Write(grid[row, col] + " ");
}
Console.WriteLine();
}
grid.GetLength(0) - מספר השורות במטריצה.
grid.GetLength(1) - מספר העמודות במטריצה.
5. תבנית: סכום כל התאים
אותה תבנית "צובר" שהכרנו במערך חד-ממדי עובדת גם כאן - רק בתוך שתי לולאות מקוננות:
int sum = 0;
for (int row = 0; row < grid.GetLength(0); row++)
{
for (int col = 0; col < grid.GetLength(1); col++)
{
sum = sum + grid[row, col];
}
}
Console.WriteLine("סכום כל התאים: " + sum);
6. טעויות נפוצות
החלפה בין שורה לעמודה: לכתוב grid[col, row] במקום grid[row, col] - קל להתבלבל.
בלבול בין GetLength(0) ל-GetLength(1): GetLength(0) הוא תמיד מספר השורות, ו-GetLength(1) מספר העמודות.
שימוש בסוגריים מרובעים כפולים: ב-C# לא כותבים grid[row][col] (כמו ב-Java) אלא grid[row, col].
🎓 זווית הבגרות
איך זה מופיע בבגרות: חשוב לדעת - מערך דו-ממדי מסומן במפורש כ"מחוץ לתכנית הלימודים" (X) במיקוד הבגרות הנוכחי, גם ל-899371 וגם ל-899271. הנושא לא אמור להופיע בשאלות המבחן בפועל בשנה הנוכחית.
סוג שאלה טיפוסי: אין - זה לא נושא נבחן כרגע. הפרק כאן כהעשרה ובסיס להבנת מבני נתונים מתקדמים יותר.
טעות נפוצה: להניח שכל נושא שמופיע בחומר הלימוד בהכרח נבחן - תמיד כדאי לבדוק את מסמך המיקוד העדכני לשנה שלכם, לא רק את חומר הלימוד הכללי.
מה לזכור למבחן: אל תשקיעו זמן הכנה יקר בנושא הזה על חשבון מערכים חד-ממדיים, לולאות ומתודות - אלה כן נבחנים בוודאות.
7. תרגול
מה יודפס למסך על ידי הקוד הבא?
int[,] grid = {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
Console.WriteLine(grid[2, 1]);
כתבו קוד שמדפיס את האיבר בשורה 2 ועמודה 1 במטריצה grid.
כתבו את שורת הכותרת של הלולאה החיצונית שעוברת על כל השורות של grid.
בתוך הלולאות המקוננות, כתבו את שורת הקוד שמוסיפה את grid[row, col] לצובר sum.