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

Let's learn C

פונקציות

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


נראה תוכנית שלוקחת חמישה תלמידים – בודקת מה הממוצע שלהם ולאחר מכן בודקת כמה תלמידים נמצאים מעל הממוצע, מתחת לממוצע ובדיוק על הממוצע: אז מה יש לנו פה ? הרבה קוד לא קריא ולא נוח לעבודה

CODE 1:
#include <stdio.h>
void main()
{
  double studentGrades[] = {100 , 90 , 80 , 70 , 60};
  double avg;
  int i,moreThanAvg = 0 , lessThanAvg = 0 , onTheAvg = 0;
  avg = studentGrades[0] + studentGrades[1] + studentGrades[2] + studentGrades[3] + studentGrades[4];
  avg = avg/5;
  for ( i=0 ; i < 5 ;i++)
  {
    if(avg < studentGrades[i])
    {
      lessThanAvg++;
    }
    else if(studentGrades[i] < avg)
    {
      moreThanAvg++;
    }
    else
    {
      onTheAvg++;
    }
  }
  printf("amount of students with higher grades than avg is: %d\n", moreThanAvg);

  printf("amount of students with lower grades than avg is: %d\n", lessThanAvg);

  printf("amount of students with same grades as the avg is: %d\n", onTheAvg);

}

דוגמה איך אפשר לעשות את זה קצת יותר פשוט לקריאה:


CODE 2:
#include <stdio.h>
double calculateAvg(int *arr , int sizeOfArr);
void fillAnArrayWithDetails(int *OriginalArr, int sizeOfArr , int *res, double avg);
void printRes(int *res);
      
void main()
{
  double studentGrades[] = {100 , 90 , 80 , 70 , 60};// declaring an array variable.
  int res[] = {0,0,0}; // declaring an array variable
  int i ,moreThanAvg = 0 ,lessThanAvg = 0 ,onTheAvg = 0;
  double avg = calculateAvg(studentGrades ,5); // Calculating the avg.
  fillAnArrayWithDetails(studentGrades ,5 ,res ,avg); // filling our res array with values.
  printRes(res);// printing values inside res.
}


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

CODE 2 - CONTINUED:
double calculateAvg(double *arr,int sizeOfArr)
{
  double avg = 0;
  int i;
  for( i=0; i < sizeOfArr ;i++)
  {
    avg += arr[i];
  }
  avg = avg/sizeOfArr;
  return avg;
}
void fillAnArrayWithDetails(int *originalArr, int sizeOfArr , int *res, double avg)
{
  int i;
  for(i=0; i < sizeOfArr; i++)
  {
    if( avg < originalArr[i])
    {
      res[0]++;
    }
    else if(originalArr [i] < avg)
    {
      res[1]++;
    }
    else
    {
      res[2]++;
    }
  }
}
void printRes(int *res)
{
  printf("amount of students with higher grades than avg is: %d\n", res[1]);

  printf("amount of students with lower grades than avg is: %d\n",  res[0]);
  
  printf("amount of students with same grades as the avg is: %d\n", res[2]);

}

יתרונות:



חסרונות:


דגשים שחשוב לדעת בעבודה עם פונקציות:

למשל:

CODE 3:
#include <stdio.h>
int avg(int *arr , int sizeOfArr); // Before main function.
void main()
{
  //code
}
int avg(int *arr , int sizeOfArr)
{
  //code
}

למשל:

CODE 4:
#include <stdio.h>

void printMsg(char *s1);

int returnSumNumbers(int *arr , int sizeOfArr);

double returnSum(double *arr , int sizeOfArr);