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

שימו לב שהגישה לערכים בתוך המערך הדו ממדי מאוד דומה למערך רגיל.
למשל:
הערך במקום [3][0] הוא 1.
הערך במקום [2][2] הוא 9.
הערך במקום [1][3] הוא 87.
הערך במקום [1][2] הוא 8.
חשוב לציין שכמו בנושא מערכים גם מערכים דו ממדים יכולים להיות סטטיים או דינמיים.
נראה דוגמה ליצירת מערך סטטי:
בדרך זו יצרנו מערך בגודל 4 על 4.
כלומר, כמות התאים במערך שלנו תהיה 16.
#include <stdio.h>
void main()
{
int arr[4][4];
}
נראה דוגמה ליצירת מערך דינמי:
שימו לב שפה אנו משתמשים במצביע כפול (כלומר דאבל-פוינטר).
לאחר יצירת המצביע הכפול, אנו עושים הקצאה דינאמית ראשונה שיוצרת לנו מערך של מצביעים.
לכל אחד מהמצביעים במערך אנו עושים הקצאה דינאמית ובכך משיגים מערך שמכיל בתוכו מערכים.
הערה: ניתן להשתמש בcalloc במקום malloc ובכך לדאוג שהמערך יהיה מאופס.
#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);
}
}
נניח שנרצה לחשב את הסכום כל ערכי המערך נוכל לעשות זאת באמצעות לולאה דו ממדית:
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;
}
הדפסה של כל איברי המערך תתבצע בצורה הבאה:
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");
}
}