שפת C/פונקציות: הבדלים בין גרסאות בדף

תוכן שנמחק תוכן שנוסף
שורה 47:
}
</source>
 
==הגדרת פונקציה==
על מנת להגדיר פונקציה, יש לכתוב:
<source lang = "c">
<return_type> <function_name>(<arguments>)
{
<body>
}
</source>
כאשר:
*return_type הוא סוג הערך המוחזר מהפונקציה (אם לא רוצים שהפונקציה תחזיר אף משתנה, כותבים void כטיפוס המשתנה).
*function_name הוא שם הפונקציה.
*arguments הם ''ארגומנטים'', כלומר משתנים שערכם נקבע מחוץ לפונקציה.
*body הוא הפקודות המתבצעות כשהפונקציה נקראת.
 
 
מייד לאחר שם הפונקציה צריכים להופיע סוגריים שבהם תכתב רשימת הפרמטרים שהפונקציה תקבל. גם אם הפונקציה לא מקבלת פרמטרים עדיין יש לכתוב את הסוגריים. לאחר הסוגריים ייפתחו סוגריים מסולסלים שמציינים את תחילת קטע הקוד של הפונקציה, ובסוף הפונקציה יופיעו סוגריים מסולסלים נוספים שסוגרים אותה.
 
בגוף הפונקציה אפשר לכתוב כל רצף פקודות שכבר ראינו. אם הפונקציה מחזירה ערך, צריך לכתוב בגוף הפונקציה:
<source lang = "c">
return <value>;
</source>
כאשר value הוא הערך. אם הפונקציה אינה מחזירה ערך, אז אפשר לכתוב בכל קטע
<source lang = "c">
return;
</source>
דבר שיגרום ליציאה מהפונקציה.
 
===דוגמאות===
 
====פונקציה עם ערך מוחזר====
הנה הפונקציה הממירה מספר נקודה-צפה המתאר טמפרטורה ב-Celsius לטמפרטורה ב-Fahrenheit:
<source lang = "c">
float celsius_to_fahrenheit(float celsius)
{
return 1.8 * celsius + 32;
}
</source>
הפונקציה מקבלת משתנה מסוג מספר נקודה-צפה ששמו celsius, ומחזירה מספר נקודה-צפה.
 
====פונקציה בלי ערך מוחזר====
הנה פונקציה המדפיסה את התרגום למעלות Fahrenheit של מעלות ה-Celsius בערכים {{משמאל לימין|0, 4, 8, ..., 40}}:
<source lang = "c">
void print_conversion_table()
{
int c, f;
 
for(c = 0; c <= 40; c += 4)
{
f = 1.8 * c + 32;
printf("%d in Celsius is %d in Fahrenheit\n", c, f);
}
}
</source>
פונקציה זו איננה מקבלת אף פרמטר, ו(בלי שום קשר) גם אינה מחזירה אף ערך. אפשר לראות שאינה מחזירה אף ערך ע"י כך שהיא מוגדרת כמחזירה void, שהוא טיפוס מיוחד שמשמעו שאין ערך מוחזר.
 
{{הארה|1 = בשפת C משמשת {{מונח|המילה השמורה|מילה מוגדרת בשפה}} void גם במשמעות שונה לחלוטין, שאותה נראה ב[[שפת C/מצביעים#מצביעים לvoid|מצביעים ל-void]]. אין להתבלבל בין שתי משמעויות נפרדות אלה - הן שונות זו מזו.}}
 
====פונקציה בלי ערך מוחזר ופקודת יציאה מפורשת====
נניח שהחלטנו לשאול את המשתמש האם להדפיס את טבלת ההמרות, ואם המשתמש יקליד את התו 'n', לא נדפיס כלום.. נוכל לכתוב זאת כך:
<source lang = "c">
void print_conversion_table_if_needed()
{
int c, f;
char reply;
printf("Print out conversion table?");
scanf("%c", &reply);
if(reply == 'n')
return;
 
for(c = 0; c <= 40; c += 4)
{
f = 1.8 * c + 32;
printf("%d in Celsius is %d in Fahrenheit\n", c, f);
}
}
</source>
בפונקציה הקודמת, נשים לב לשורות:
<source lang = "c">
if(reply == 'n')
return;
</source>
הפקודה return גורמת ליציאה מהפונקציה (בלי ערך מוחזר בפונקציה זו). אם הפקודה מתבצעת, אז שאר הפקודות עד סוף הפונקציה אינן מתבצעות.
 
==פונקציות שכבר ראינו==