Menu
Coddy logo textTech

אתחול במחסנית

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

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

במקום להחזיר מצביע, פונקציית יצרן יכולה להחזיר את המבנה לפי ערך. המבנה כולו מועתק אל הקורא:

typedef struct {
    int x;
    int y;
} Point;

Point create_point(int x, int y) {
    Point p;
    p.x = x;
    p.y = y;
    return p;
}

הקורא מקבל עותק מאותחל במלואו:

Point origin = create_point(0, 0);
Point cursor = create_point(100, 50);
printf("Cursor: (%d, %d)\n", cursor.x, cursor.y);

אין מצביעים, ואין צורך בניקוי. כאשר origin ו־cursor יוצאים מתחום ההיקף, הם מושמדים אוטומטית.

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

challenge icon

אתגר

קל

נבנה מודול Temperature שיוצר קריאות טמפרטורה במחסנית באמצעות פונקציית מפעל. בניגוד לבנאים המבוססים על הערימה משיעורים קודמים, הגישה הזו מחזירה את המבנה לפי ערך: בלי malloc, בלי free, רק הקצאה פשוטה ויעילה במחסנית.

תיצור שלושה קבצים:

  • temperature.h: הצהר על מבנה Temperature עם שני איברים: double celsius ו-char scale (לאחסון 'C' עבור Celsius). כמו כן, הצהר על שתי פונקציות:
    • create_temperature: מקבלת ערך מסוג double ומחזירה מבנה Temperature לפי ערך (לא מצביע!)
    • temperature_to_fahrenheit: מקבלת const Temperature * ומחזירה את הטמפרטורה המקבילה בפרנהייט בתור double
    השתמש בשומרי הכללה עם הסמל TEMPERATURE_H.
  • temperature.c: ממש את שתי הפונקציות. פונקציית המפעל שלך צריכה ליצור משתנה Temperature מקומי, לאתחל את השדות שלו (להגדיר את scale ל-'C'), ולהחזיר אותו. נוסחת ההמרה היא: fahrenheit = celsius * 9.0 / 5.0 + 32.0
  • main.c: השתמש בפונקציית המפעל שלך כדי ליצור קריאת טמפרטורה ולהציג את הערכים גם בצלזיוס וגם בפרנהייט.

תקבל קלט אחד: הטמפרטורה בצלזיוס (בתור double).

בקובץ הראשי שלך, השתמש ב-create_temperature כדי ליצור מבנה Temperature עם הערך הנתון. לאחר מכן, הדפס את ערך הצלזיוס המקורי ואת הערך המקביל בפרנהייט.

הדפס את הפלט בפורמט הזה:

Celsius: {celsius}
Fahrenheit: {fahrenheit}

השתמש ב-%.2f עבור שני הערכים כדי להציג שתי ספרות אחרי הנקודה העשרונית.

לדוגמה, עם קלט 25.0, הפלט יהיה:

Celsius: 25.00
Fahrenheit: 77.00

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

נסו בעצמכם

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

int main() {
    double celsius_input;
    scanf("%lf", &celsius_input);
    
    // TODO: השתמשו ב-create_temperature כדי ליצור מבנה מסוג Temperature
    
    // TODO: הדפיסו את הערך בצלזיוס בפורמט %.2f
    
    // TODO: השתמשו ב-temperature_to_fahrenheit כדי להמיר ולהדפיס את הערך בפרנהייט
    
    return 0;
}
quiz iconבחנו את עצמכם

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

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

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