מתודות עזר
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 10 מתוך 61.
עד כה ראינו פונקציות שמשנות נתוני struct (כמו player_take_damage) ופונקציות שפשוט מציגות אותם. אבל יש קטגוריה חשובה נוספת: פונקציות שמחשבות ערכים נגזרים מתוך איברי struct בלי לשנות דבר.
נבחן מבנה Rectangle שמאחסן רוחב וגובה. השטח אינו מאוחסן: הוא מחושב לפי הצורך:
typedef struct {
double width;
double height;
} Rectangle;
double rectangle_area(const Rectangle *self) {
return self->width * self->height;
}
double rectangle_perimeter(const Rectangle *self) {
return 2 * (self->width + self->height);
}
אלה מתודות עזר. הן מקבלות את הנתונים הקיימים של המבנה ומפיקות ערך חדש. שימו לב שהן משתמשות במצביעי const, מכיוון שהן רק קוראות ולא כותבות. התוצאה המחושבת מוחזרת במקום להישמר במבנה.
Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box)); // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0
התבנית הזו שומרת על המבנים שלך רזים: אחסן רק את הנתונים החיוניים, וחשב את כל השאר כשצריך. היא גם מבטיחה שהערכים הנגזרים יהיו תמיד עקביים עם המצב הנוכחי.
אתגר
קלבוא נבנה מודול Circle שמחשב ערכים נגזרים מנתונים שמורים. תתרגל כתיבת שיטות עזר: פונקציות שמחשבות תוצאות מתוך איברי struct בלי לשנות אותם.
תיצור שלושה קבצים:
circle.h: הכרז על struct בשםCircleעם איבר יחיד מסוגdouble radius. הכרז גם על שתי שיטות עזר:circle_area: מקבלת מצביעconstל-Circle ומחזירה את השטחcircle_circumference: מקבלת מצביעconstל-Circle ומחזירה את ההיקף
CIRCLE_H.circle.c: ממש את שתי שיטות העזר. לצורך החישובים, השתמש ב-3.14159כערך של pi. נוסחת השטח היאpi * radius * radius, ונוסחת ההיקף היא2 * pi * radius. שתי הפונקציות צריכות לקרוא את radius בלבד: לעולם אל תשנה אותו.main.c: צור Circle והשתמש בשיטות העזר כדי לחשב ולהציג את המאפיינים שלו.
תקבל קלט אחד: radius של המעגל (מסוג double).
בקובץ הראשי שלך, אתחל Circle עם הערך הנתון של radius, ואז השתמש בשיטות העזר שלך כדי לחשב ולהדפיס את השטח ואת ההיקף.
הדפס את התוצאות בפורמט הבא:
Area: {area}
Circumference: {circumference}השתמש ב-%.2f עבור שני הערכים כדי להציג שתי ספרות אחרי הנקודה העשרונית.
לדוגמה, עבור radius של 5.0, הפלט יהיה:
Area: 78.54
Circumference: 31.42נסו בעצמכם
#include <stdio.h>
#include "circle.h"
int main() {
double radius;
scanf("%lf", &radius);
// TODO: צרו מבנה Circle עם הרדיוס הנתון
// TODO: השתמשו בפונקציות העזר circle_area ו-circle_circumference
// כדי לחשב ולהדפיס את התוצאות
// פורמט ההדפסה:
// printf("Area: %.2f\n", ...);
// printf("Circumference: %.2f\n", ...);
return 0;
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4כימוס
המושג של מצביעים אטומיםהגדרת מבנים אטומיםפונקציות Get ו-Setאימות ב-Settersסיכום: הקופסה הסודית2אובייקטים ומתודות
מבנים כאובייקטיםמצביע 'Self'נכונות constמצביע לעומת ערךמתודות עזרחזרה: מנהל נקודות5פרויקט: חשבון בנק פשוט
הגדרת הפרויקטמימוש החשבוןתרגלו בעצמכם: קומפיילר C אונליין