mercoledì 22 ottobre 2014

Esercizio su Classe Frazione

Creare una Classe Frazione che esegua le operazioni di somma, sottrazione, moltiplicazione e divisione tra frazioni:

#include <iostream>

using namespace std;

class Frazione{   //classe Frazione
    public:   //metodi pubblici
        Frazione();   //costruttore senza passaggio di parametri
        Frazione(int a,int b);   //costruttore con passaggio di due parametri di tipo intero per valore
        Frazione(int c);   //costruttore con passaggio di un parametro di tipo intero per valore
        void inserimento();   //metodo per l'inserimento dei dati num e den
        void visualizza();   //metodo per la visualizzazione dei dati inseriti
        void aggiorna();   //metodo per aggiornare i dati inseriti
        void somma(Frazione uno, Frazione due);   //metodo per la somma tra frazioni con passaggio di due parametri di tipo oggetto per valore
        void sottrazione(Frazione uno, Frazione due);   //metodo per la sottrazione tra frazioni con passaggio di due parametri di tipo oggetto per valore
        void moltiplicazione(Frazione uno, Frazione due);   //metodo per la moltiplicazione tra frazioni con passaggio di due parametri di tipo oggetto per valore
        void divisione(Frazione uno, Frazione due);   //metodo per la divisione tra frazioni con passaggio di due parametri di tipo oggetto per valore
    protected:   //proprietà protette
        int num;   //dichiarazione di una variabile di tipo intera
        int den;   //dichiarazione di una variabile di tipo intera
        int risnum;   //dichiarazione di una variabile di tipo intera
        int risden;   //dichiarazione di una variabile di tipo intera
    };

Frazione::Frazione()   //costruttore senza passaggio di parametri
    {
    num=1;
    den=1;
    };

Frazione::Frazione(int a, int b)   //costruttore con passaggio di parametri dove passo i valori dal main alle variabili a e b per valore
    {
    num=a;   //associo il contenuto puntato da a alla variabile num
    den=b;   //associo il contenuto puntato da b alla variabile den
    };

Frazione::Frazione(int c)   //costruttore con passaggio di parametri dove passo i valori dal main alla variabile c per valore
    {
    num=c;
    den=1;   //trattandosi di un intero dichiaro il denominatore uguale a 1
    };


void Frazione::inserimento()   //metodo per l'inserimento dei dati
    {
        cout<<"Inserisci il numeratore: "<<endl;
        cin>>num;
        do
        {
            cout<<"Inserisci il denominatore: "<<endl;
            cin>>den;
            if(den==0)   //se il denominatore e' uguale a 0 non accetto i dati inseriti e richiedo di ripetere l'inserimento
                cout<<"Il denominatore deve essere diverso da '0'"<<endl;
        }while(den==0);
    };

void Frazione::aggiorna()   //metodo per l'inserimento dei dati
    {
        cout<<"Inserisci il numeratore: "<<endl;
        cin>>num;
        do
        {
            cout<<"Inserisci il denominatore: "<<endl;
            cin>>den;
            if(den==0)   //se il denominatore e' uguale a 0 non accetto i dati inseriti e richiedo di ripetere l'inserimento
                cout<<"Il denominatore deve essere diverso da '0'"<<endl;
        }while(den==0);
    };

void Frazione::visualizza()   //metodo per visualizzare i dati inseriti
    {
        if(den!=1)   //se a denominatre c'è un valore diverso da uno allora è una frzione e visualizzo num/den
            cout<<"La frazione inserita e': "<<num<< "/" <<den<<endl;
        else   //altrimenti è un intero e visualizzo solo num
            cout<<"La frazione inserita e': "<<num<<endl;
    };

void Frazione::somma(Frazione uno, Frazione due)   //metodo per la somma tra frazioni con passaggio di oggetto a parametri (passeremo le due frazioni da sommare)
    {
        this->num=(uno.num*due.den)+(uno.den*due.num);   //(a*d+c*b)
        this->den=(uno.den*due.den);   //(b*d)
        risnum=this->num;
        risden=this->den;
        if(risnum==risden)
            {
                risnum=1;
                risden=1;
                cout<<"La SOMMA e': "<<risnum<<endl;
            }
        else
            cout<<"La SOMMA tra "<<uno.num<<"/"<<uno.den<<" e "<<due.num<<"/"<<due.den<<" e': "<<risnum<<"/"<<risden<<endl;
    };

void Frazione::sottrazione(Frazione uno, Frazione due)   //metodo per la sottrazione tra frazioni con passaggio di oggetto a parametri (passeremo le due frazioni da sommare)
    {
        this->num=(uno.num*due.den)-(uno.den*due.num);   //(a*d+c*b)
        this->den=(uno.den*due.den);   //(b*d)
        risnum=this->num;
        risden=this->den;
        if(risnum==0)
            {
                risnum=0;
                risden=1;
                cout<<"La SOTTRAZIONE e': "<<risnum<<endl;
            }
        else
            cout<<"La SOTTRAZIONE tra "<<uno.num<<"/"<<uno.den<<" e "<<due.num<<"/"<<due.den<<" e': "<<risnum<<"/"<<risden<<endl;
    };

void Frazione::moltiplicazione(Frazione uno, Frazione due)   //metodo per la moltiplicazione tra frazioni con passaggio di oggetto a parametri (passeremo le due frazioni da sommare)
    {
        this->num=uno.num*due.num;   //(a*c)
        this->den=(uno.den*due.den);   //(b*d)
        risnum=this->num;
        risden=this->den;
        if(risnum==risden)
            {
                risnum=1;
                risden=1;
                cout<<"La MOLTIPLICAZIONE e': "<<risnum<<endl;
            }
        else
            cout<<"La MOLTIPLICAZIONE tra "<<uno.num<<"/"<<uno.den<<" e "<<due.num<<"/"<<due.den<<" e': "<<risnum<<"/"<<risden<<endl;
    };

void Frazione::divisione(Frazione uno, Frazione due)   //metodo per la divisione tra frazioni con passaggio di oggetto a parametri (passeremo le due frazioni da sommare)
    {
        this->num=uno.num*due.den;   //(a*c)
        this->den=(uno.den*due.num);   //(b*d)
        risnum=this->num;
        risden=this->den;
        if(risnum==risden)
            {
                risnum=1;
                risden=1;
                cout<<"La DIVISIONE e': "<<risnum<<endl;
            }
        else
            cout<<"La DIVISIONE tra "<<uno.num<<"/"<<uno.den<<" e "<<due.num<<"/"<<due.den<<" e': "<<risnum<<"/"<<risden<<endl;
    };


main()
{
    int *scelta;
    int *modfraz;
    char mod;
    char *input;
    Frazione obj1;   //istanza oggetto obj1
    Frazione obj2;   //istanza oggetto obj2

    cout<<"CALCOLATRICE PER FRAZIONI:"<<endl;
    scelta=new int;


        cout<<"Quale operazione vuoi eseguire? "<<endl;
        cout<<"1)Somma\n2)Sottrazione\n3)Moltiplicazione\n4)Divisione"<<endl;
        cout<<"Scegli 1-2-3-4: ";
        cin>>*scelta;
        cout<<endl;
        obj1.inserimento();   //metodo per inserimento in oggetto obj1
        obj2.inserimento();   //metodo per inserimento in oggetto obj2
        cout<<"Dati inseriti: "<<endl;
        obj1.visualizza();   //metodo per visualizzare dati inseriti in obj1
        obj2.visualizza();   //metodo per visualizzare dati inseriti in obj2
        Frazione risultato;   //istanza oggetto risultato

        input=new char;
        do
        {
            cout<<"Vuoi modificare i dati inseriti? (s/n)";
            cin>>*input;
        }while(((*input=='S')&&(*input=='s'))&&((*input!='n')&&(*input!='N')));
        if((*input=='s')||(*input=='S'))
        {
            modfraz=new int;
            do{
                cout<<endl<<"Quale frazione vuoi modificare? (1/2)";
                cin>>*modfraz;
                if(*modfraz==1)
                    obj1.aggiorna();
                else
                    if(*modfraz==2)
                        obj2.aggiorna();
                    else
                        cout<<endl<<"Scelta non valida"<<endl;
            }while((*modfraz!=1)&&(*modfraz!=2));
            delete modfraz;
        }
        else
            if((*input!='n')&&(*input!='N'))
                cout<<"Scelta non valida"<<endl;
        delete input;

        switch (*scelta)
            {
                case 1: risultato.somma(obj1, obj2);   
                        break;
                case 2: risultato.sottrazione(obj1, obj2);   
                        break;
                case 3: risultato.moltiplicazione(obj1,obj2);
                        break;
                case 4: risultato.divisione(obj1,obj2);
                        break;
            }
        delete scelta;

}