Menu
Coddy logo textTech

מיכל צורות

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

challenge icon

אתגר

קל

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

בהתבסס על כל מה שיצרת עד כה, הפרויקט השלם שלך יכלול:

  • shape.h ו-shape.c: ממשק הבסיס Shape שלך והפונקציה process_shape.
  • circle.h ו-circle.c: המימוש שלך של Circle, כולל הבנאי וחישוב השטח.
  • rectangle.h ו-rectangle.c: המימוש שלך של Rectangle, כולל הבנאי וחישוב השטח.
  • main.c: כאן מתרחש הקסם. תיצור מערך של מצביעי Shape* שיכול להכיל כל סוג של צורה. מלא אותו בתערובת של מעגלים ומלבנים, ואז עבור על המערך בלולאה כדי לחשב ולהציג את השטח הכולל של כל הצורות יחד.

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

  1. מספר הצורות שיש ליצור
  2. עבור כל צורה: סימון סוג (c עבור מעגל, r עבור מלבן) ואחריו המידות שלה

עבור כל צורה במכל שלך, קרא בעצמך ל-draw ול-area דרך מצביע ה-Shape* (shapes[i]->draw(shapes[i]), shapes[i]->area(shapes[i])) והוסף את השטח לסכום מצטבר. אל תשתמש כאן ב-process_shape מתוך shape.c: היא מדפיסה שורת Area: נוספת עבור כל צורה, שאינה מופיעה בפלט הצפוי. לאחר עיבוד כל הצורות, הדפס את השטח הכולל עם 2 ספרות אחרי הנקודה העשרונית, בתבנית Total Area: X.XX.

דוגמה עם הקלטים 3, אחר כך c 5.0, r 4.0 3.0, c 2.0:

Drawing Circle with radius: 5.00
Drawing Rectangle with width: 4.00 and height: 3.00
Drawing Circle with radius: 2.00
Total Area: 103.11

דוגמה עם הקלטים 2, אחר כך r 6.0 4.0, r 3.0 2.0:

Drawing Rectangle with width: 6.00 and height: 4.00
Drawing Rectangle with width: 3.00 and height: 2.00
Total Area: 30.00

התובנה המרכזית היא שהמערך שלך מאחסן מצביעי Shape*. לא משנה לו אם כל איבר הוא למעשה Circle או Rectangle. כשאתה עובר על המערך וקורא ל-draw ול-area דרך כל מצביע, המימוש המתאים מתבצע אוטומטית בהתאם לאופן שבו נוצרה כל צורה. זהו פולימורפיזם בפעולה: לולאה אחת, ממשק אחד, התנהגויות מרובות.

זכור שעליך לאחסן במערך מצביעים לאיברי Shape המוטמעים בצורות הקונקרטיות שלך. השתמש ב-3.14159 עבור π בחישובי שטח המעגלים.

חשוב: קריאת תו סוג הצורה: לאחר קריאת מספר הצורות באמצעות scanf("%d", &n), כל קריאה עוקבת לקריאת תו סוג הצורה צריכה לדלג על תו ירידת השורה שנותר במאגר הקלט. לשם כך, השתמש ברווח מוביל במחרוזת הפורמט:

scanf(" %c", &type);  // note the space before %c

בלי הרווח המוביל, scanf יקרא את תו ירידת השורה שנותר מהקלט הקודם במקום את c או r הרצוי, וכך בדיקת סוג הצורה שלך תיכשל בשקט ולא יופק פלט.

נסו בעצמכם

#include <stdio.h>
#include <stdlib.h>
#include "shape.h"
#include "circle.h"
#include "rectangle.h"

int main() {
    // TODO: קראו את מספר הצורות
    // TODO: הקצו מערכים למעגלים, למלבנים ולמצביעים מסוג Shape*
    // TODO: עברו על כל צורה, קראו את הסוג והממדים שלה,
    //       צרו את הצורה ושמרו מצביע לבסיס שלה במערך shapes
    // TODO: עברו על המערך shapes, קראו ל־shapes[i]->draw(...) וגם
    //       ל־shapes[i]->area(...) ישירות, וסכמו את השטח הכולל
    //       (אל תקראו ל־process_shape: היא מדפיסה שורת Area נוספת)
    // TODO: הדפיסו את השטח הכולל בפורמט: Total Area: X.XX
    // TODO: שחררו את הזיכרון שהוקצה
    return 0;
}

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

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