מיכל צורות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 48 מתוך 61.
אתגר
קלבואו נביא את פרויקט Shape Drawer לסיומו המפואר! תיצור מכל לצורות שיכיל אוסף מעורב של מעגלים ומלבנים, ואז תעבור עליהם כדי לחשב את השטח הכולל: כך תדגים את העוצמה האמיתית של פולימורפיזם.
בהתבסס על כל מה שיצרת עד כה, הפרויקט השלם שלך יכלול:
shape.hו-shape.c: ממשק הבסיס Shape שלך והפונקציהprocess_shape.circle.hו-circle.c: המימוש שלך של Circle, כולל הבנאי וחישוב השטח.rectangle.hו-rectangle.c: המימוש שלך של Rectangle, כולל הבנאי וחישוב השטח.main.c: כאן מתרחש הקסם. תיצור מערך של מצביעיShape*שיכול להכיל כל סוג של צורה. מלא אותו בתערובת של מעגלים ומלבנים, ואז עבור על המערך בלולאה כדי לחשב ולהציג את השטח הכולל של כל הצורות יחד.
התוכנית שלך תקבל את הקלטים הבאים:
- מספר הצורות שיש ליצור
- עבור כל צורה: סימון סוג (
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;
}
כל השיעורים ביחידה תכנות מונחה עצמים
4כימוס
המושג של מצביעים אטומיםהגדרת מבנים אטומיםפונקציות Get ו-Setאימות ב-Settersסיכום: הקופסה הסודית2אובייקטים ומתודות
מבנים כאובייקטיםמצביע 'Self'נכונות constמצביע לעומת ערךמתודות עזרחזרה: מנהל נקודות5פרויקט: חשבון בנק פשוט
הגדרת הפרויקטמימוש החשבוןתרגלו בעצמכם: קומפיילר C אונליין