Menu
Coddy logo textTech

גישה לאיברי האב

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

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

כאשר פונקציה מקבלת מבנה Child (או מצביע אליו), כדי לגשת לחברים של ההורה צריך לנווט דרך המבנה המשובץ. התחביר תלוי בשאלה אם עובדים עם ערך או עם מצביע.

typedef struct {
    int id;
    int score;
} Parent;

typedef struct {
    Parent parent;
    char grade;
} Child;

בעזרת מצביע ל־Child, השתמשו באופרטור החץ כדי להגיע להורה, ואז בנקודה כדי לגשת לאיברים שלו:

void update_score(Child* c, int new_score) {
    c->parent.score = new_score;  // חץ ואז נקודה
}

void print_info(Child* c) {
    printf("ID: %d, Score: %d\n", c->parent.id, c->parent.score);
}

עם ערך (שמועבר בהעתקה), השתמשו בנקודות לאורך כל הדרך:

void show_id(Child c) {
    printf("ID: %d\n", c.parent.id);  // נקודה ואז נקודה
}

תבנית הגישה המשורשרת הזו, child->parent.member או child.parent.member, היא הדרך שבה ניגשים לנתונים שעברו בירושה במודל ההרכבה של C. היא מעט מפורטת יותר מירושה אמיתית, אך הקשר בין הטיפוסים מפורש וברור.

challenge icon

אתגר

קל

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

תארגנו את הקוד שלכם בשלושה קבצים:

  • student.h: הגדירו את היררכיית המבנים שלכם עם מגיני הכללה. צרו מבנה Person עם name (מערך תווים באורך 50 תווים) ועם age (מספר שלם). לאחר מכן הגדירו מבנה Student שמשבץ את Person כחבר הראשון שלו ומוסיף שדה grade (מספר שלם שמייצג את הציון). הצהירו על שתי פונקציות: set_person_age שמקבלת Student* וערך גיל חדש, ו-print_student שמקבלת Student* ומציגה את כל המידע.
  • student.c: ממשו את שתי הפונקציות. הפונקציה set_person_age שלכם צריכה לשנות את הגיל בתוך מבנה Person המשובץ. כאן תתרגלו את תחביר החץ ואז נקודה (s->person.age). הפונקציה print_student שלכם צריכה לגשת לכל השדות של האדם המשובץ ושל התלמיד עצמו ולהציג אותם.
  • main.c: צרו משתנה Student ואתחלו את כל השדות שלו. לאחר מכן השתמשו ב-set_person_age כדי לעדכן את הגיל של האדם המשובץ, וקראו ל-print_student כדי להציג את התוצאה.

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

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

הפלט שלכם אמור להיראות כך:

Name: Emma
Age: 21
Grade: 85

כאשר Emma הוא השם, 21 הוא הגיל המעודכן (לא הגיל ההתחלתי), ו-85 הוא הציון. הלמידה המרכזית כאן היא ניווט בתוך המבנה המשובץ כדי לקרוא את איברי המבנה האב ולשנות אותם.

נסו בעצמכם

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

int main() {
    char name[50];
    int initial_age, grade, new_age;
    
    // קראו את נתוני הקלט
    fgets(name, 50, stdin);
    name[strcspn(name, "\n")] = '\0';  // הסירו את תו השורה החדשה
    scanf("%d", &initial_age);
    scanf("%d", &grade);
    scanf("%d", &new_age);
    
    // TODO: צרו משתנה מסוג Student
    
    // TODO: אתחלו את כל השדות של הסטודנט
    // - העתיקו את name לשם של האדם המוטמע באמצעות strcpy
    // - הגדירו את גיל האדם המוטמע ל־initial_age
    // - הגדירו את הציון של הסטודנט
    
    // TODO: קראו ל־set_person_age כדי לעדכן את הגיל ל־new_age
    
    // TODO: קראו ל־print_student כדי להציג את התוצאה
    
    return 0;
}
quiz iconבחנו את עצמכם

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

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

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