Università degli Studi di Brescia Fondamenti di Programmazione Docente: Alessandro Saetti A.A. 2012/2013 ESERCITAZIONE SULLE CLASSI Università degli Studi di Brescia A.A. 2012/2013 Definire la classe studente (matricola, nome, cognome) con: • Un metodo che inizializza i dati dello studente (matricola, nome e cognome) con dati acquisiti da tastiera; • Un metodo che visualizzi i dati dello studente. Sfruttando la classe precedente, definire la classe aula (gruppo di studenti) con • Un costruttore che azzera in numero di studenti nel gruppo; • Un metodo che visualizza i dati degli studenti nel gruppo; • Un metodo che rimuove dal gruppo lo studente avente un numero di matricola pari ad un intero acquisito da tastiera; • Un metodo che inserisce un nuovo studente nel gruppo. Scrivere un programma C++ che, sfruttando le classi precedentemente definite, supporti (tramite un menù di opzioni) l’aggiunta, la rimozione e la visualizzazione dei dati di studenti da un’aula Definire la classe studente (matricola, nome, cognome) con: • Un metodo che inizializza i dati dello studente (matricola, nome e cognome) con dati acquisiti da tastiera; • Un metodo che visualizzi i dati dello studente. Sfruttando la classe precedente, definire la classe aula (gruppo di studenti) con • Un costruttore che azzera in numero di studenti nel gruppo; • Un metodo che visualizza i dati degli studenti nel gruppo; • Un metodo che rimuove dal gruppo lo studente avente un numero di matricola pari ad un intero acquisito da tastiera; • Un metodo che inserisce un nuovo studente nel gruppo. Scrivere un programma C++ che, sfruttando le classi precedentemente definite, supporti (tramite un menù di opzioni) l’aggiunta, la rimozione e la visualizzazione dei dati di studenti da un’aula #include <iostream> using namespace std; #define NCHAR 30 class Studente { public: void Leggi(); void Stampa(); private: int Matricola; char Cognome[NCHAR]; char Nome[NCHAR]; }; I costruttori non sono obbligatori: se una classe non possiede alcun costruttore, il C++ fornisce un costruttore di default con "corpo nullo" {}. Se ci fosse la necessità possiamo fornire un costruttore di default. Ecco due esempi: Studente::Studente() { Matricola=0; Cognome[0]='\0'; Nome[0]='\0'; } #define <string.h> Studente::Studente() { Matricola=0; strcpy(Cognome,""); strcpy(Nome,""); } Definire la classe studente (matricola, nome, cognome) con: • Un metodo che inizializza i dati dello studente (matricola, nome e cognome) con dati acquisiti da tastiera; • Un metodo che visualizzi i dati dello studente. Sfruttando la classe precedente, definire la classe aula (gruppo di studenti) con • Un costruttore che azzera in numero di studenti nel gruppo; • Un metodo che visualizza i dati degli studenti nel gruppo; • Un metodo che rimuove dal gruppo lo studente avente un numero di matricola pari ad un intero acquisito da tastiera; • Un metodo che inserisce un nuovo studente nel gruppo. Scrivere un programma C++ che, sfruttando le classi precedentemente definite, supporti (tramite un menù di opzioni) l’aggiunta, la rimozione e la visualizzazione dei dati di studenti da un’aula Mi invento un main() per testare le funzionalità fino a questo punto implementate int main() { Studente S; S.Leggi(); S.Stampa(); } void Studente::Leggi() { cout << "Matricola: "; cin >> Matricola; cout << "Cognome: "; cin >> Cognome; cout << "Nome: "; cin >> Nome; } void Studente::Stampa() { cout << "Matricola: "; cout << Matricola << endl;; cout << "Cognome: "; cout << Cognome << endl;; cout << "Nome: "; cout << Nome << endl; } Definire la classe studente (matricola, nome, cognome) con: • Un metodo che inizializza i dati dello studente (matricola, nome e cognome) con dati acquisiti da tastiera; • Un metodo che visualizzi i dati dello studente. Sfruttando la classe precedente, definire la classe aula (gruppo di studenti) con • Un costruttore che azzera in numero di studenti nel gruppo; • Un metodo che visualizza i dati degli studenti nel gruppo; • Un metodo che rimuove dal gruppo lo studente avente un numero di matricola pari ad un intero acquisito da tastiera; • Un metodo che inserisce un nuovo studente nel gruppo. Scrivere un programma C++ che, sfruttando le classi precedentemente definite, supporti (tramite un menù di opzioni) l’aggiunta, la rimozione e la visualizzazione dei dati di studenti da un’aula #define NSTUD 30 class Aula { public: Aula(); void Stampa(); void EliminaStudente(); void InserisciStudente(); private: Studente Elenco[NSTUD]; int NrStud; }; class Aula { public: Aula(); void Stampa(); bool EliminaStudente(int); bool Inserisci(Studente); private: Studente Dati[NSTUD]; int NrStud; }; Nella definizione della classe posso considerare che la sezione di input sia esterna (2° definizione) oppure implementata al suo interno (1° definizione). Scegliamo quest’ultima. Definire la classe studente (matricola, nome, cognome) con: • Un metodo che inizializza i dati dello studente (matricola, nome e cognome) con dati acquisiti da tastiera; • Un metodo che visualizzi i dati dello studente. Sfruttando la classe precedente, definire la classe aula (gruppo di studenti) con • Un costruttore che azzera in numero di studenti nel gruppo; • Un metodo che visualizza i dati degli studenti nel gruppo; • Un metodo che rimuove dal gruppo lo studente avente un numero di matricola pari ad un intero acquisito da tastiera; • Un metodo che inserisce un nuovo studente nel gruppo. Scrivere un programma C++ che, sfruttando le classi precedentemente definite, supporti (tramite un menù di opzioni) l’aggiunta, la rimozione e la visualizzazione dei dati di studenti da un’aula void Aula::InserisciStudente() { if (NrStud < NSTUD) Elenco[NrStud++].Leggi(); } Aula::Aula() { NrStud=0; } Costruttore di default Definire la classe studente (matricola, nome, cognome) con: • Un metodo che inizializza i dati dello studente (matricola, nome e cognome) con dati acquisiti da tastiera; • Un metodo che visualizzi i dati dello studente. Sfruttando la classe precedente, definire la classe aula (gruppo di studenti) con • Un costruttore che azzera in numero di studenti nel gruppo; • Un metodo che visualizza i dati degli studenti nel gruppo; • Un metodo che rimuove dal gruppo lo studente avente un numero di matricola pari ad un intero acquisito da tastiera; • Un metodo che inserisce un nuovo studente nel gruppo. Scrivere un programma C++ che, sfruttando le classi precedentemente definite, supporti (tramite un menù di opzioni) l’aggiunta, la rimozione e la visualizzazione dei dati di studenti da un’aula Definire la classe studente (matricola, nome, cognome) con: • Un metodo che inizializza i dati dello studente (matricola, nome e cognome) con dati acquisiti da tastiera; • Un metodo che visualizzi i dati dello studente. Sfruttando la classe precedente, definire la classe aula (gruppo di studenti) con • Un costruttore che azzera in numero di studenti nel gruppo; • Un metodo che visualizza i dati degli studenti nel gruppo; • Un metodo che rimuove dal gruppo lo studente avente un numero di matricola pari ad un intero acquisito da tastiera; • Un metodo che inserisce un nuovo studente nel gruppo. Scrivere un programma C++ che, sfruttando le classi precedentemente definite, supporti (tramite un menù di opzioni) l’aggiunta, la rimozione e la visualizzazione dei dati di studenti da un’aula Mi invento un main() per testare le funzionalità fino a questo punto implementate int main() { Aula A; A.InserisciStudente(); A.InserisciStudente(); A.Stampa(); } Funzione-membro che stampa gli studenti del gruppo void Aula::Stampa() { for (int i=0; i <NrStud ; i++) Elenco[i].Stampa(); } Definire la classe studente (matricola, nome, cognome) con: • Un metodo che inizializza i dati dello studente (matricola, nome e cognome) con dati acquisiti da tastiera; • Un metodo che visualizzi i dati dello studente. INIZIO: sia A il gruppo di studenti Leggo la matricola m dello studente da eliminare Sfruttando la classe precedente, definire la classe aula (gruppo di studenti) con • Un costruttore che azzera in numero di studenti nel gruppo; • Un metodo che visualizza i dati degli studenti nel gruppo; • Un metodo che rimuove dal gruppo lo studente avente un numero di matricola pari ad un intero acquisito da tastiera; • Un metodo che inserisce un nuovo studente nel gruppo. Scrivere un programma C++ che, sfruttando le classi precedentemente definite, supporti (tramite un menù di opzioni) l’aggiunta, la rimozione e la visualizzazione dei dati di studenti da un’aula Ricerco, nel gruppo di studenti A, lo studente con matricola m NO Per ricercare lo studente da eliminare all’interno del gruppo devo poter leggere il contenuto della variabile membro «Matricola» che però è privata. Per aver accesso a tale valore creo una funzione membro getMatricola(); class Studente { public: void Leggi(); void Stampa(); int getMatricola(); private: int Matricola; char Cognome[NCHAR]; char Nome[NCHAR]; }; int { SI Elimino lo studente ricopiandoci sopra quello che è in fondo all’elenco A Decremento il numero di studenti NrStud in A Studente::getMatricola() return (Matricola); } esiste FINE Decodifica in C++ del «metodo che rimuove dal gruppo lo studente avente un numero di matricola pari ad un intero acquisito da tastiera»; INIZIO: sia A il gruppo di studenti void Aula::EliminaStudente() { int m; cout << "Matricola Studente da Eliminare: "; cin >> m; Leggo la matricola m dello studente da eliminare Ricerco, nel gruppo di studenti A, lo studente con matricola m NO for (int i=0 ; i<NrStud; i++) if (Elenco[i].getMatricola()==m) esiste SI Elimino lo studente ricopiandoci sopra quello che è in fondo all’elenco A { Elenco[i]=Elenco[NrStud-1]; NrStud--; return; Decremento il numero di studenti NrStud in A FINE } } Definire la classe studente (matricola, nome, cognome) con: • Un metodo che inizializza i dati dello studente (matricola, nome e cognome) con dati acquisiti da tastiera; • Un metodo che visualizzi i dati dello studente. void Aula::EliminaStudente() { int m; cout << "Matr. Studente da eliminare:"; Sfruttando la classe precedente, definire la classe aula (gruppo di cin >> m; studenti) con • Un costruttore che azzera in numero di studenti nel gruppo; for (int i=0 ; i<NrStud; i++) • Un metodo che visualizza i dati degli studenti nel gruppo; if (Elenco[i].getMatricola()==m) • Un metodo che rimuove dal gruppo lo studente avente un { numero di matricola pari ad un intero acquisito da tastiera; Elenco[i]=Elenco[NrStud-1]; • Un metodo che inserisce un nuovo studente nel gruppo. NrStud--; return; Scrivere un programma C++ che, sfruttando le classi precedentemente definite, supporti (tramite un menù di opzioni) } l’aggiunta, la rimozione e la visualizzazione dei dati di studenti da } un’aula Un main() di prova potrebbe essere il seguente: int main() { Aula A; A.InserisciStudente(); A.InserisciStudente(); A.InserisciStudente(); A.Stampa(); A.EliminaStudente(); A.Stampa(); } int main() Definire la classe studente (matricola, nome, cognome) con: • Un metodo che inizializza i dati dello studente (matricola, nome e { cognome) con dati acquisiti da tastiera; Aula A; • Un metodo che visualizzi i dati dello studente. int Scelta; do { // Stampo il menu: cout << "1. Aggiungi\n"; cout << "2. Rimuovi\n"; cout << "3. Stampa\n"; cout << "0. Esci\n--> "; // Leggo l'opzione scelta: cin >> Scelta; // Eseguo azione richiesta // o avviso errore if (Scelta==1) A.InserisciStudente(); else if (Scelta==2) A.EliminaStudente(); else if (Scelta==3) A.Stampa(); else if (Scelta!=0) cout << "Opzione errata!\n"; } while (Scelta !=0); Sfruttando la classe precedente, definire la classe aula (gruppo di studenti) con • Un costruttore che azzera in numero di studenti nel gruppo; • Un metodo che visualizza i dati degli studenti nel gruppo; • Un metodo che rimuove dal gruppo lo studente avente un numero di matricola pari ad un intero acquisito da tastiera; • Un metodo che inserisce un nuovo studente nel gruppo. Scrivere un programma C++ che, sfruttando le classi precedentemente definite, supporti (tramite un menù di opzioni) l’aggiunta, la rimozione e la visualizzazione dei dati di studenti da un’aula INIZIO Stampo Menu Leggo scelta Eseguo azione se è tra quelle previste SI Scelta!=0 NO FINE }