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.
Wyzwanie
ŁatwyStwó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 klasyGrade.Zagnieżdżona klasa
Grade(zadeklarowana w sekcji publicznej klasyStudent) powinna przechowywać nazwę kursu (string) i wynik (double). Dodaj konstruktor, który przyjmuje obie wartości, oraz metodygetCourseName()igetScore(), aby uzyskiwać dostęp do danych. KlasaGradeprzechowuje swoje dane jako prywatne; mimo że jest zagnieżdżona w klasieStudent, nadal zachowuje własną hermetyzację.Klasa
Studentpowinna mieć prywatne składowe przechowujące imię i nazwisko studenta (string), identyfikator studenta (int) oraz kolekcję wskaźników do obiektówGrade. Udostępnij:- Konstruktor przyjmujący imię i nazwisko oraz identyfikator studenta
- Metody pobierające
getName()igetStudentId()(obie const) - Metodę
addGrade(const std::string& course, double score), która tworzy nowy obiektGradei 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
Studentz 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;
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneBudowanie i kompilacja C++Pliki nagłówkowe i pliki źródłowePrzestrzenie nazw i zakresWprowadzenie do programowania obiektowego w C++Klasy a obiektyWskaźnik „this”Metody (funkcje składowe)Atrybuty (składowe danych)Podstawy konstruktorów i destruktorówPowtórzenie – prosty kalkulator4Właściwości klas
Elementy instancji a elementy statyczneGettery i setteryStałe funkcje składoweSłowo kluczowe mutableMetody i zmienne statyczneFunkcje i klasy zaprzyjaźnionePodsumowanie – menedżer konta bankowego7Dziedziczenie
Podstawy dziedziczeniaPoziomy dostępu w dziedziczeniuKolejność wywołań konstruktora i destruktoraNadpisywanie metodFunkcje wirtualne i VTableWielokrotne dziedziczenieDziedziczenie wirtualnePowtórzenie — hierarchia pracowników2Zarządzanie pamięcią
Pamięć stosu a stertyWskaźniki i referencjePamięć dynamiczna (new/delete)Inteligentne wskaźniki w C++RAII w C++Podsumowanie — menedżer tablicy dynamicznej5Hermetyzacja
Specyfikatory dostępu w C++Specyfikatory dostępu — szczegółowoUkrywanie informacjiStruktura a klasaKlasy zagnieżdżone i wewnętrznePodsumowanie — system ewidencji studentów8Polimorfizm
Polimorfizm czasu kompilacji i wykonaniaPrzeciążanie funkcjiFunkcje wirtualne — powtórkaCzysto wirtualne funkcjeKlasy abstrakcyjneProjektowanie interfejsów w C++Rzutowanie dynamiczne i RTTIPodsumowanie — kalkulator kształtów3Konstruktory i destruktory
Konstruktor domyślnyKonstruktor z parametramiKonstruktor kopiującyKonstruktor przenoszącyListy inicjalizacyjne konstruktoraKonstruktory delegująceDestruktor — szczegółowe omówienieZasada trzech / pięciu / zeraPodsumowanie — klasa String6Przeciążanie operatorów
Wprowadzenie do przeciążania operatorówPrzeciążanie operatorów arytmetycznychPrzeciążanie operatorów porównaniaOperatory strumieniowePrzeciążanie operatora przypisaniaPrzeciążanie operatorów [] i ()Operatory konwersji typówPodsumowanie — klasa Matrix9Szablony
Szablony funkcjiSzablony klasSpecjalizacja szablonówSzablony wariadycznePodstawy SFINAE i cech typówPodsumowanie — kontener generycznyPoćwicz samodzielnie: Kompilator C++ online