Professional Documents
Culture Documents
פרק 6
פונקציות Functions
#include <stdio.h>
void main()
{
int grade;
Do
{
printf(“Enter your grade (0-100) \n”);
scanf(“%d”, &grade);
}while((grade<0)||(grade> 100));
printf(“You entered legal grade!!!”);
}
SCE-Chapter-6-Functions Shayke Bilu PhD
?מה עושה התוכנית הבאה
9
בעיות:
חזרה על קטע קוד כמעט זהה 3פעמים.
אם היו יותר מחוברים היה צריך לחזור עליו יותר פעמים.
התכנית מתארכת ונהיית מסורבלת.
מקור לבאגים וטעויות .copy / paste
מה היינו רוצים?
לכתוב פעם אחת בלבד את הקוד שחוזר על עצמו.
להשתמש בקוד מספר פעמים אבל בעזרת נתונים שונים כל פעם.
פונקציה:
קטע קוד שיש לו שם.
יכולה לקבל ערכי קלט לתוך משתנים.
יכולה להחזיר ערך פלט יחיד.
יכולה להכיל כל פקודה כמו בתוכנית ראשית
יתרונות:
אפשר להשתמש הרבה פעמים עם קלטים שונים
לדוגמא.printf(), scanf() :
מקצרת תוכניות – הופך אותן ליותר קריאות
חוסכת טיפול בבאגים -כותבים פעם אחת ,בודקים פעם אחת ...
משתמשים הרבה פעמים.
שימושים
הגדרת פונקציות
קריאה לפונקציה
שליחת ערך לפונקציה
קבלת ערך המוחזר ממנה
הגדרת משתנים בפונקציות (משתנים לוקאליים)
הכרזות על פונקציות וספריות של פונקציות
בתוכניות אחרות
יש כבר ספריות מוכנות כאלה ב ,C -כמו .stdio.h •
שם הפונקציה:
אותם כללים כמו בחירת שם של משתנה.
לא יכול להכיל סימנים כמו ... %$*-+
חייב להתחיל באות ולא במספר.
אסור להשתמש במילים שמורות של השפה.
מומלץ ששם הפונקציה יהיה תמיד שם בעל משמעות:
max
sort
getNumbers
SCE-Chapter-6-Functions 26 Shayke Bilu PhD
משתני קלט
27
משתני הקלט:
מוגדרים בהגדרת הפונקציה.
יש להם שם וטיפוס (כמו משתנים רגילים).
מוכרים אך ורק על ידי הפונקציה.
) int max( int val1, int val2
?שאלות
קריאות לפונקציה
)(int main
{
;)double solution=power(4,2)+power(3,3)+ power(2,5
;)printf(“4^2 + 3^3 + 2^5 = %.2lf", solution
;return 0
} קריאה לפונקציה:
פקודה המתבצעת ברצף הפקודות של התוכנית.
ניתן לקרוא לפונקציה גם מתוך פונקציה אחרת.
חייבים להעביר לפונקציה ערכים בהתאם להגדרת הפונקציה.
בסיום ריצת הפונקציה ,חוזרים למקום שממנו היא הופעלה.
SCE-Chapter-6-Functions 29 Shayke Bilu PhD
קריאה לפונקציה
30
קריאות לפונקציה
)(int main
{
;)double solution=power(4,2)+power(3,3)+ power(2,5
;)printf(“4^2 + 3^3 + 2^5 = %.2lf", solution
;return 0
}
מהלך הביצוע של הפונקציה:
.1מבוצע החישוב הראשון ומחוזרת התוצאה42 = 16 :
33 = 27 .2מבוצע החישוב השני ומוחזרת התוצאה:
.3מבוצע החישוב השלישי ומוחזרת התוצאה25 = 32 :
SCE-Chapter-6-Functions 30 Shayke Bilu PhD
הערך המוחזר
31
טיפוס הערך המוחזר:
אם הפונקציה לא מחזירה ערכים ,אז הטיפוס הוא .void
)(void print_help
כאשר הפונקציה מחזירה ערך שונה מ:void-
צריכה להתבצע פקודת returnשבה יוחזר ערך מהטיפוס המתאים.
פונקציית :main
כל תוכנית בשפת Cמכילה פונקציה בשם .main
זו הפונקציה הראשית שבה התוכנית מתחילה.
הפונקציה (התוכנית) מופעלת ע"י מערכת ההפעלה.
הערך המוחזר של :main
מועבר למערכת ההפעלה.
טיפוסו צריך להיות ( intאו .)void
אם ערכו 0המשמעות היא שהתוכנית הסתיימה באופן תקין.
main יכולה גם לקבל ערכים ממערכת ההפעלה
ולהפעיל פונקציות בתוך התוכנית או בתוך הפרויקט.
SCE-Chapter-6-Functions 34 Shayke Bilu PhD
פונקציות – סיכום ביניים
35
?שאלות
משתנים בפונקציה:
מוכרים אך ורק בפונקציה הזאת (ב scope-שלה).
לא מוכרים בפונקציות אחרות (גם לא ב.)main-
כולל גם את משתני הקלט.
#include <stdio.h>
double power(double base, int exponent)
{
int sum; אפשר להגדיר בפונקציות
double result=1; שונות משתנים באותו שם
for(sum=1; sum<=exponent; sum++)
result=result*base;
return result;
} למרות ששני המשתנים זהים בשמם
int main()
{ !אין כל קשר בין המשתנים
double sum=power(4,2)+power(3,3)+power(2,5);
printf(“4^2 + 3^3 + 2^5= %.2lf”, );i
return 0;
}
int main()
זו התוכנית הראשית המפעילה את שתי הפונקציות
}
int number;
printf("Enter number\n");
scanf("%d",&number);
printf(“Sum digits is %d\n",sumdig(number));
printf(“Digits count is %d\n",count(number));
return 0;
{
SCE-Chapter-6-Functions Shayke Bilu PhD
משתנים גלובליים
44
משתנים גלובליים:
אפשר להגדיר משתנים בתחילת הקובץ ,ללא שייכות לפונקציה
מסוימת
הם יהיו מוגדרים ,מוכרים ופעילים בכל הפונקציות שמופיעות
בקובץ התוכנית.
לא תמיד מומלץ !!!
עלול ליצור באגים (שינויים בפונקציה אחת משפיעים בטעות
על פונקציה אחרת)
פוגע בהפרדה הלוגית בין הפונקציות.
מתכון לטעויות מתמשכות שקשות לאיתור.
SCE-Chapter-6-Functions Shayke Bilu PhD
45
?שאלות
>#include <stdio.h
הפונקציה מוכרזת מיד
;)(void get_digit לאחר הגדרת הספריות
)(int main
} התוכנית הראשית קוראת לפונקציה לביצוע:
;)(get_digit
;return 0
{
?שאלות
#include <stdio.h>
#include <math.h>
void main ()
}
double shoresh, mispar;
printf(“Enter number:\n”);
scanf(“%lf”,&mispar);
shoresh=sqrt(mispar);
printf("The square root of %.2lf is:
%.2lf\n",mispar,shoresh);
{
#include <stdio.h>
#include <math.h>
void main()
}
double mispar, power;
printf(“Enter number:\n”);
scanf(“%lf”,&mispar);
power=pow(mispar,2);
printf(“The power of %.2lf is: %.2lf\n“
,mispar,power);
{
SCE-Chapter-6-Functions Shayke Bilu PhD
יצירת מספרים אקראיים ע"י )(rand
64
הפקודה :rand
מבצעת שליפה של מספר אקראי בכל פעם שהיא מופעלת.
צורת הכתיבהrand()%number :
הפקודה תציג את המספר האקראי בין 0למספר הנמצא אחרי
סימן ה .% -זהו לא באמת מספר אקראי כי הוא מבוסס שעון.
דוגמאות ran=rand()%10; :המספרים האקראיים בין 0
ל 10 -יכנסו למשתנה ranבכל הפעלה של הפקודה
ran=rand()%500; המספרים האקראיים בין 0ל500 -
יכנסו למשתנה ranבכל הפעלה של הפקודה
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main ()
}
int i;
//100 - ל0 מספרים אקראיים בין10 דוגמה להדפסת
srand(time(NULL));
for(i=0;i<10;i++)
printf("%d\n",rand()%100);
{
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
int k;
srand(time(NULL));
for (k=0; k<5; k++ )
printf("%d\n",rand() % 46 + 5);
for (k=0; k<5; k++ )
printf("%.3lf\n",
(double) rand() / RAND_MAX);
}
SCE-Chapter-6-Functions Shayke Bilu PhD
פונקציית ניקוי המסך – )”system(“cls
71
האפשרות להציג מסך חדש בכל פעם שיש צורך ניתנת למימוש ע"י
פונקציה הנקראת ;)” system(“clsהפונקציה נמצאת בספריה
. stdlib.hיש להוסיף את הספרייה לפני תחילת התוכנית מיד אחרי ה-
>#include <stdio.h
לדוגמה:
>#include <stdio.h
>#include <stdlib.h
דוגמה לשימוש בפונקציה:
;)”system(“cls
המסך ינוקה לאחר הפעלת הפונקציה.
SCE-Chapter-6-Functions Shayke Bilu PhD
תוכנית המדגימה שימוש בניקוי מסך
72
#include <stdio.h>
#include <stdlib.h>
void main()
{
int mark=0,i=0,sum=0; double average;
printf("Enter mark, for exit enter negative:\n");
scanf("%d",&mark);
while(mark>=0)
{
sum+=mark; printf("Enter mark:\n");
scanf("%d",&mark); i++;
system("CLS");
}
average=sum * 1.0 / i * 1.0;
printf(“Average is: %.2lf sum=%d i=%d\n",average, sum, i);
}
SCE-Chapter-6-Functions Shayke Bilu PhD
תרגילי כיתה
73