Menu
Coddy logo textTech

העברת פונקציות כארגומנטים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 מפיקה תוצאות שונות בהתאם לפונקציה שאנחנו מעבירים לה. הדפוס הזה הוא בסיסי לכתיבת קוד גמיש וניתן לשימוש חוזר. כותבים את המבנה פעם אחת, והמשתמשים בפונקציה שלכם מספקים את הלוגיקה הספציפית שהם צריכים.

challenge icon

אתגר

קל

כתבו פונקציה apply_twice שמקבלת שני מספרים שלמים וקוד פעולה, מחילה את הפעולה על המספרים פעמיים ברצף ומחזירה את התוצאה הסופית.

הפונקציה שלכם תקבל קוד פעולה שקובע באיזו פעולה להשתמש. עליכם להגדיר את פונקציות הפעולה בתוך הפתרון שלכם ולהעביר אותן לפונקציית עזר compute שמקבלת מצביע לפונקציה.

הערה: נדרשות רק הפונקציות. הבדיקות קוראות ישירות ל־apply_twice ובודקות את הערך שהיא מחזירה, לכן אל תקראו קלט ואל תדפיסו דבר.

מבנה נדרש:

  • הגדירו typedef בשם Operation עבור מצביע לפונקציה שמקבלת שני פרמטרים מסוג int ומחזירה int
  • הגדירו שתי פונקציות פעולה: add (מחזירה a + b) ו־multiply (מחזירה a * b)
  • הגדירו פונקציה בשם compute שמקבלת שני מספרים שלמים ומצביע לפונקציה מסוג Operation, ואז מחזירה את תוצאת הקריאה לפעולה
  • בתוך apply_twice, בחרו את הפעולה המתאימה לפי הקוד, ואז השתמשו ב־compute פעמיים: תחילה עם המספרים המקוריים, ואז עם התוצאה והמספר השני שוב

לוגיקה:

  1. בחרו את פונקציית הפעולה לפי op_code (1 = חיבור, 2 = כפל)
  2. קראו ל־compute(a, b, operation) כדי לקבל תוצאת ביניים
  3. קראו ל־compute(intermediate, b, operation) כדי לקבל את התוצאה הסופית
  4. החזירו את התוצאה הסופית

פרמטרים:

  • 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) {
    // כתבו כאן קוד
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר C אונליין