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 delle date del calendario con – Un costruttore che inizializzi la data al capodanno del 2000; – Un metodo che inizializzi la data con tre interi acquisiti da tastiera; – Un metodo che visualizzi la data; – Un metodo che faccia avanzare la data di una giornata. Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi la data con tre interi acquisiti da tastiera, faccia avanzare la data di 15 giorni ed infine visualizzi la data risultante. Definire la classe delle date del calendario con – Un costruttore che inizializzi la data al capodanno del 2000; – Un metodo che inizializzi la data con tre interi acquisiti da tastiera; – Un metodo che visualizzi la data; #include <iostream> – Un metodo che faccia avanzare la data di una giornata. using namespace std; Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi la data con tre interi acquisiti da tastiera, faccia avanzare la data di 15 giorni ed infine visualizzi la data risultante. class Data { public: Data(); // Costruttore void Acquisisci(); void Avanza(); void Stampa(); private: int aa, mm, gg; }; int main() { } Ricordarsi di inserire il tipo restituito da ogni singola funzione-membro Definire la classe delle date del calendario con – Un costruttore che inizializzi la data al capodanno del 2000; – Un metodo che inizializzi la data con tre interi acquisiti da tastiera; – Un metodo che visualizzi la data; – Un metodo che faccia avanzare la data di una giornata. Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi la data con tre interi acquisiti da tastiera, faccia avanzare la data di 15 giorni ed infine visualizzi la data risultante. cin e cout Oggetti globali di I/O void Data::acquisisci() { cout << "Inserisci giorno: "; cin >> gg; cout << "Inserisci mese: "; cin >> mm; cout << "Inserisci anno: "; cin >> aa; } >> e << Operatori di flusso di I/O Definizione esterna alla classe Data::Data() { aa=2000; mm=1; gg=1; } :: operatore binario di risoluzione visibilità Definire la classe delle date del calendario con – Un costruttore che inizializzi la data al capodanno del 2000; – Un metodo che inizializzi la data con tre interi acquisiti da tastiera; – Un metodo che visualizzi la data; – Un metodo che faccia avanzare la data di una giornata. Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi la data con tre interi acquisiti da tastiera, faccia avanzare la data di 15 giorni ed infine visualizzi la data risultante. Definire la classe delle date del calendario con – Un costruttore che inizializzi la data al capodanno del 2000; – Un metodo che inizializzi la data con tre interi acquisiti da tastiera; – Un metodo che visualizzi la data; – Un metodo che faccia avanzare la data di una giornata. Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi la data con tre interi acquisiti da tastiera, faccia avanzare la data di 15 giorni ed infine visualizzi la data risultante. void Data::Stampa() { cout << gg << "/" << mm << "/" << aa << endl; } #include <iostream> using namespace std; class Data { public: Data(); // Costruttore void Acquisisci(); void Avanza(); void Stampa(); private: int aa, mm, gg; }; Mi invento un main() per testare le funzionalità fino a questo punto implementate int main() { Data d; d.Stampa(); d.Acquisisci(); d.Stampa(); } Data::Data() { aa=2000; mm=1; gg=1; } void Data::Acquisisci() { cout << "Inserisci giorno: "; cin >> gg; cout << "Inserisci mese: "; cin >> mm; cout << "Inserisci anno: "; cin >> aa; } void Data::Stampa() { cout << gg << "/" << mm << "/" << aa << endl; } void Data::Avanza() { – Un costruttore che inizializzi la data al capodanno del 2000; gg++; // incremento il giorno – Un metodo che inizializzi la data con tre interi acquisiti da tastiera; // NORMALIZZO: – Un metodo che visualizzi la data; // 1) Calcolo il nr di giorni – Un metodo che faccia avanzare la data di una giornata. // del mese indicato in mm Definire la classe delle date del calendario con Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi la data con tre interi acquisiti da tastiera, faccia avanzare la data di 15 giorni ed infine visualizzi la data risultante. // 2) se gg è maggiore dell’ultimo // giorno del mese pongo gg = 1 // ed incremento mm di uno // 3) se mm>12 incremento l’anno // e pongo mm=1 } 1) Per determinare il numero di giorni del mese devo disporre di un elenco contenente tali valori distinto per mese. L’array di interi seguente può essere utilizzato a tale scopo: int v[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; Occorre inoltre considerare che febbraio negli anni bisestili ha 29 giorni. Un anno è bisesto se: è multiplo di 400 oppure è divisibile per 4 ma non per 100. In C++ la condizione sottostante consente di valutare se un anno registrato nella variabile aa è bisesto o meno: ( ((aa % 400)==0) || ( ((aa % 4)==0) && ((aa % 100)!=0) ) ) void Data::Avanza() { – Un costruttore che inizializzi la data al capodanno del 2000; gg++; – Un metodo che inizializzi la data con tre interi acquisiti da tastiera; // 1) se mm==2 ed è un anno – Un metodo che visualizzi la data; // bisesto allora GiorniMese=29 – Un metodo che faccia avanzare la data di una giornata. // altrimenti GiorniMese=v[mm-1] Definire la classe delle date del calendario con Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi la data con tre interi acquisiti da tastiera, faccia avanzare la data di 15 giorni ed infine visualizzi la data risultante. // 2) . . . // 3) . . . } Per determinare se è un anno bisestile posso usare la funzione sottostante: bool Bisestile() { return (aa % 4 == 0 && aa % 100 != 0 || aa % 400 == 0); } Mentre per determinare il numero di giorni del mese posso usare questa funzione: int GiorniMese() { int v[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; if (mm==2 && Bisestile() ) return 29; else return v[mm-1]; } Definire la classe delle date del calendario con – Un costruttore che inizializzi la data al capodanno del 2000; – Un metodo che inizializzi la data con tre interi acquisiti da tastiera; – Un metodo che visualizzi la data; – Un metodo che faccia avanzare la data di una giornata. Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi la data con tre interi acquisiti da tastiera, faccia avanzare la data di 15 giorni ed infine visualizzi la data risultante. class Data { public: Data(); void Acquisisci(); void Avanza(); void Stampa(); private: int aa, mm, gg; bool Bisestile(); int GiorniMese(); }; Possiamo trasformare le funzioni Bisestile e GiorniMese in funzioni-membro private: bool Data::Bisestile() { if (aa % 4 == 0 && aa % 100 != 0 || aa % 400 == 0) return true; return false; } int Data::GiorniMese() { int v[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; if (mm==2 && Bisestile() ) return 29; else return v[mm-1]; } Definire la classe delle date del calendario con – Un costruttore che inizializzi la data al capodanno del 2000; – Un metodo che inizializzi la data con tre interi acquisiti da tastiera; – Un metodo che visualizzi la data; void Data::Avanza() – Un metodo che faccia avanzare la data di una giornata. { gg++; // 2) se gg è maggiore dell’ultimo // giorno del mese . . . // NORMALIZZA if (gg > GiorniMese()) // 1) . . . { gg=1; mm++; } // 3) se mm>12 incremento . . . if (mm > 12) { mm=1; aa++; } Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi la data con tre interi acquisiti da tastiera, faccia avanzare la data di 15 giorni ed infine visualizzi la data risultante. Volendo posso racchiudere la sequenza di istruzioni in un’ulteriore funzione-membro privata - ad esempio: void Data::Normalizza() } Definire la classe delle date del calendario con – Un costruttore che inizializzi la data al capodanno del 2000; – Un metodo che inizializzi la data con tre interi acquisiti da tastiera; – Un metodo che visualizzi la data; – Un metodo che faccia avanzare la data di una giornata. Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi la data con tre interi acquisiti da tastiera, faccia avanzare la data di 15 giorni ed infine visualizzi la data risultante. int main() { Data d; d.Acquisisci(); for (int i=1; i<=15; i++) d.Avanza(); d.Stampa(); }