Menu
Coddy logo textTech

מערכת אירועים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 61 מתוך 61.

challenge icon

אתגר

קל

בואו נבנה מערכת התראות: ארכיטקטורה מונחית־אירועים שבה כמה מטפלים יכולים להירשם לאירוע ולהגיב כשהוא מופעל. הדפוס הזה הוא הבסיס לתכנות תגובתי ולמסגרות עבודה של ממשקי משתמש גרפיים.

תארגנו את הקוד שלכם בשלושה קבצים:

  • event.h: הגדירו את טיפוס מצביע הפונקציה Handler, שמקבל הודעת const char*. צרו מבנה Event שמכיל מערך של עד 5 מטפלים ומונה של המטפלים הרשומים. הצהירו על פונקציות לאתחול אירוע, לרישום מטפל ולהפעלת האירוע כדי להודיע לכל הנרשמים.
  • event.c: ממשו את מערכת האירועים שלכם:
    • init_event: מקבלת מצביע ל־Event ומגדירה את מספר המטפלים ל־0
    • subscribe: מקבלת מצביע ל־Event ו־Handler, מוסיפה את המטפל למערך אם יש מקום (המספר קטן מ־5), ומגדילה את המספר
    • fire: מקבלת מצביע ל־Event ומחרוזת הודעה, ואז קוראת לכל מטפל רשום עם ההודעה הזאת, לפי סדר הרישום שלהם
  • main.c: צרו שלוש פונקציות מטפל שונות שמגיבות לאירועים בדרכים ייחודיות:
    • logger: מדפיסה [LOG] ואחריו את ההודעה
    • alert: מדפיסה [ALERT] ואחריו את ההודעה
    • counter: משתמשת במשתנה סטטי כדי לספור כמה פעמים היא נקראה, ואז מדפיסה [COUNT] X, כאשר X הוא המספר הנוכחי
    קראו מספר שלם המציין לכמה מטפלים להירשם (1, 2 או 3). רשמו את אותו מספר של מטפלים לפי הסדר: תחילה logger, אחר כך alert (אם המספר הוא 2 ומעלה), ולבסוף counter (אם המספר הוא 3). קראו מחרוזת הודעה, ואז הפעילו את האירוע עם ההודעה הזאת.

התוכנית שלכם תקבל:

  1. את מספר המטפלים שיש לרשום (1, 2 או 3)
  2. את ההודעה להפצה

פלט לדוגמה כאשר הקלט הוא 3 ו־System started:

[LOG] System started
[ALERT] System started
[COUNT] 1

פלט לדוגמה כאשר הקלט הוא 2 ו־Warning detected:

[LOG] Warning detected
[ALERT] Warning detected

פלט לדוגמה כאשר הקלט הוא 1 ו־Hello:

[LOG] Hello

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

נסו בעצמכם

#include <stdio.h>
#include <string.h>
#include "event.h"

// TODO: לממש את המטפל logger
// מדפיס "[LOG] " ואחריו את ההודעה
void logger(const char* message) {
    // TODO: לממש
}

// TODO: לממש את המטפל alert
// מדפיס "[ALERT] " ואחריו את ההודעה
void alert(const char* message) {
    // TODO: לממש
}

// TODO: לממש את המטפל counter
// משתמש במשתנה סטטי כדי לספור קריאות
// מדפיס "[COUNT] X" כאשר X הוא מספר הקריאות הנוכחי
void counter(const char* message) {
    // TODO: לממש באמצעות משתנה סטטי
}

int main() {
    // לקרוא את מספר המטפלים שיש לרשום
    int num_handlers;
    scanf("%d", &num_handlers);
    getchar(); // לקלוט את תו סוף השורה
    
    // לקרוא את ההודעה
    char message[256];
    fgets(message, sizeof(message), stdin);
    message[strcspn(message, "\n")] = '\0'; // הסר את תו השורה החדשה
    
    // TODO: צור ואתחל Event
    
    // TODO: רשום מטפלים בהתאם ל-num_handlers
    // 1 מטפל: logger
    // 2 מטפלים: logger, alert
    // 3 מטפלים: logger, alert, counter
    
    // TODO: הפעל את האירוע עם ההודעה
    
    return 0;
}
quiz iconבחנו את עצמכם

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

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

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