Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Studies

מערכים רב-מימדיים

כפי שהגדרנו רשימה של משתני int ע״י מערך {...} = []int arr, ניתן לייצר מערכים שכל איבר בהם הוא מערך בפני עצמו - מערכים רב-מימדיים.

למשל, נניח שיש קבוצה של 50 סטודנטים ושכל אחד מהם לוקח 3 קורסים. ניתן לחשוב על כל ציון של סטודנט בתור בתור איבר עם שני אינדקסים - אחד עבור מספר הקורס והשני עבור מספר הסטודנט. הדרך להגדיר מערך דו-מימדי מסוג כזה דומה מאוד להגדרת מערך חד-מימדי:

#define NUM_COURSES 3
#define NUM_STUDENTS 50
int grades[NUM_COURSES][NUM_STUDENTS];

זו דוגמא למערך דו-מימדי:

  1. המשתנה grades הוא מערך של מערכי int.
  2. המשתנה grades[i] הוא מערך של משתני int.
  3. המשתנה 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];
            }
        }
    }
}