Menu
Coddy logo textTech

Podsumowanie — system ewidencji studentów

Część sekcji Programowanie obiektowe ścieżki C++ w Coddy. Lekcja 39 z 104.

Czas wykorzystać w praktyce wiedzę o enkapsulacji! W tym wyzwaniu zbudujesz System ewidencji studentów, który pokazuje prawidłowe użycie specyfikatorów dostępu, ukrywania informacji i klas zagnieżdżonych.

Twój system będzie zarządzać danymi studentów zgodnie z następującymi zasadami enkapsulacji:

  • Prywatne składowe danych, które chronią wrażliwe informacje, takie jak oceny i identyfikatory studentów
  • Publiczny interfejs z metodami pobierającymi i kontrolowanymi metodami ustawiającymi
  • Klasa zagnieżdżona reprezentująca oceny z poszczególnych kursów, dzięki czemu ten szczegół implementacyjny pozostaje wewnątrz klasy studenta

Oto struktura, którą zaimplementujesz:

class Student {
public:
    class Grade {    // Klasa zagnieżdżona do przechowywania ocen z kursów
        // ...
    };
    
    // Publiczny interfejs do pracy z danymi studenta
    
private:
    std::string name;
    int studentId;
    // Zbiór ocen
};

To wyzwanie łączy wszystkie zagadnienia z tego rozdziału: wybór odpowiednich poziomów dostępu, ukrywanie szczegółów implementacji za przejrzystym interfejsem oraz używanie klas zagnieżdżonych do porządkowania powiązanych typów. Zastanów się uważnie, co powinno być dostępne, a co powinno pozostać ukryte.

challenge icon

Wyzwanie

Łatwy

Stwórzmy system ewidencji studentów, który łączy wszystko, czego nauczysz się o hermetyzacji. Utworzysz system, w którym dane studentów są odpowiednio chronione, oceny są zarządzane za pomocą klasy zagnieżdżonej, a wszystkie interakcje odbywają się przez przejrzysty interfejs publiczny.

Utworzysz dwa pliki, aby uporządkować swój kod:

  • Student.h: Zdefiniuj klasę Student, która demonstruje prawidłową hermetyzację za pomocą zagnieżdżonej klasy Grade.

    Zagnieżdżona klasa Grade (zadeklarowana w sekcji publicznej klasy Student) powinna przechowywać nazwę kursu (string) i wynik (double). Dodaj konstruktor, który przyjmuje obie wartości, oraz metody getCourseName() i getScore(), aby uzyskiwać dostęp do danych. Klasa Grade przechowuje swoje dane jako prywatne; mimo że jest zagnieżdżona w klasie Student, nadal zachowuje własną hermetyzację.

    Klasa Student powinna mieć prywatne składowe przechowujące imię i nazwisko studenta (string), identyfikator studenta (int) oraz kolekcję wskaźników do obiektów Grade. Udostępnij:

    • Konstruktor przyjmujący imię i nazwisko oraz identyfikator studenta
    • Metody pobierające getName() i getStudentId() (obie const)
    • Metodę addGrade(const std::string& course, double score), która tworzy nowy obiekt Grade i dodaje go do rekordu studenta (dodaje ocenę tylko wtedy, gdy wynik mieści się w zakresie od 0 do 100 włącznie)
    • Metodę getAverageGrade() (const), która oblicza i zwraca średnią wszystkich ocen albo 0.0, jeśli nie ma żadnych ocen
    • Metodę displayRecord() (const), która wyświetla pełny rekord studenta

    Pamiętaj, aby zwolnić pamięć przydzieloną dynamicznie na oceny w destruktorze i dodać odpowiednie strażniki nagłówka.

  • main.cpp: Wczytaj imię i nazwisko studenta, jego identyfikator oraz oceny z trzech kursów. Dane wejściowe będą składać się z pięciu wierszy: imię i nazwisko, identyfikator, a następnie trzy wiersze zawierające nazwę kursu i wynik oddzielone spacją (np. Math 95.5).

    Utwórz obiekt Student z imieniem i nazwiskiem oraz identyfikatorem, dodaj wszystkie trzy oceny, a następnie wyświetl pełny rekord.

    Format wyjściowy metody displayRecord() powinien wyglądać następująco:

    Student: <name> (ID: <id>)
    Grades:
      <course1>: <score1>
      <course2>: <score2>
      <course3>: <score3>
    Average: <average>

Sformatuj wszystkie wyniki i średnią z dokładnością do jednego miejsca po przecinku, używając std::fixed i std::setprecision(1) z <iomanip>. Przekonwertuj identyfikator za pomocą std::stoi(), a wyniki za pomocą std::stod().

To wyzwanie łączy prywatne składowe danych, publiczne metody pobierające, kontrolowane metody ustawiające z walidacją oraz klasę zagnieżdżoną — wszystko po to, by wspólnie stworzyć dobrze hermetyzowany system ewidencji studentów.

Spróbuj swoich sił

#include <iostream>
#include <string>
#include <sstream>
#include "Student.h"

int main() {
    // Wczytaj imię i nazwisko studenta
    std::string name;
    std::getline(std::cin, name);
    
    // Wczytaj identyfikator studenta
    std::string idStr;
    std::getline(std::cin, idStr);
    int studentId = std::stoi(idStr);
    
    // Wczytaj oceny z trzech kursów (format: "CourseName Score")
    std::string line1, line2, line3;
    std::getline(std::cin, line1);
    std::getline(std::cin, line2);
    std::getline(std::cin, line3);
    
    // TODO: Przeanalizuj każdy wiersz, aby wyodrębnić nazwę kursu i ocenę
    // Użyj std::stod(), aby przekonwertować ciągi znaków z ocenami na wartości typu double
    
    // TODO: Utwórz obiekt Student z imieniem i nazwiskiem oraz identyfikatorem
    
    // TODO: Dodaj wszystkie trzy oceny do danych studenta
    
    // TODO: Wyświetl pełne dane studenta
    
    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