domenica 2 novembre 2014

Compito di Gruppo

Compito sviluppato con la collaborazione della Classe per il programma Classe Frazione:
     nel dettaglio sviluppo del metodo "+=" e "-=":

#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
            Frazione operator +(Frazione a);
            Frazione operator -(Frazione a);
            Frazione operator *(Frazione a);
            Frazione operator /(Frazione a);
            void operator += (Frazione a);
    void operator -= (Frazione a);
    bool operator >(Frazione); //prototipo
   bool operator <(Frazione); //prototipo
   bool operator !=(Frazione a);
        int num;   //dichiarazione di una variabile di tipo intera
        int den;   //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;
    };

Frazione Frazione :: operator +(Frazione a)
      {
 Frazione b;
             b.den= this->den*a.den;
             b.num= (this->den*a.num)+(this->num*a.den);
             //b.Semplifica();
           return b;

 };
  Frazione Frazione :: operator -(Frazione a)
  {
  Frazione b;
             b.den= this->den*a.den;
             b.num= (this->den*a.num)-(this->num*a.den);
             //b.Semplifica();
           return b;
  };
  Frazione Frazione :: operator / (Frazione a)
  {
  Frazione b;

                b.den=this->den*a.num;
                b.num=this->num*a.den;
               // b.Semplifica();
                return b;
  };
      Frazione Frazione :: operator * (Frazione a)
      {
      Frazione b;

                b.den=this->den*a.den;
                b.num=this->num*a.num;
                //b.Semplifica();
                return b;

      };
void Frazione :: operator += (Frazione a)   //metodo per la somma tra frazioni con passaggio di oggetto a parametri (passeremo le due frazioni da sommare)
    {
        *this=a+*this;
    };
void Frazione :: operator -= (Frazione a)   //metodo per la somma tra frazioni con passaggio di oggetto a parametri (passeremo le due frazioni da sommare)
    {
        *this=a-*this;
        if(num==0)   //if per la visualizzazione del solo numeratore in caso di risultato uguale a 0
            {
                num=0;
                den=1;
            }
};
bool Frazione::operator >(Frazione a){

  bool ris=false;

  Frazione appoggio; //istanzio l'oggetto appoggio di classe frazione
  int fraz1=this->num*a.den;   // numeratore fraz1 * den fraz2
  int fraz2=this->den*a.num;   //numeratore fraz2 * den fraz1

  if(fraz1>fraz2)
      ris=true;

   return ris;

};
    bool Frazione::operator <(Frazione a){



    bool ris=false;

    Frazione appoggio;
    int fraz1=this->num*a.den;
    int fraz2=this->den*a.num;

     if(fraz1<fraz2)
      ris=true;

          return ris;


    };

bool Frazione::operator !=(Frazione a)
{
    bool x;
    if((a.num==num)&&(a.den==den))
    {
        x=0;
    }
    else
    {
        x=1;
    }
    return x;
}

main()
{
    int *scelta;
    int *modfraz;
    char mod;
    char *input;
    Frazione obj1;   //istanza oggetto obj1
    Frazione obj2;   //istanza oggetto obj2
    Frazione ris;
    cout<<"CALCOLATRICE PER FRAZIONI:"<<endl;
    scelta=new int;


        cout<<"Quale operazione vuoi eseguire? "<<endl;
        cout<<"1)Somma\n2)Sottrazione\n3)Moltiplicazione\n4)Divisione\n5)'+='\n6)'-='\n7)'>' o '<'\n8)'=' o '!='"<<endl;
        cout<<"Scegli 1-2-3-4-5-6-7-8: ";
        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: ris=obj1+obj2;   //metodo per somma
                        ris.visualizza();
                        break;
                case 2: ris=obj1-obj2;   //metodo per somma
                        ris.visualizza();
                        break;
                case 3: ris=obj1*obj2;   //metodo per somma
                        ris.visualizza();
                        break;
                case 4: ris=obj1/obj2;   //metodo per somma
                        ris.visualizza();
                        break;
                case 5: obj1+=obj2;   //metodo per somma
                        obj1.visualizza();
                        break;
                case 6: obj1-=obj2;   //metodo per somma
                        obj1.visualizza();
                        break;
                case 7: bool ris;
                        if(ris=obj1>obj2)cout<<endl<<"La prima frazione e' maggiore della seconda"<<endl;
                        if(ris=obj1<obj2)cout<<endl<<"La prima frazione e' minore della seconda"<<endl;
                        break;
                case 8: bool x;
                        ris=obj1!=obj2;
                        if(x==0)
                            cout<<"Le due Frazioni sono uguali"<<endl;
                        else
                            cout<<"Le due frazioni sono diverse"<<endl;
                        break;
                }
        delete scelta;
}