Untitled

mail@pastecode.io avatar
unknown
c_cpp
3 years ago
6.8 kB
5
Indexable
Never
/*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;
}