Riepilogo - Sistema di registrazione degli studenti
Fa parte della sezione Programmazione orientata agli oggetti del percorso C++ di Coddy. Lezione 39 di 104.
È il momento di mettere in pratica ciò che hai imparato sull’incapsulamento! In questa sfida, creerai un sistema di registrazione degli studenti che dimostra l’uso corretto degli specificatori di accesso, l’occultamento delle informazioni e delle classi annidate.
Il tuo sistema gestirà i dati degli studenti applicando questi principi di incapsulamento:
- Membri dati privati per proteggere informazioni sensibili come i voti e gli ID degli studenti
- Interfaccia pubblica con getter e setter controllati
- Una classe annidata per rappresentare i voti dei singoli corsi, mantenendo questo dettaglio di implementazione all’interno della classe dello studente
Ecco la struttura che implementerai:
class Student {
public:
class Grade { // Classe annidata per i voti dei corsi
// ...
};
// Interfaccia pubblica per interagire con i dati dello studente
private:
std::string name;
int studentId;
// Raccolta di voti
};Questa sfida combina tutto ciò che hai imparato in questo capitolo: scegliere livelli di accesso appropriati, nascondere i dettagli di implementazione dietro un’interfaccia chiara e usare classi annidate per organizzare tipi correlati. Rifletti attentamente su cosa dovrebbe essere accessibile e cosa dovrebbe rimanere nascosto.
Sfida
FacileCostruiamo un sistema di registrazione degli studenti che riunisce tutto ciò che hai imparato sull’incapsulamento. Creerai un sistema in cui i dati degli studenti sono adeguatamente protetti, i voti vengono gestiti tramite una classe annidata e tutte le interazioni avvengono attraverso un’interfaccia pubblica chiara.
Creerai due file per organizzare il codice:
Student.h: definisci una classeStudentche dimostri un corretto incapsulamento con una classeGradeannidata.La classe
Gradeannidata (dichiarata nella sezione pubblica diStudent) deve memorizzare il nome di un corso (stringa) e un punteggio (double). Assegnale un costruttore che accetti entrambi i valori e fornisci i metodigetCourseName()egetScore()per accedere ai dati. La classeGrademantiene privati i propri dati; anche se è annidata inStudent, conserva comunque il proprio incapsulamento.La classe
Studentdeve avere membri privati per il nome dello studente (stringa), l’ID dello studente (int) e una raccolta di puntatori aGrade. Fornisci:- Un costruttore che accetti il nome e l’ID dello studente
- I getter
getName()egetStudentId()(entrambi const) - Un metodo
addGrade(const std::string& course, double score)che crei un nuovoGradee lo aggiunga al registro dello studente (aggiungi il voto solo se il punteggio è compreso tra 0 e 100 inclusi) - Un metodo
getAverageGrade()(const) che calcoli e restituisca la media di tutti i voti, oppure 0.0 se non ce ne sono - Un metodo
displayRecord()(const) che mostri il registro completo dello studente
Non dimenticare di liberare i voti allocati dinamicamente nel distruttore e di includere le opportune protezioni dell’header.
main.cpp: leggi da input il nome dello studente, l’ID dello studente e i voti di tre corsi. Il formato dell’input sarà di cinque righe: nome, ID e poi tre righe, ciascuna contenente il nome di un corso e un punteggio separati da uno spazio (ad es.,Math 95.5).Crea un oggetto
Studentcon il nome e l’ID, aggiungi tutti e tre i voti e poi visualizza il registro completo.Il formato di output di
displayRecord()deve essere:Student: <name> (ID: <id>) Grades: <course1>: <score1> <course2>: <score2> <course3>: <score3> Average: <average>
Formatta tutti i punteggi e la media con una cifra decimale usando std::fixed e std::setprecision(1) da <iomanip>. Converti l’ID usando std::stoi() e i punteggi usando std::stod().
Questa sfida combina membri dati privati, getter pubblici, setter controllati con convalida e una classe annidata: tutti collaborano per creare un sistema di registrazione degli studenti ben incapsulato.
Provalo tu
#include <iostream>
#include <string>
#include <sstream>
#include "Student.h"
int main() {
// Leggi il nome dello studente
std::string name;
std::getline(std::cin, name);
// Leggi l'ID dello studente
std::string idStr;
std::getline(std::cin, idStr);
int studentId = std::stoi(idStr);
// Leggi i voti di tre corsi (formato: "CourseName Score")
std::string line1, line2, line3;
std::getline(std::cin, line1);
std::getline(std::cin, line2);
std::getline(std::cin, line3);
// TODO: Analizza ogni riga per estrarre il nome del corso e il voto
// Usa std::stod() per convertire le stringhe dei voti in valori double
// TODO: Crea un oggetto Student con il nome e l'ID
// TODO: Aggiungi tutti e tre i voti allo studente
// TODO: Visualizza la scheda completa dello studente
return 0;
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniBuild e compilazione in C++File header e file sorgenteNamespace e ambitoIntroduzione alla programmazione orientata agli oggetti in C++Classi e oggetti a confrontoIl puntatore 'this'Metodi (funzioni membro)Attributi (membri dati)Fondamenti di costruttori e distruttoriRiepilogo - Calcolatrice semplice4Proprietà delle classi
Membri di istanza e staticiGetter e setterFunzioni membro constParola chiave mutableMetodi e variabili staticiFunzioni e classi friendRiepilogo - Gestore di conti bancari7Ereditarietà
Ereditarietà di baseLivelli di accesso nell’ereditarietàOrdine di chiamata di costruttori e distruttoriRidefinizione dei metodiFunzioni virtuali e VTableEreditarietà multiplaEreditarietà virtualeRiepilogo - Gerarchia dei dipendenti2Gestione della memoria
Memoria Stack vs HeapPuntatori e riferimentiMemoria dinamica (new/delete)Puntatori intelligenti in C++RAII in C++Riepilogo - Gestore di array dinamico5Incapsulamento
Specificatori di accesso in C++Specificatori di accesso in dettaglioOccultamento delle informazioniStruct vs classClassi annidate e interneRiepilogo - Sistema di registrazione degli studenti8Polimorfismo
Polimorfismo a compile time e a runtimeOverload delle funzioniFunzioni virtuali: ripassoFunzioni virtuali pureClassi astratteProgettazione delle interfacce in C++Dynamic casting e RTTIRipasso: calcolatrice di forme11Concetti avanzati di OOP
Composizione vs ereditarietàMixin tramite CRTPIdiom PimplType ErasureEnum class e tipizzazione forteGestione delle eccezioni in OOPGerarchie personalizzate di eccezioni14Pattern di progettazione - Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositeRAII come pattern3Costruttori e distruttori
Costruttore predefinitoCostruttore con parametriCostruttore di copiaCostruttore di spostamentoListe di inizializzazione dei costruttoriCostruttori delegantiApprofondimento sui distruttoriRegola del Tre / Cinque / ZeroRipasso - classe String6Sovraccarico degli operatori
Introduzione al sovraccarico degli operatoriSovraccarico degli operatori aritmeticiSovraccarico degli operatori di confrontoOperatori di flussoSovraccarico dell'operatore di assegnazioneSovraccarico degli operatori [] e ()Operatori di conversione di tipoRipasso - Classe Matrix9Template
Template di funzioneTemplate di classeSpecializzazione dei templateTemplate variadiciBasi di SFINAE e dei trait di tipoRiepilogo - Contenitore genericoEsercitati da solo: Compilatore C++ online