Let's learn C
פונקציות
פונקציות זו שיטה לחלק את הקוד שלנו לחלקים קטנים וקריאים יותר.
עיקרון ששווה ליישם בתור מתכנתים זה לנסות לדאוג שהקוד שלנו יהיה מחולק בצורה טובה לחתיכות קטנות יותר ובעצם לחבר את
הכל
בסוף.
פונקציות מאוד נוחות לעבודה משום שהן עוזרות לנו לכתוב פחות קוד מיותר.
נראה תוכנית שלוקחת חמישה תלמידים – בודקת מה הממוצע שלהם ולאחר מכן בודקת כמה תלמידים נמצאים מעל הממוצע, מתחת לממוצע ובדיוק על הממוצע: אז מה יש לנו פה ? הרבה קוד לא קריא ולא נוח לעבודה
#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);
}
דוגמה איך אפשר לעשות את זה קצת יותר פשוט לקריאה:
#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.
על ידי חלוקה נכונה לפונקציות ניתן לדבר את הקוד בצורה טובה ומהירה יותר
(אנו יכולים להריץ העזרת הדיבגר
ולהבין באיזה פונקציה התוצאה המתקבלת היא לא רצויה.
בצורה זו ניתן להבין איזה חלק בקוד יש לתקן).
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]);
}
יתרונות:
- כתבנו הרבה פחות קוד ב main והפכנו את הכל לנקי ומסודר יותר. רוב הפונקציות שכתבנו יכולות לעבוד ליותר מקרים מאשר אם היינו כותבים הכל ב main.
חסרונות:
- הפונקציה יכולה לחזיר רק ערך יחיד
דגשים שחשוב לדעת בעבודה עם פונקציות:
-
הצהרת הפונקציה צריכה להיות מעל פונקציית ה main.
הכוונה היא שאם אנחנו רוצים לרשום למשל פונקציה שמחשבת ממוצעים אז צריך להצהיר עליה לפני שהצהרנו על ה main שלנו ז"א לרשום למשל:
avg(int *arr , int sizeOfArr);
ניתן לרשום את כל הקוד של הפונקציה לפני הmain , אבל נהוג לרשום את כך.
למשל:
#include <stdio.h>
int avg(int *arr , int sizeOfArr); // Before main function.
void main()
{
//code
}
int avg(int *arr , int sizeOfArr)
{
//code
}
-
מתי נשתמש בפונקציות ?
אם יש לנו יותר מידי קוד ודברים הופכים להיות קצת לא קריאים.
אם יש לנו הרבה מידי קוד שחוזר על עצמו.
באופן כללי כדאי לנסות לרשום את כל הקוד בפונקציות ורק לאחר מכן לחבר דברים ב main. -
איך נראית הצהרת הפונקציה שלנו ?
nameOfTheFunction (What the function receives);
Variable/void= איזה משתנה הפונקציה שלנו מחזירה או void אם היא לא מחזירה כלום.
nameOfTheFunction = שם הפונקציה – רצוי שתהיה ברורה.
(What the function receives);= אילו משתנים הפונקציה מקבלת ?
למשל:
#include <stdio.h>
void printMsg(char *s1);
int returnSumNumbers(int *arr , int sizeOfArr);
double returnSum(double *arr , int sizeOfArr);