Menu
Coddy logo textTech

סקירת הפרויקט

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

challenge icon

אתגר

קל

בואו נניח את היסודות לפרויקט Shape Drawer באמצעות יצירת מבנה הבסיס Shape: ממשק שמגדיר מה כל צורה יכולה לעשות באמצעות מצביעי פונקציות.

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

  • shape.h: הגדירו כאן את הממשק המרכזי. תחילה, צרו הצהרה מקדימה עבור המבנה Shape. לאחר מכן הגדירו שני טיפוסים של מצביעי פונקציות:
    • DrawFunc: מקבל פרמטר מסוג const Shape* ואינו מחזיר ערך
    • AreaFunc: מקבל פרמטר מסוג const Shape* ומחזיר ערך מסוג double
    לבסוף, הגדירו את המבנה Shape עצמו, המכיל שני מצביעי פונקציות: draw (מטיפוס DrawFunc) ו-area (מטיפוס AreaFunc). המבנה הזה משמש כממשק בלבד. הוא אינו מכיל נתונים ייחודיים לצורה, אלא רק התנהגות.
  • main.c: הדגימו שהממשק שלכם פועל באמצעות יצירת צורת בדיקה פשוטה. ממשו שתי פונקציות:
    • test_draw: מדפיסה Drawing test shape
    • test_area: מחזירה 42.0
    צרו מופע של Shape, חברו אותו לפונקציות הבדיקה האלה, ואז קראו לשתיהן דרך הממשק. הדפיסו את תוצאת השטח עם ספרה אחת אחרי הנקודה העשרונית.

הפלט שלכם צריך להדגים שמצביעי הפונקציות פועלים כראוי:

Drawing test shape
Area: 42.0

למה צריך הצהרה מקדימה? אולי אתם תוהים למה typedef struct Shape Shape; מופיעה לפני שהמבנה מוגדר במלואו. הדבר נחוץ מכיוון ש-DrawFunc ו-AreaFunc מפנים אל const Shape* בסוגי הפרמטרים שלהם, אך בנקודה הזאת בקובץ, המהדר עדיין לא ראה את ההגדרה המלאה של המבנה. ההצהרה המקדימה אומרת למהדר: "קיים מבנה בשם Shape", וזה מספיק כדי להשתמש במצביע אליו. ההגדרה המלאה מופיעה בהמשך. זהו דפוס נפוץ ב-C בכל פעם שמבנה צריך להפנות לעצמו (ישירות או באמצעות מצביעי פונקציות).

התובנה המרכזית כאן היא ש-Shape אינו יודע דבר על מעגלים או מלבנים. הוא רק יודע שכל צורה חייבת להיות מסוגלת draw את עצמה ולחשב את ה-area שלה. בשיעורים הבאים תיצרו צורות ממשיות שישלבו את מבנה הבסיס הזה ויספקו מימושים משלהן. זכרו להשתמש בשומרי הכללה בקובץ הכותרת שלכם.

נסו בעצמכם

#include <stdio.h>
#include "shape.h"

// TODO: לממש את הפונקציה test_draw
// - מקבלת פרמטר מסוג const Shape*
// - מדפיסה "Drawing test shape"
void test_draw(const Shape* shape) {
    // TODO: להדפיס את ההודעה הנדרשת
}

// TODO: לממש את הפונקציה test_area
// - מקבלת פרמטר מסוג const Shape*
// - מחזירה 42.0
double test_area(const Shape* shape) {
    // TODO: להחזיר את ערך שטח הבדיקה
}

int main() {
    // TODO: ליצור מופע של Shape
    
    // TODO: לחבר את הצורה לפונקציות test_draw ו-test_area
    
    // TODO: לקרוא ל-draw דרך הממשק
    
    // TODO: לקרוא ל-area דרך הממשק ולהדפיס עם ספרה אחת אחרי הנקודה העשרונית
    // פורמט: "Area: %.1f\n"
    
    return 0;
}

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

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