Menu
Coddy logo textTech

Dostęp do elementów klasy nadrzędnej

Część sekcji Programowanie obiektowe ścieżki C w Coddy. Lekcja 30 z 61.

Skoro rozumiemy już osadzanie struktur i regułę pierwszego elementu, skupmy się na praktycznym aspekcie: jak odczytywać i modyfikować dane osadzonej struktury nadrzędnej z poziomu funkcji.

Gdy funkcja otrzymuje strukturę Child (lub wskaźnik do niej), dostęp do pól rodzica wymaga przejścia przez osadzoną strukturę. Składnia zależy od tego, czy pracujesz z wartością, czy ze wskaźnikiem.

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

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

Mając wskaźnik do Child, użyj operatora strzałki, aby odwołać się do rodzica, a następnie kropki, aby uzyskać dostęp do jego składowych:

void update_score(Child* c, int new_score) {
    c->parent.score = new_score;  // Strzałka, potem kropka
}

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

W przypadku wartości (przekazywanej przez kopię) używaj kropek:

void show_id(Child c) {
    printf("ID: %d\n", c.parent.id);  // Kropka, a potem kropka
}

Ten wzorzec dostępu łańcuchowego, child->parent.member lub child.parent.member, to sposób interakcji z odziedziczonymi danymi w modelu kompozycji języka C. Jest nieco bardziej rozwlekły niż prawdziwe dziedziczenie, ale jasno i wyraźnie określa relację między typami.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system oceniania uczniów, który pokazuje, jak uzyskiwać dostęp do danych wewnątrz zagnieżdżonej struktury i modyfikować je. Utworzysz hierarchię, w której Student zawiera zagnieżdżoną strukturę Person, a następnie napiszesz funkcje, które operują na danych elementu nadrzędnego za pośrednictwem elementu potomnego.

Rozmieścisz kod w trzech plikach:

  • student.h: Zdefiniuj hierarchię struktur z zabezpieczeniami przed wielokrotnym dołączaniem. Utwórz strukturę Person z polami name (tablica znaków o długości 50 znaków) i age (liczba całkowita). Następnie zdefiniuj strukturę Student, która zawiera Person jako swój pierwszy element i dodaje pole grade (liczbę całkowitą reprezentującą ocenę). Zadeklaruj dwie funkcje: set_person_age, która przyjmuje Student* i nową wartość wieku, oraz print_student, która przyjmuje Student* i wyświetla wszystkie informacje.
  • student.c: Zaimplementuj obie funkcje. Funkcja set_person_age powinna modyfikować wiek wewnątrz zagnieżdżonej struktury Person. To tutaj przećwiczysz składnię strzałka-kropka (s->person.age). Funkcja print_student powinna uzyskiwać dostęp do wszystkich pól zarówno zagnieżdżonej osoby, jak i samego ucznia oraz je wyświetlać.
  • main.c: Utwórz zmienną typu Student i zainicjalizuj wszystkie jej pola. Następnie użyj set_person_age, aby zaktualizować wiek zagnieżdżonej osoby, i wywołaj print_student, aby wyświetlić wynik.

Otrzymasz cztery dane wejściowe: imię i nazwisko ucznia (ciąg znaków), jego wiek początkowy (liczbę całkowitą), jego ocenę (liczbę całkowitą) oraz nowy wiek (liczbę całkowitą, na którą wiek zostanie zaktualizowany za pomocą Twojej funkcji).

W pliku głównym utwórz ucznia z początkowymi wartościami, a następnie wywołaj set_person_age, aby zmienić wiek na nową wartość, i na koniec wywołaj print_student, aby wyświetlić zaktualizowane informacje.

Wynik powinien wyglądać tak:

Name: Emma
Age: 21
Grade: 85

Gdzie Emma to imię i nazwisko, 21 to zaktualizowany wiek (a nie wiek początkowy), a 85 to ocena. Kluczowa umiejętność, którą tu zdobędziesz, to poruszanie się po zagnieżdżonej strukturze, aby odczytywać i zapisywać pola elementu nadrzędnego.

Spróbuj swoich sił

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

int main() {
    char name[50];
    int initial_age, grade, new_age;
    
    // Wczytaj dane wejściowe
    fgets(name, 50, stdin);
    name[strcspn(name, "\n")] = '\0';  // Usuń znak nowej linii
    scanf("%d", &initial_age);
    scanf("%d", &grade);
    scanf("%d", &new_age);
    
    // TODO: Utwórz zmienną typu Student
    
    // TODO: Zainicjalizuj wszystkie pola studenta
    // - Skopiuj name do pola name osadzonej osoby za pomocą strcpy
    // - Ustaw wiek osadzonej osoby na initial_age
    // - Ustaw ocenę studenta
    
    // TODO: Wywołaj set_person_age, aby zmienić wiek na new_age
    
    // TODO: Wywołaj print_student, aby wyświetlić wynik
    
    return 0;
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C online