Untitled
unknown
c_cpp
4 years ago
6.8 kB
10
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...