× מי אנחנו? התוכנית הראשונה משתנים קלט ופלט אופרטורים חשבוניים משפטי בקרה לולאות לולאות דו ממדיות casting sizeof typedef פונקציות רקורסיות מצביעים מצביע כפול מערכים מערכים דינאמיים מערכים דו ממדים מחרוזות חיפוש בינארי מיון בועות מיון בחירה מיון הכנסה מיון מהיר מיון מיזוג

Lets learn C

מערכים דו ממדים (מטריצות)

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

table

שימו לב שהגישה לערכים בתוך המערך הדו ממדי מאוד דומה למערך רגיל. למשל:
הערך במקום [3][0] הוא 1.
הערך במקום [2][2] הוא 9.
הערך במקום [1][3] הוא 87.
הערך במקום [1][2] הוא 8.

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

נראה דוגמה ליצירת מערך סטטי:
בדרך זו יצרנו מערך בגודל 4 על 4.
כלומר, כמות התאים במערך שלנו תהיה 16.

CODE 1: static array declaration
#include <stdio.h>
  void main()
  {
    int arr[4][4];
  }

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

CODE 2: dynamic array declaration
#include <stdio.h>
  void main()
  {
    int rows, cols;
    int **arr; //double pointer declaration

    printf("enter amount of rows: ");
    scanf("%d",&rows);

    printf("enter amount of cols: ");
    scanf("%d",&cols);

    // first allocation - array of pointers
    arr = (int**)malloc(sizeof(int*) * rows);

    for(int i=0; i<rows; i++)
    {
      // each one of the pointers points towards an array.
      arr[i] = (int*)malloc(sizeof(int) * cols);
    }
  }

נניח שנרצה לחשב את הסכום כל ערכי המערך נוכל לעשות זאת באמצעות לולאה דו ממדית:

CODE 3: sum matrix values
int returnSum(int **arr, int rows, int cols)
{
  int i=0 ,j=0 ,sum=0;

  for(i=0; i < rows; i++)
  {
    for(j=0; j < cols; j++)
    {
      sum += arr[i][j]; 
    }
  }
  return sum;
}

הדפסה של כל איברי המערך תתבצע בצורה הבאה:

CODE 4: print matrix values
 void printMat(int **arr ,int rows ,int cols)
{
  int i = 0 ,j = 0;

  for(i=0; i < rows; i++)
  {
    for(j=0; j < cols; j++)
    {
      printf("%d " , arr[i][j]);     
    }
    printf("\n");
  }
}