העברת מערכים לפונקציות
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C של Coddy. שיעור 29 מתוך 63.
כשמעבירים מערך לפונקציה ב-C, משהו מעניין קורה מאחורי הקלעים. המערך עצמו לא מועתק למעשה לפונקציה. במקום זאת, מה שמועבר הוא מצביע לאיבר הראשון במערך.
המשמעות היא שכאשר כותבים פרמטר של פונקציה כמו int arr[] או int *arr, שניהם שקולים — שניהם מייצגים מצביע לאיבר הראשון במערך. הפונקציה מקבלת את כתובת הזיכרון שבה המערך מתחיל, וכך מקבלת גישה ישירה לנתונים של המערך המקורי.
void printArray(int arr[], int size) {
// arr הוא למעשה מצביע לאיבר הראשון
// הפונקציה יכולה לגשת למערך המקורי ולשנות אותו
}מכיוון שהפונקציה פועלת עם מיקום הזיכרון של המערך המקורי ולא עם עותק, כל שינוי שיבוצע בתוך הפונקציה ישפיע על המערך המקורי. זה שונה מהעברת משתנים בודדים, שיוצרת עותקים.
כמו כן, תבחינו שעליכם להעביר את גודל המערך כפרמטר נפרד, מפני שהפונקציה אינה יכולה לקבוע את אורך המערך מהמצביע בלבד.
אתגר
קלכתבו תוכנית ב-C שמדגימה העברת מערכים לפונקציות באמצעות יצירת פונקציה שמעבדת נתוני טמפרטורה. התוכנית שלכם צריכה:
- ליצור פונקציה בשם
analyzeTemperaturesשמקבלת מערך של מספרים שלמים ואת גודלו כפרמטרים - בתוך הפונקציה
analyzeTemperatures, לחשב ולהדפיס את הטמפרטורה הממוצעת עם ספרה אחת בדיוק אחרי הנקודה העשרונית, בפורמט:Average temperature: [value] - בתוך הפונקציה
analyzeTemperatures, למצוא ולהדפיס את הטמפרטורה הגבוהה ביותר בפורמט:Highest temperature: [value] - בתוך הפונקציה
analyzeTemperatures, לספור כמה טמפרטורות גבוהות מ-25 מעלות ולהדפיס את הספירה בפורמט:Days above 25 degrees: [count] - בפונקציה
main, לקרוא מספר שלםnשמייצג את מספר מדידות הטמפרטורה - לקרוא
nערכי טמפרטורה ולאחסן אותם במערך של מספרים שלמים - לקרוא לפונקציה
analyzeTemperatures, ולהעביר לה את המערך ואת גודלו
התוכנית שלכם צריכה לעבד את נתוני הטמפרטורה ולהציג את תוצאות הניתוח. לדוגמה, אם הקלט הוא:
5
20 28 15 32 26הפלט שלכם צריך להיות:
Average temperature: 24.2
Highest temperature: 32
Days above 25 degrees: 3האתגר הזה מדגים כיצד מערכים מועברים לפונקציות כמצביעים לאיבר הראשון שלהם, וכך הפונקציה יכולה לגשת לכל האיברים במערך המקורי ולעבד אותם בלי ליצור עותק.
נסו בעצמכם
#include <stdio.h>
// TODO: צרו כאן את הפונקציה analyzeTemperatures
int main() {
// קראו את מספר מדידות הטמפרטורה
int n;
scanf("%d", &n);
// הכריזו על מערך לאחסון הטמפרטורות
int temperatures[n];
// קראו את ערכי הטמפרטורה
for (int i = 0; i < n; i++) {
scanf("%d", &temperatures[i]);
}
// TODO: קראו כאן לפונקציה analyzeTemperatures
return 0;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1יסודות המצביעים
מהו מצביע?הכרזה על מצביעיםאופרטור לקיחת הכתובת (&)אופרטור ביטול ההפניה (*)מצביעי NULLסיכום: יסודות המצביעים2מצביעים ומערכים
שמות מערכים כמצביעיםאיברי מערך ומצביעיםאריתמטיקה של מצביעיםהשוואת מצביעיםסיכום: מעבר על מערך באמצעות מצביעים5מצביעים ופונקציות
העברה לפי ערךהעברת מצביעים לפונקציותשינוי משתנים באמצעות מצביעיםדוגמה קלאסית: החלפההעברת מערכים לפונקציותחזרה: ארגומנטים של מצביעי פונקציה3מערכי תווים ומחרוזות
מחרוזות כמערכי charתו הסיום nullקלט מחרוזת באמצעות scanfשימוש ב־strlen()שימוש ב־strcpy()שימוש ב־strcat()שימוש ב־strcmp()סיכום: פונקציות מחרוזת בסיסיותתרגלו בעצמכם: קומפיילר C אונליין