Menu
Coddy logo textTech

העברת מבנים לפי ערך

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C של Coddy. שיעור 46 מתוך 63.

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

הנה התחביר של פונקציה שמקבלת פרמטר מסוג struct:

void functionName(struct StructureName parameterName) {
    // גוף הפונקציה
}

בעזרת המבנה המוכר שלנו Point כדוגמה:

void printPoint(struct Point p) {
    printf("Point coordinates: (%d, %d)\n", p.x, p.y);
}

הרעיון המרכזי שחשוב להבין הוא שכל שינוי שתבצעו ב־struct בתוך הפונקציה לא ישפיע על ה־struct המקורי בפונקציה הקוראת. הסיבה לכך היא שהפונקציה עובדת עם עותק משלה של הנתונים.

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

challenge icon

אתגר

קל

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

  1. להגדיר struct בשם Rectangle עם החברים הבאים:
    • מספר שלם width לאחסון רוחב המלבן
    • מספר שלם height לאחסון גובה המלבן
    • מערך תווים color בגודל 15 לאחסון צבע המלבן
  2. לכתוב פונקציה בשם displayRectangle ש:
    • מקבלת מבנה Rectangle כפרמטר (העברה לפי ערך)
    • מדפיסה את פרטי המלבן בפורמט המדויק הבא:
      • Rectangle Details:
      • Width: [width]
      • Height: [height]
      • Color: [color]
      • Area: [area]
    • מחשבת ומדפיסה את השטח (רוחב × גובה)
  3. לכתוב פונקציה בשם modifyRectangle ש:
    • מקבלת מבנה Rectangle כפרמטר (העברה לפי ערך)
    • מכפילה פי שניים גם את רוחב המלבן וגם את גובהו
    • משנה את הצבע ל-"Modified"
    • מדפיסה Inside modifyRectangle function:
    • קוראת ל-displayRectangle כדי להציג את המלבן ששונה
  4. בפונקציה הראשית:
    • יוצרת משתנה Rectangle בשם rect
    • קוראת את הרוחב, הגובה והצבע מהקלט ומשייכת אותם לחברי המבנה
    • מדפיסה Original rectangle:
    • קוראת ל-displayRectangle כדי להציג את המלבן המקורי
    • קוראת ל-modifyRectangle עם המלבן
    • מדפיסה After modifyRectangle call:
    • קוראת שוב ל-displayRectangle כדי להראות שהמלבן המקורי לא השתנה

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

נסו בעצמכם

#include <stdio.h>
#include <string.h>

// TODO: הגדירו כאן את המבנה Rectangle

// TODO: כתבו כאן את הפונקציה displayRectangle

// TODO: כתבו כאן את הפונקציה modifyRectangle

int main() {
    // קראו את הקלט
    int width, height;
    char color[15];
    
    scanf("%d", &width);
    scanf("%d", &height);
    scanf("%s", color);
    
    // TODO: צרו משתנה מסוג Rectangle והקצו לו את ערכי הקלט
    
    // TODO: הדפיסו "Original rectangle:" וקראו לפונקציה displayRectangle
    
    // TODO: קראו לפונקציה modifyRectangle
    
    // TODO: הדפיסו "After modifyRectangle call:" וקראו שוב לפונקציה displayRectangle
    
    return 0;
}
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

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