Untitled
unknown
c_cpp
4 years ago
6.8 kB
8
Indexable
/*ESERCIZIO 2 * 2) Classe data Realizzare una classe che tiene traccia di una data. La classe ha la variabili intere giorno, mese e anno.Il costruttore che prende in ingresso queste tre variabili(esempio: Data(23, 07, 2018) Realizzare i metodi getter e setter per tutte le variabili membro della classe che devono essere private.Durante l'assegnazione controllare che il giorno non sia maggiore di 31, il mese non superi 12 e la data sia maggiore di 2000. Tutte le variabili devono comunque essere maggiori di 0. Sovraccaricare gli operatori di output << , di assegnazione = e di confronto > , < , == . Scrivere un semplice programma nel main che provi la classe. Esempio di test : #include "ClasseData.cpp" int main() { Data d1 = Data(2, 4, 2010); cout << "d1: " << d1 << endl; Data d2 = Data(-1, -1, 1999); cout << "d2: " << d2 << endl; Data d3 = Data(32, 13, 2018); cout << "d3: " << d3 << endl; d1.setAnno(0); d1.setGiorno(0); d1.setMese(0); cout << "d1: " << d1 << endl; cout << "(d1 == d2): " << (d1 == d2) << endl; cout << "(d3 > d2): " << (d3 > d2) << endl; cout << "(d1 < d2): " << (d1 < d2) << endl; d1.setAnno(2018); d1.setGiorno(15); d1.setMese(6); cout << "d1: " << endl; cout << "Giorno: " << d1.getGiorno() << endl; cout << "Mese: " << d1.getMese() << endl; cout << "Anno: " << d1.getAnno() << endl; d1.setAnno(2000); d1.setGiorno(32); d1.setMese(13); cout << "d1: " << d1 << endl; return 0; } */ #include <iostream> using namespace std; class Data { public: Data() {} //Costruttore di default solo per poter inizializzare le variabili Data(int giorno, int mese, int anno) { //Costruttore necessario per poter poi utilizzare l' overloading degli operatori if (checkCostruttore(giorno, mese, anno) == 1) { this->giorno = giorno; this->mese = mese; this->anno = anno; } else { this->giorno = NULL; this->mese = NULL; this->anno = NULL; } } void setGiorno(int giorno) { //Controllo che il giorno non sia più grande del valore 31 e che non sia minore di 0 if (giorno > 0 && giorno <= 31) this->giorno = giorno; //Supponiamo che l' utente inizializzi fin da subito il valore sbagliato del giorno, voglio non rompere il programma e farglielo reinserire else { checkGiorno(0, 31); } } void setMese(int mese) { //Controllo che il mese non sia più grande del valore 12 e che non sia minore di 0 if (mese > 0 && mese <= 12) this->mese = mese; //Supponiamo che l' utente inizializzi fin da subito il valore sbagliato del mese, voglio non rompere il programma e farglielo reinserire else { checkMese(0, 12); } } void setAnno(int anno) { //Controllo che il anno non sia più grande del valore 2000 e che non sia minore di 0 if(anno > 0 && anno <= 2000) this->anno = anno; //Supponiamo che l' utente inizializzi fin da subito il valore sbagliato dell' anno, voglio non rompere il programma e farglielo reinserire else { checkAnno(0, 2000); } } int getGiorno() { return this->giorno; } int getMese() { return this->mese; } int getAnno() { return this->anno; } void checkGiorno(int x, int y) { do { cout << "Inserisci valore giorno = " << endl; int tmp = 0; cin >> tmp; this->giorno = tmp; } while (getGiorno() <= x || getGiorno() > y); } void checkMese(int x, int y) { do { cout << "Inserisci valore mese = " << endl; int tmp = 0; cin >> tmp; this->mese = tmp; } while (getMese() <= x || getMese() > y); } void checkAnno(int x, int y) { do { cout << "Inserisci valore anno = " << endl; int tmp = 0; cin >> tmp; this->anno = tmp; } while (getAnno() <= x || getAnno() > y); } int checkCostruttore(int giorno, int mese, int anno) { if (giorno >= 0 && giorno <= 31 && mese >= 0 && mese <= 12 && anno >= 0 && anno <= 2000) return 1; else { cout << "Valori non inizializzati nel costruttore, perche' le istanze sommate superano i range, abbassare i valori!" << endl; return 0; } } void compare(int giorno1, int giorno2, int mese1, int mese2, int anno1, int anno2) { //ATTENZIONE CON GLI IF, USANDO I VARI ELSE IF APPENA SODDISFO UN SOLO IF, SALTO DIRETTAMENTE ALLA FINE, MA IO VOGLIO ESEGUIRLI TUTTI if (giorno1 > giorno2) cout << "La prima data ha valore del giorno piu' grande" << endl; if (giorno1 < giorno2) cout << "La seconda data ha un valore del giorno piu' grande" << endl; if (giorno1 == giorno2) cout << "Entrambe le data hanno lo stesso valore del giorno" << endl; if (mese1 > mese2) cout << "La prima data ha valore del mese piu' grande" << endl; if (mese1 < mese2) cout << "La seconda data ha un valore del mese piu' grande" << endl; if (mese1 == mese2) cout << "Entrambe le data hanno lo stesso valore del mese" << endl; if (anno1 > anno2) cout << "La prima data ha valore del anno piu' grande" << endl; if (anno1 < anno2) cout << "La seconda data ha un valore del anno piu' grande" << endl; if (anno1 == anno2) cout << "Entrambe le data hanno lo stesso valore del anno" << endl; } private: int giorno; int mese; int anno; }; //Overloading operatori inline Data operator + (Data& istanza1, Data& istanza2) { int giornoTotale = istanza1.getGiorno() + istanza2.getGiorno(); int meseTotale = istanza1.getMese() + istanza2.getMese(); int annoTotale = istanza1.getAnno() + istanza2.getAnno(); Data istanza3 = Data(giornoTotale, meseTotale, annoTotale); return istanza3; } inline bool operator == (Data& istanza1, Data& istanza2) { istanza1.compare ( istanza1.getGiorno(), istanza2.getGiorno(), istanza1.getMese(), istanza2.getMese(), istanza1.getAnno(), istanza2.getAnno()); return true; } //Overloading in output inline ostream& operator << (ostream& out, Data& istanza) { out << istanza.getGiorno() << " " << istanza.getMese() << " " << istanza.getAnno() << endl; return out; }
Editor is loading...