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

Let's learn C

מערכים

מערך הוא מבנה נתונים שביכולתו לאסוף הרבה מאוד נתונים מאותו הסוג באותו המקום.
נראה דוגמה למתי נוח לנו לעבוד עם מערך:
עלינו ליצור תוכנה שבה יש כיתה שלמה של סטודנטים שמהם אנחנו קולטים ציון ומחזירים ממוצע כיתתי.
כדי לעשות זאת עלינו ליצור כ-30 תלמידים, לעשות קליטה של כ-30 ציונים ולאחר מכן לחשב את הממוצע ולהחזיר אותו:
CODE 1:
#include <stdio.h>
double return_sum()
{
  double student1 , student2 , student3 , … , student30;
  //for visual studio 2017 or above use scanf_s
  scanf("%lf", &student1); scanf("%lf", &student2); … scanf("%lf", &student30);  
  double sum = (student1 + … + student30) / 30;
  return sum;
}

כרגע קיצרנו קצת את הדוגמה אבל כמובן שכדי לעשות זאת עלינו באמת לרשום 30 משתנים, לבצע 30 קליטות ולאחר מכן לחשב את הממוצע ולהחזירו, מדובר בהרבה מאוד קוד שממש חוזר על עצמו.
ניתן לעשות זאת ביותר קלות ע"י שימוש במערך בצורה הבאה:
CODE 2:
#include <stdio.h>
double return_sum()
{
  int i;
  double students_array[30] , sum = 0;
  for ( i = 0; i < 30; i++ )
  {
    //for visual studio 2017 or above use scanf_s
    scanf_s("%lf",students_array[i]);
    sum += students_array[i];
  }
  return (sum/30);
}

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

  1. מערך בגודל 5 (שלא אמרנו מה גודלו במהלך ההצהרה אלא רק הכנסנו את האיברים שלו).
    int arr[] = {1,2,3,4,5};
  2. מערך בגודל 3 שבו הכנסנו ערכים לשני האיברים הראשונים, באיבר השלישי הערך יהיה שווה ל-0.
    double arr[3] = {1,2};
  3. מערך בגודל 20 שכל אבריו מאופסים.
    double zeroArr[20] = {0};

איך ניגשים לאיבר במערך?

לאחר יצירת המערך אנו נעבוד בעזרת מספר / משתנה שישמש אותנו כאינדקס המצביע על האזור במערך שעליו אנחנו רוצים לעבוד.
הספירה שלנו במערכים (ובתכנות באופן כללי) מתחיל מ-0 , כך שהאיבר במקום הראשון במערך שלנו יקרא האיבר במקום ה0.

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

CODE 3:
#include <stdio.h>
void main()
{
  int arr[5] = {1,2,3,4,5}; // Before
  arr[4] = 8; 
  // After, the array will look like that: {1,2,3,4,8}
}

ניתן גם לגשת בצורה הבאה:

CODE 4:
#include <stdio.h>
void main()
{
  int arr[5] = {1,2,3,4,5}; // Before
  *(arr+4) = 8;
  // After, the array will look like that: {1,2,3,4,8}
}
בקוד 3 ניגשנו לאיבר החמישי בתוך המערך בעזרת הסוגריים המרובעים ושינינו את הערך שלו.
בקוד 4 לקחנו את המערך (שמצביע תמיד על האיבר הראשון) והלכנו ארבעה צעדים קדימה לסופו ושם שינינו את הערך (כלומר 1 + 4 = 5 , ניגשנו לאיבר החמישי במערך).

יתרונות במערך סטטי:

  1. עשוי לחסוך לנו הרבה מאוד זמן ביצירת משתנים (למשל כמו בדוגמה הראשונה,
    30 משתנים בעלי אותו התפקיד – נכנסים טוב בתוך מערך יחיד בגודל 30).
  2. הופך את הקוד לקריא יותר (משתנה אחד , קצר מ30 משתנים).
  3. הגישה אליו מאוד נוחה, רק צריך לגשת באמצעות אינדקס מספרי.

חסרונות במערך סטטי:

  1. מגדירים פעם אחת את הגודל, לא ניתן לשנות אותו לאחר מכן (כלומר אם היו לנו 30 תלמידים בכיתה ולפתע הכיתה גדלה ל31 אין לנו אופציה להשתמש במערך הקיים).