העברת פונקציות כארגומנטים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 36 מתוך 61.
אחד השימושים העוצמתיים ביותר במצביעי פונקציות הוא העברתם כארגומנטים לפונקציות אחרות. כך אפשר להוסיף התנהגות מותאמת אישית לפונקציה בלי לשנות את הקוד שלה: טכניקה שנקראת לפעמים callback.
נבחן פונקציה שמבצעת חישוב על שני מספרים. במקום לקבע את הפעולה בקוד, אפשר לקבל מצביע לפונקציה שמגדיר איזו פעולה לבצע:
typedef int (*Operation)(int, int);
int compute(int a, int b, Operation op) {
return op(a, b);
}הפונקציה compute לא יודעת אם היא מחברת, מחסרת או עושה משהו אחר לגמרי. היא פשוט קוראת לפונקציה שמועברת אליה:
int add(int a, int b) { return a + b; }
int multiply(int a, int b) { return a * b; }
int main() {
printf("%d\n", compute(5, 3, add)); // פלט: 8
printf("%d\n", compute(5, 3, multiply)); // פלט: 15
return 0;
}שימו לב כיצד אותה פונקציה compute מפיקה תוצאות שונות בהתאם לפונקציה שאנחנו מעבירים לה. הדפוס הזה הוא בסיסי לכתיבת קוד גמיש וניתן לשימוש חוזר. כותבים את המבנה פעם אחת, והמשתמשים בפונקציה שלכם מספקים את הלוגיקה הספציפית שהם צריכים.
אתגר
קלכתבו פונקציה apply_twice שמקבלת שני מספרים שלמים וקוד פעולה, מחילה את הפעולה על המספרים פעמיים ברצף ומחזירה את התוצאה הסופית.
הפונקציה שלכם תקבל קוד פעולה שקובע באיזו פעולה להשתמש. עליכם להגדיר את פונקציות הפעולה בתוך הפתרון שלכם ולהעביר אותן לפונקציית עזר compute שמקבלת מצביע לפונקציה.
הערה: נדרשות רק הפונקציות. הבדיקות קוראות ישירות ל־apply_twice ובודקות את הערך שהיא מחזירה, לכן אל תקראו קלט ואל תדפיסו דבר.
מבנה נדרש:
- הגדירו
typedefבשםOperationעבור מצביע לפונקציה שמקבלת שני פרמטרים מסוגintומחזירהint - הגדירו שתי פונקציות פעולה:
add(מחזירה a + b) ו־multiply(מחזירה a * b) - הגדירו פונקציה בשם
computeשמקבלת שני מספרים שלמים ומצביע לפונקציה מסוגOperation, ואז מחזירה את תוצאת הקריאה לפעולה - בתוך
apply_twice, בחרו את הפעולה המתאימה לפי הקוד, ואז השתמשו ב־computeפעמיים: תחילה עם המספרים המקוריים, ואז עם התוצאה והמספר השני שוב
לוגיקה:
- בחרו את פונקציית הפעולה לפי
op_code(1 = חיבור, 2 = כפל) - קראו ל־
compute(a, b, operation)כדי לקבל תוצאת ביניים - קראו ל־
compute(intermediate, b, operation)כדי לקבל את התוצאה הסופית - החזירו את התוצאה הסופית
פרמטרים:
a(int): המספר הראשוןb(int): המספר השניop_code(int): קוד הפעולה (1 לחיבור, 2 לכפל)
ערך מוחזר: התוצאה לאחר החלת הפעולה פעמיים ברצף (int)
דוגמה: כאשר a = 5, b = 3, op_code = 1 (חיבור):
- חישוב ראשון: 5 + 3 = 8
- חישוב שני: 8 + 3 = 11
- החזרה: 11
כאשר a = 2, b = 4, op_code = 2 (כפל):
- חישוב ראשון: 2 × 4 = 8
- חישוב שני: 8 × 4 = 32
- החזרה: 32
נסו בעצמכם
int apply_twice(int a, int b, int op_code) {
// כתבו כאן קוד
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4כימוס
המושג של מצביעים אטומיםהגדרת מבנים אטומיםפונקציות Get ו-Setאימות ב-Settersסיכום: הקופסה הסודית7מצביעים לפונקציות
הצהרת מצביעים לפונקציותקריאה למצביעים לפונקציותשימוש ב-typedef עבור מצביעים לפונקציותהעברת פונקציות כארגומנטיםסיכום: ניתוב במחשבון2אובייקטים ומתודות
מבנים כאובייקטיםמצביע 'Self'נכונות constמצביע לעומת ערךמתודות עזרחזרה: מנהל נקודות5פרויקט: חשבון בנק פשוט
הגדרת הפרויקטמימוש החשבוןתרגלו בעצמכם: קומפיילר C אונליין