מערכים רב-מימדיים
כפי שהגדרנו רשימה של משתני int ע״י מערך {...} = []int arr, ניתן לייצר מערכים שכל איבר בהם הוא מערך בפני עצמו - מערכים רב-מימדיים.
למשל, נניח שיש קבוצה של 50 סטודנטים ושכל אחד מהם לוקח 3 קורסים. ניתן לחשוב על כל ציון של סטודנט בתור בתור איבר עם שני אינדקסים - אחד עבור מספר הקורס והשני עבור מספר הסטודנט. הדרך להגדיר מערך דו-מימדי מסוג כזה דומה מאוד להגדרת מערך חד-מימדי:
#define NUM_COURSES 3
#define NUM_STUDENTS 50
int grades[NUM_COURSES][NUM_STUDENTS];
זו דוגמא למערך דו-מימדי:
- המשתנה
gradesהוא מערך של מערכיint. - המשתנה
grades[i]הוא מערך של משתניint. - המשתנה
grades[i][j]הוא משתנהint. למעשה,grades[i][j]הוא הציון בקורס ה-iשל הסטודנט ה-j.
דוגמא קלאסית למערך דו-מימדי היא הגדרת מטריצה בקוד. אינטואיטיבית ניתן לחשוב על מטריצה בתור מערך דו-מימדי -
במתמטיקה כותבים \(a_{ij}\) ובשפת C נכתוב a[i][j]:
int matrix[3][4];
matrix[1][2] = 5;
נדגיש שיש משמעות מהותית לסדר בו האינדקסים מופיעים: המשתנה matrix הוא מערך שכל איבר בו הוא מערך של 4 איברי int. למשל, matrix[1] (אינטואיטיבית - השורה השנייה במטריצה) הוא מערך של 4 int-ים. המשתנה matrix[1][2] הוא משתנה int רגיל.
בשביל לאתחל מערך דו-מימדי, ניתן לקנן (nest) את אתחולי המערכים שראינו קודם. נניח למשל שנרצה לכתוב את המטריצה הבאה בקוד:
\[ \begin{bmatrix} 1 & 2 & 3 & 4 \\\\ 5 & 6 & 7 & 8 \\\\ 9 & 10 & 11 & 12 \end{bmatrix} \]
הדרך להצהיר עליה בקוד תהיה כך:
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
המטריצה מורכבת מ-3 מערכים של 4 איברים כל אחד, ולכן סדר ההצהרה הוא matrix[3][4] ולא matrix[4][3] - זהו מקור קלאסי לטעויות, הזהרו ממנו.
Note
להזכירכם, הקומפיילר מתעלם מרווחים בקוד - ההזחות והחלוקה לשורות היא למען קריאות הקוד עבור המתכנת ואין לה משמעות פרקטית. המשמעות החשובה היא פתיחת סוגריים מסולסלים
{}לאתחול המערך הכוללmatrix, ואז בתוכו אתחול כך מערך כשורה עם{}משל עצמו. ההצהרה לעיל שקולה לחלוטין ל-:
int matrix[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
אין הגבלה למספר המימדים שמערך יכול לקבל:
int multidim_array[5][4][99][205][10];
דוגמא: כתבו תוכנית שמחברת ומכפילה 2 מטריצות וכותבת את התוצאה לתוך מטריצה שלישית, כאשר גדלי המטריצות הם 10x10.
#define SIZE 10
int main() {
int A[SIZE][SIZE], B[SIZE][SIZE], C[SIZE][SIZE];
// Matrix addition
for(int i = 0; i < SIZE; i++) {
for(int j = 0; j < SIZE; j++) {
C[i][j] = A[i][j] + B[i][j];
}
}
// Matrix multiplication
for(int i = 0; i < SIZE; i++) {
for(int j = 0; j < SIZE; j++) {
for(int k = 0; k < SIZE; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
}