Problema Nel Minimo Comune Multiplo ,massimo e riduzione

di il
7 risposte

Problema Nel Minimo Comune Multiplo ,massimo e riduzione

Buongiorno ragazzi sono alle prese con un esercizio sulla classe frazione.
Mi sono imbattuto sulle tre funzioni che ho scritto nel titolo e ho delle domande , non voglio che me lo risolviate voi ovviamente voglio solo capire se quello che metterò sia conveniente o meno , il problema che mi affligge è quello principale di tutte e tre le funzioni....
1)la scomposizione del numero è meglio che la inserisco in un vettore?per i due oggetti?
2)Posso fare un vettore in qui all'interno ipoteticamente ci stia un altro vettore se ci fosse ad esempio 2^3?
3)in un ciclo for ,posso scrivere un comando del genere?..for(int i=2;i<11;i={3,5,7,11}) ?

7 Risposte

  • Re: Problema Nel Minimo Comune Multiplo ,massimo e riduzione

    1) non ho capito

    2) in cui ... anche questo non è chiaro.

    3) No, ma puoi usare un vettore con tutti quei valori e la for con un indice che punta ai valori del vettore
  • Re: Problema Nel Minimo Comune Multiplo ,massimo e riduzione

    La scomposizione del numero può dare un numero primo un tot di volte , ad esempio 2*2*2*3..come vedi il due è ripetuto 3 volte , queste tre volte come le inserisco in un vettore.... il numero due è stato contato 3 volte il 3 una sola volta ....
    parliamoci chiaro il minimo comune multiplo considera i numeri comuni con il MAGGIORE esponente... quindi se ci fosse un 3 che è ripetuto 2 volte e un altro che è ripetuto 3 volte vado a considerare il 3^3....
    Comprendo che è un pò difficile dire un mio problemino ,però...


    ---------
    l'indice che punta a un vettore non l'ho mai fatto in un ciclo for ma è una bella idea...per caso devo dichiarare l'indice puntatore e puntarlo al vettore di 5 elementi?
    ---------
    perdonami se non cogli sul momento ciò che voglio dire
  • Re: Problema Nel Minimo Comune Multiplo ,massimo e riduzione

    Mi dà diversi errori... dice che non può inizializzare la funzione friend operator...(tutti i ridefinitori..perchè?!)
    //Classe Completa Sulle Frazioni
    #include<iostream>
    using namespace std;
    
    class frazione
    {
          private :
          int num,dem;
          public :
          //Costruttore e Distruttori
          frazione();
          ~frazione();
          //Setta il numeratore e il denominatore
          void set_num(int);
          void set_dem(int);
          //Riduzione
          void riduzione();
          //Tipo Di Frazione---->Propria,Impropria,Apparente,Unitaria,Decimale,Diadica,Egizia(?)
          void tipo();
          //Confronto Fra Due Frazioni---->Stesso Denominatore,Numeratore,Numeratore e Denominatore Diversi
          friend void confronto(frazione,frazione);
          //mcm e MCD
          friend int minimo(frazione,frazione);
          friend int massimo(frazione,frazione);
          //Ridefinitori cin e cout
          friend istream &operator>> ( istream &cin,frazione &x);
          friend ostream &operator<< ( ostream &cout,frazione &x);
          //Ridefinitori Di Operatori
          friend frazione operator+(frazione,frazione);
          friend frazione operator-(frazione,frazione);
          friend frazione operator/(frazione,frazione);
          friend frazione operator*(frazione,frazione);      
    };  
    
    //Sviluppo Del Costruttore Di Default e il Distruttore
    frazione::frazione()
    {
       num=0;
       dem=1;                            
    }
    
    frazione::~frazione()
    {
       cout<<"l'oggetto della classe e' stato eliminato "<<endl;
    }
    
    //Sviluppo del settaggio del numeratore e del denominatore 
    void frazione::set_num(int x)
    {
         num=x;
    }
    
    void frazione::set_dem(int x)
    {
         dem=x;
    }
    
    //Sviluppo Della Riduzione di una frazione
    void frazione::riduzione()
    {
         int v[6]={2,3,5,7,11,13};    
         
         int i=0;   
         while(i<5)
         { 
           while((num%v[i]==0)&&(dem%v[i]==0))      //IN CASO DI ERRORE INVERTI LA CONDIZIONE !=...  
            { num=num/v[i]; dem=dem/v[i]; }                                                 
           i++;        
         }   
             
    }
    
    //Sviluppo Del Tipo Di Frazione(con un oggetto) : Propria,Impropria,Apparente,Unitaria,Diadica
    void frazione::tipo()
    {
         int t=0;
         
         if(num<dem)
           cout<<"e' una frazione PROPRIA poiche' il numeratore e' minore del denominatore "<<endl;
         if(num>=dem)
           cout<<"e' una frazione IMPROPRIA poiche' il numeratore e' maggiore o uguale al denominatore "<<endl; 
         if(num==1)
           cout<<"e' una frazione UNITARIA poiche' il numeratore e' uguale a 1 "<<endl;
         if((num%dem==0)&&(num==dem))
           cout<<"e' una frazione APPARENTE poiche' il numeratore e' uguale al denominatore o e' multiplo del denominatore "<<endl;
         
         for(int i=1;(i<128)||(t==1);i*2)
           {if(dem==i)
             t=1;}
         if(t==1)
            cout<<"e' una funzione DIADICA poiche' il denominatore e' una potenza del due(arriva il conteggio fino a 128)"<<endl;    
    }     
    
    //Confronto Fra Due Frazioni---->Stesso Denominatore,Numeratore,Propria o Impropria
    void confronto(frazione a,frazione b)
    {
         if(a.dem==b.dem){
           if(a.num>b.num)
             cout<<"la prima frazione e' maggiore alla seconda frazione "<<endl;
           else
            if(b.num>a.num) 
             cout<<"la seconda frazione e' maggiore della prima frazione "<<endl;  
            else 
             cout<<"le due frazioni sono uguali "<<endl;
         }
             
             
         if(a.num==b.num){
           if(a.dem<b.dem)
             cout<<"la prima frazione e' maggiore della seconda "<<endl;
           else
             if(b.dem<a.dem)
              cout<<"la seconda frazione e' maggiore della prima "<<endl;
             else
              cout<<"le due frazioni sono uguali "<<endl;     
         }
         
         //la frazione IMPROPRIA e' sempre maggiore di 1
         int c,f;
         c=a.num/a.dem; f=b.num/b.dem;
         
         if(c>f)
          cout<<"la prima frazione e' maggiore della seconda "<<endl;
         else
          if(f>c)
           cout<<"la seconda frazione e' maggiore della prima "<<endl;
          else 
           cout<<"le due frazioni sono uguali "<<endl;
         
    }
    
    //Sviluppo Del Minimo Comune Multiplo e Massimo Comun Divisore
    int minimo(frazione a,frazione b) 
    {   int v[6]={2,3,5,7,11,13}; 
        int i=0,cont=0; int va[6],vb[6],vc[6]; 
    
        
        if(a.dem%b.dem==0)
         return a.dem;
       
        if(b.dem%a.dem==0)
         return b.dem;
         
        if((a.dem%b.dem!=0)&&(b.dem%a.dem!=0))
        {
           while(i<5)
           {
             while(a.dem%v[i]==0)
             {                   
                                 a.dem=a.dem/v[i]; 
                                 cont++;
             }
             
             va[i]=cont;
             cont=0;  
             
             i++;
           }
           
           cont=0; i=0;
           while(i<5)
           {
             while(b.dem%v[i]==0)
             {                   
                                 b.dem=b.dem/v[i]; 
                                 cont++;
             }
             
             vb[i]=cont;
             cont=0;  
             
             i++;
           }
           
           int mcm=1;
           for(i=0;i<5;i++)
           { 
                           if(va[i]>vb[i])
                            vc[i]=va[i];
                           else
                            if(vb[i]<va[i])
                             vc[i]=vb[i]; 
                            else
                             vc[i]=va[i];
           }     
           
           i=0; int j=0;
           while(i<5)
           {
                     
                     while(j==vc[i]){
                      mcm=mcm*v[i];
                      j++;}
                     j=0;
                     
                     i++;
           }                              
           return mcm;                                    
                                                                                                              
        }
         
    
          
    }
    
    int massimo(frazione a,frazione b)
    {
         int v[6]={2,3,5,7,11,13}; 
        int i=0,cont=0; int va[6],vb[6],vc[6]; 
    
        
        if((a.dem%b.dem!=0)&&(a.dem<b.dem))
         return a.dem;
       
        if((b.dem%a.dem!=0)&&(b.dem<a.dem))
         return b.dem;
         
        if((a.dem%b.dem!=0)&&(b.dem%a.dem!=0))
        {
           while(i<5)
           {
             while(a.dem%v[i]==0)
             {                   
                                 a.dem=a.dem/v[i]; 
                                 cont++;
             }
             
             va[i]=cont;
             cont=0;  
             
             i++;
           }
           
           cont=0; i=0;
           while(i<5)
           {
             while(b.dem%v[i]==0)
             {                   
                                 b.dem=b.dem/v[i]; 
                                 cont++;
             }
             
             vb[i]=cont;
             cont=0;  
             
             i++;
           }
           
           int mcd=1;
           for(i=0;i<5;i++)
           { 
                           if((va[i]<vb[i])&&(va[i]>=1)&&(vb[i]>=1))
                            vc[i]=va[i];
                           else
                            if((vb[i]<va[i])&&(va[i]>=1)&&(vb[i]>=1))
                             vc[i]=vb[i]; 
                            else
                             vc[i]=0;
           }     
           
           i=0; int j=0;
           while(i<5)
           {
                     
                     while(j==vc[i]){
                      mcd=mcd*v[i];
                      j++;}
                     j=0;
                     
                     i++;
           }                              
           return mcd;                                    
                                                                                                              
        }    
    }
    
    //Sviluppo Dei Ridefinitori del cin e cout
    friend istream &operator>>( istream &cin,frazione &x)
    {
           cout<<"inserisci il numeratore dell'oggetto : "; cin>>x.num; cout<<endl;
           cout<<"inserisci il denominatore dell'oggetto : "; cin>>x.dem; 
           return cin;
    }
    
    friend ostream &operator<< ( ostream &cout,frazione &x)
    {
           cout<<x.num<<endl;
           cout<<"-"<<endl;
           cout<<x.dem<<endl;
           return cout;
           
    }
    
    //Sviluppo dei ridefinitori degli operatori
    
    friend frazione operator+(frazione a,frazione b)
    {
          frazione C();
          
          C.dem=a.dem*b.dem;
          C.num=((a.num*b.dem)+(a.dem*b.num));
          
          return C;     
    }
    
    friend frazione operator-(frazione a,frazione b)
    {
          frazione C();
          
          C.dem=a.dem*b.dem;
          C.num=((a.num*b.dem)-(a.dem*b.num));
          
          return C;      
    }
    
    friend frazione operator/(frazione a,frazione b)
    {
          int c; frazione C();
          
          c=b.num;
          b.num=b.dem;
          b.dem=c;
          
          C.num=a.num*b.num;
          C.dem=b.num*b.dem;
          
          return C;    
    }
    
    friend frazione operator*(frazione a,frazione b)
    {
          frazione C();
          
          C.num=a.num*b.num;
          C.dem=a.dem*b.dem;
          
          return C;       
    }
    
    //Sviluppo del Main
    int main()
    {   
        int r; char oggetto; frazione a,b,c; int n,d;
        
        cin>>a; a.riduzione(); cout<<endl; cout<<"-----------------"<<endl;
        cin>>b; b.riduzione(); cout<<endl; cout<<"-----------------"<<endl;
        
        system("pause"); system("cls");
        
        do{
                         cout<<" ---------------MENU---------------- "<<endl;
                         cout<<" 1.Set Numeratore "<<endl;
                         cout<<" 2.Set Denominatore "<<endl;
                         cout<<" 3.Tipo Di Frazione "<<endl;
                         cout<<" 4.Confronto Tra le due Frazioni "<<endl;
                         cout<<" 5.Minimo Comune Multiplo tra due frazioni "<<endl;
                         cout<<" 6.Massimo Comune Divisore tra due frazioni "<<endl;
                         cout<<" 7.Visualizzazione Frazione "<<endl;
                         cout<<" 8.Somma Tra due frazioni (Ridotto)"<<endl;
                         cout<<" 9.Sottrazione Tra due frazioni (Ridotto)"<<endl;
                         cout<<" 10.Divisione Tra due frazioni (Ridotto)"<<endl;
                         cout<<" 11.Moltiplicazioni Tra due frazioni (Ridotto)"<<endl;
                         cout<<" 12.USCITA DAL PROGRAMMA "<<endl;
                         cout<<" ---------------------------------- "<<endl;
                         cout<<" Inserisci l'opzione che desideri : "; cin>>r; cout<<endl;
                         
                         switch(r)
                         {
                                  case 1:{ cout<<"di quale oggetto vuoi settare il numeratore :"; cin>>oggetto; cout<<endl; 
                                           if(oggetto=='a'){
                                             cout<<"inserisci il nuovo numeratore "<<endl; cin>>n;
                                             a.set_num(n);}
                                           else{cout<<"inserisci il nuovo numeratore "<<endl; cin>>n;
                                             b.set_num(n);
                                       break;}
                                  case 2:{ cout<<"di quale oggetto vuoi settare il denominatore :"; cin>>oggetto; cout<<endl; 
                                           if(oggetto=='a'){
                                             cout<<"inserisci il nuovo denominatore "<<endl; cin>>d;
                                             a.set_dem(d);}
                                           else{cout<<"inserisci il nuovo denominatore "<<endl; cin>>d;
                                             b.set_dem(d);}
                                       break;}
                                  case 3:{ cout<<"di quale oggetto vuoi settare verificare il tipo di frazione :"; cin>>oggetto; cout<<endl; 
                                           if(oggetto=='a')
                                             a.tipo();
                                           else
                                             b.tipo();
                                       break;}
                                  case 4:{ confronto(a,b);
                                       break;}
                                  case 5:{ cout<<"il minimo comune multiplo tra le due frazioni e' : "<<minimo(a,b);
                                       break;}
                                  case 6:{ cout<<"il massimo comun divisore tra le due frazioni e' : "<<massimo(a,b);
                                       break;}
                                  case 7:{ cout<<"di quale oggetto vuoi visualizzare la frazione : "; cin>>oggetto; cout<<endl; 
                                           if(oggetto=='a')
                                             cout<<a;
                                           else
                                             cout<<b;
                                       break;}
                                  case 8:{ c=a+b;
                                           c.riduzione();
                                           cout<<" la somma tra le due frazioni e' : "; cout<<c;
                                       break;}
                                  case 9:{ c=a-b;
                                           c.riduzione();
                                           cout<<" la sottrazione tra le due frazioni e' : "; cout<<c;
                                       break;}
                                  case 10:{ c=a/b;
                                           c.riduzione();
                                           cout<<" la divisione tra le due frazioni e' : "; cout<<c;
                                       break;}
                                  case 11:{ c=a*b;
                                            c.riduzione();
                                            cout<<" la moltiplicazione tra le due frazioni e' : "; cout<<c;
                                       break;}
                                  
                                  case 12:{exit(1);
                                       break;}
                                  
                                  default :{ cout<<" Hai sbagliato l'opzione l'opzione..."<<endl; break;}
                         }                                                                 
                                           
        }while(r!=12);
        
       
        
      
        
        return 0;
    }
    
    edit 1 :ok nello sviluppo dei definitori non devo mettere friend .. una svista
    edit 2: inserendo il distruttore viene richiamato da solo come mai???
  • Re: Problema Nel Minimo Comune Multiplo ,massimo e riduzione

    Allora:

    1) minimo comune multiplo: OK (LCM)
    2) massimo -> massimo divisore comune (GCD)
    3) riduzione -> riduzione del numerotore, denominatore ai minimi termini.

    Tanto per usare una terminologia comprensibile.

    Iniziamo con la proprieta' banale: siano A, B due interi, e LCM(A,B) e GCD(A,B) rispettivamente 1) e 2), allora hai che:

    A*B = LCM(A,B)*GCD(A,B)

    La tua frazione A/B viene ridotta ai minimi termini quando hai:

    (A / GCD(A,B)) / (B / GCD(A,B))

    Il GCD lo puoi calcolare come hai inizialmente descritto, ma e' complicato, perche' devi cercare i fattori PRIMI del numero, e trovare i numeri PRIMI e' complicato.

    Ad esempio, riduci ai minimi termini la seguente frazione:

    1073741827 / 3221225473

    (i numeri sono grandi, ma comunque rappresentabili mediante un intero a 32 bit)

    oppure

    4611686018427388039 / 27670116110564327479

    (rappresentabili con interi a 64 bit).

    Nota: io conosco la frazione ridotta ai minimi termini
    Quindi se ti cimenti, e non sei sicuro del risultato, postalo e ti dico se e' corretto

    Invece c'e' un modo DECISAMENTE piu' semplice, ed inventato qualcosa come 2300 anni fa : l'Algoritmo di Euclide

    https://it.wikipedia.org/wiki/Algoritmo_di_Euclid


    Piccola nota implementativa: la tua implementazione potrebbe anche andare bene, ma da un punto di vista filosofico no.
    Il problema e' questo:

    concettualmente una frazione e' un numero, come un intero, un numero in floating point, molto piu' simile ad una stringa,
    cioe' un oggetto immutabile: una volta che lo hai istanziato, quello e' e non cambia.

    Quindi, quando crei una frazione, la crei GIA' con un numeratore ed un denominatore (che passi nel costruttore).
    Tra l'altro, puoi anche non passare il denominatore, che sara', per default, 1,
    Ed ovviamente devi controllare che il denominatore NON SIA MAI zero.

    NON TI SERVONO I SETTER, mentre ti sono utili i GETTER.

    Inoltre, la riduzione dovrebbe esser automatica.
    Quindi, anche se tu scrivi:
    
    frazione f;
    
    f = frazione(1,2);
    f = frazione(2,4);
    f = frazione (4000000000,8000000000)
    
    stai facendo riferimento SEMPRE alla frazione 1/2.

    Poi ci sono altre cose strane:

    tipo() non ritorna nulla, e quindi a che serve?
    confronto() non ritorna nulla, e quindi come fai a conoscere il risultato del confronto?
    perche' gli operatori +/-/*/.. sono funzioni? Implementali come operatori della classe
    mancano le operazioni con gli interi (almeno int), e cioe' frazione+int, int+frazione, ecc
    mancano gli operatori di confronto (==, !=, <, <=, >=, >) tra frazione ed frazioni/interi
  • Re: Problema Nel Minimo Comune Multiplo ,massimo e riduzione

    Hai completamente ragione :
    1)la somma l'ho fatta solamente tra frazioni e non con gli interi per il semplice fatto che la prof mi ha detto che la vuole solo tra frazioni
    2)gli operatori di confronto ora che ci penso è molto meglio farli con i classi operatori(==, !=, <, <=, >=, >) eliminando quindi il confronto...
    3)con il tipo non voglio ritornare qualcosa ma semplicemente dire di che tipo di frazione abbiamo davanti...
    4)nonostante piccoli aggiustamenti non mi risulta il minimo comune multiplo , pensa che con 3/4 e 8/7 il minimo è 165 e non capisco perchè....
    5)per il massimo devo vedere e capire l'algoritmo che non ho afferrato bene il concetto
    6)i set li uso per cambiare un singolo numeratore o denominatore...
    7) i get li ho uniti nel cout
    8)per la riduzione non mi posto il problema che un numero sia enorme...

    è da stamattina che sono alla presa con questo esercizio , non è completo come ho scritto .... per il resto ok!

    EDIT : ah ok ho capito l'algoritmo di euclide ahah
    int massimo(frazione a,frazione b)
    {
          while(a.dem!=b.dem)
          {
             if(a.dem>b.dem)
              a.dem=a.dem-b.dem;
             else
              b.dem=b.dem-a.dem;                
          }
          return a.dem;  
    }
    
    EDIT2: fatto anche il minimo comune multipli alleluja...ho inserito delle visualizzazioni ad ogni passo -.-
    EDIT 3: Completato , se c'è qualcuno che dà consigli accetto volentieri
  • Re: Problema Nel Minimo Comune Multiplo ,massimo e riduzione

    Chiamali con il loro nome, o con gli acronimi che si usano di solito (in inglese o in italiano) perche' indicandolo SOLO con minimo o massimo, non si capische na cippa.

    Il Minimo Comune Multipl NON PUO' ESSERE 165!!!!!!

    165 e' divisibile per 5 e tu non hai nessun fattore 5 tra i tuoi numeri, QUINDI NON PUO' IN NESSUN POSSIBILE MODO 165!

    Ma e' pure peggio, ora che controllo: 165 = 3*5*11 e non essendoci nemmeno l'11, HAI CANNATO alla grande
  • Re: Problema Nel Minimo Comune Multiplo ,massimo e riduzione

    Si lo so infatti l'ho sistemato alla fine ahahah

    eccolo
    #include<iostream>
    using namespace std;
    
    class frazione
    {
          private :
          int num,dem;
          public :
          //Costruttore di default
          frazione();
          //Setta il numeratore e il denominatore
          void set_num(int);
          void set_dem(int);
          //Riduzione
          void riduzione();
          //Tipo Di Frazione---->Propria,Impropria,Apparente,Unitaria,Diadica
          void tipo();
          //Confronto Fra Due Frazioni---->Stesso Denominatore,Numeratore,Numeratore e Denominatore Diversi
          friend frazione operator>(frazione,frazione);
          friend frazione operator<(frazione,frazione);
          friend int operator!=(frazione,frazione);
          friend int operator==(frazione,frazione);
          //mcm e MCD
          friend int minimo(frazione,frazione);
          friend int massimo(frazione,frazione);
          //Ridefinitori cin e cout
          friend istream & operator >> ( istream & cin, frazione & x);
          friend ostream & operator << ( ostream & cout, frazione & x);
          //Ridefinitori Di Operatori
          friend frazione operator+(frazione,frazione);
          friend frazione operator-(frazione,frazione);
          friend frazione operator/(frazione,frazione);
          friend frazione operator*(frazione,frazione);      
    };  
    
    
    
    //Sviluppo Del Costruttore Di Default e il Distruttore
    frazione::frazione()
    {
       num=0;
       dem=1;                            
    }
    
    
    
    //Sviluppo del settaggio del numeratore e del denominatore 
    void frazione::set_num(int x)
    {
         num=x;
    }
    
    void frazione::set_dem(int x)
    {
         dem=x;
    }
    
    //Sviluppo Della Riduzione di una frazione
    void frazione::riduzione()
    {
         int v[6]={2,3,5,7,11,13};    
         
         int i=0;   
         while(i<5)
         { 
           while((num%v[i]==0)&&(dem%v[i]==0))      
            { num=num/v[i]; dem=dem/v[i]; }                                                 
           i++;        
         }   
             
    }
    
    //Sviluppo Del Tipo Di Frazione(con un oggetto) : Propria,Impropria,Apparente,Unitaria,Diadica
    void frazione::tipo()
    {
         int t=0;
         
         if(num<dem)
           cout<<"e' una frazione PROPRIA poiche' il numeratore e' minore del denominatore "<<endl;
         if(num>=dem)
           cout<<"e' una frazione IMPROPRIA poiche' il numeratore e' maggiore o uguale al denominatore "<<endl; 
         if(num==1)
           cout<<"e' una frazione UNITARIA poiche' il numeratore e' uguale a 1 "<<endl;
         if((num%dem==0)&&(num==dem))
           cout<<"e' una frazione APPARENTE poiche' il numeratore e' uguale al denominatore o e' multiplo del denominatore "<<endl;
         
         int i=1;
         while((i<128)||(t==0))
         {
           if(dem==i)
             t=1;
            i=i*2; 
         }
         
         if(t==1)
            cout<<"e' una funzione DIADICA poiche' il denominatore e' una potenza del due(arriva il conteggio fino a 128)"<<endl;  
    }     
    
    //Confronto Fra Due Frazioni---->Stesso Denominatore,Numeratore,Propria o Impropria
    frazione operator>(frazione a,frazione b)
    {    
        int prima_frazione,seconda_frazione;
        
        prima_frazione=a.num*b.dem;
        seconda_frazione=b.num*a.dem;
        
        if(prima_frazione>seconda_frazione)
          return a;
        else
        if(seconda_frazione>prima_frazione)
          return b;
        else
          return a; 
    }
    
    frazione operator<(frazione a,frazione b)
    {
        int prima_frazione,seconda_frazione;
        
        prima_frazione=a.num*b.dem;
        seconda_frazione=b.num*a.dem;
        
        if(prima_frazione<seconda_frazione)
          return a;
        else
        if(seconda_frazione<prima_frazione)
          return b;
        else
          return a; 
    }
    
    int operator==(frazione a,frazione b)
    {
             if((a.num==b.num)&&(a.dem==b.dem))
               return 1;
             else
               return 0;
    }
    
    int operator!=(frazione a,frazione b)
    {    
            if((a.num!=b.num)&&(a.dem!=b.dem))
               return 1;
            else
               return 0;
    }
    
    //Sviluppo Del Minimo Comune Multiplo e Massimo Comun Divisore
    int minimo(frazione a,frazione b) 
    {   
        int v[6]={2,3,5,7,11,13}; 
        int i=0,cont=0; int va[6],vb[6],vc[6]; 
    
        
        if(a.dem%b.dem==0)
         return a.dem;
       
        if(b.dem%a.dem==0)
         return b.dem;
         
        if((a.dem%b.dem!=0)&&(b.dem%a.dem!=0))
        {
           while(i<6)
           {
             while(a.dem%v[i]==0)
             {                   
                                 a.dem=a.dem/v[i]; 
                                 cont++;
             }
             
             va[i]=cont;
             cont=0;  
             
             i++;
           }
       
            
           cont=0; i=0;
           while(i<6)
           {
             while(b.dem%v[i]==0)
             {                   
                                 b.dem=b.dem/v[i]; 
                                 cont++;
             }
             
             vb[i]=cont;
             cont=0;  
             
             i++;
           }
         
           
        
           for(i=0;i<6;i++)
           { 
                           if(va[i]>vb[i])
                            vc[i]=va[i];
                           else
                            if(vb[i]>va[i])
                             vc[i]=vb[i]; 
                            else
                             vc[i]=va[i];
           }     
      
            
           i=0; int j=1; int mcm=1;
           while(i<6)
           {
                     
                     while((j<=vc[i])&&(vc[i]!=0)){
                      mcm=mcm*v[i]; 
                      j++;} 
                     j=1;
                     
                     i++;
           }                              
           return mcm;                                    
                                                                                                              
        }
         
    
          
    }
    
    int massimo(frazione a,frazione b)
    {
          while(a.dem!=b.dem)
          {
             if(a.dem>b.dem)
              a.dem=a.dem-b.dem;
             else
              b.dem=b.dem-a.dem;                
          }
          return a.dem;  
    }
    
    
    
    //Sviluppo Dei Ridefinitori del cin e cout
    istream & operator >>( istream & cin, frazione &x)
    {
           cout<<"inserisci il numeratore dell'oggetto : "; cin>>x.num; cout<<endl;
           cout<<"inserisci il denominatore dell'oggetto : "; cin>>x.dem; 
           return cin;
    }
    
    ostream &operator<< ( ostream &cout,frazione &x)
    {
           cout<<x.num<<endl;
           cout<<"-"<<endl;
           cout<<x.dem<<endl;
           return cout;
           
    }
    
    //Sviluppo dei ridefinitori degli operatori
    frazione operator+(frazione a,frazione b)
    {
          frazione C;
          
          C.dem=a.dem*b.dem;
          C.num=((a.num*b.dem)+(a.dem*b.num));
          
          return C;     
    }
    
    frazione operator-(frazione a,frazione b)
    {
          frazione C;
          
          C.dem=a.dem*b.dem;
          C.num=((a.num*b.dem)-(a.dem*b.num));
          
          return C;      
    }
    
    frazione operator/(frazione a,frazione b)
    {
          int c; frazione C;
          
          c=b.num;
          b.num=b.dem;
          b.dem=c;
          
          C.num=a.num*b.num;
          C.dem=a.dem*b.dem;
          
          return C;    
    }
    
    frazione operator*(frazione a,frazione b)
    {
          frazione C;
          
          C.num=a.num*b.num;
          C.dem=a.dem*b.dem;
          
          return C;       
    }
    
    //Sviluppo del Main
    int main()
    {   
        int r; char oggetto,lettera; frazione a,b,c; int n,d;
        
        cin>>a; a.riduzione(); cout<<endl; cout<<"-----------------"<<endl;
        cin>>b; b.riduzione(); cout<<endl; cout<<"-----------------"<<endl;
        
        system("pause"); system("cls");
        
        do{
                         cout<<" ---------------MENU---------------- "<<endl;
                         cout<<" 1.Set Numeratore "<<endl;
                         cout<<" 2.Set Denominatore "<<endl;
                         cout<<" 3.Tipo Di Frazione "<<endl;
                         cout<<" 4.Verificare Se una Frazione e' Maggiore o Minore dell'altra "<<endl;
                         cout<<" 5.Minimo Comune Multiplo tra due frazioni "<<endl;
                         cout<<" 6.Massimo Comune Divisore tra due frazioni "<<endl;
                         cout<<" 7.Visualizzazione Frazione "<<endl;
                         cout<<" 8.Somma Tra due frazioni (Ridotto)"<<endl;
                         cout<<" 9.Sottrazione Tra due frazioni (Ridotto)"<<endl;
                         cout<<" 10.Divisione Tra due frazioni (Ridotto)"<<endl;
                         cout<<" 11.Moltiplicazioni Tra due frazioni (Ridotto)"<<endl;
                         cout<<" 12.Verificare Se una Frazione e' Uguale o Diversa dell'altra "<<endl;
                         cout<<" 13.USCITA DAL PROGRAMMA "<<endl;
                         cout<<" ---------------------------------- "<<endl;
                         cout<<" Inserisci l'opzione che desideri : "; cin>>r; cout<<endl;
                         
                         switch(r)
                         {
                                  case 1:{ 
                                           cout<<"di quale oggetto vuoi settare il numeratore :"; cin>>oggetto; cout<<endl; 
                                           if(oggetto=='a'){
                                             cout<<"inserisci il nuovo numeratore "<<endl; cin>>n;
                                             a.set_num(n);}
                                           else{cout<<"inserisci il nuovo numeratore "<<endl; cin>>n;
                                             b.set_num(n);}
                                       break;
                                       }
                                  case 2:{ 
                                           cout<<"di quale oggetto vuoi settare il denominatore :"; cin>>oggetto; cout<<endl; 
                                           if(oggetto=='a'){
                                             cout<<"inserisci il nuovo denominatore "<<endl; cin>>d;
                                             a.set_dem(d);}
                                           else{cout<<"inserisci il nuovo denominatore "<<endl; cin>>d;
                                             b.set_dem(d);}
                                       break;
                                       }
                                  case 3:{ 
                                       cout<<"di quale oggetto vuoi verificare il tipo di frazione :"; cin>>oggetto; cout<<endl; 
                                           if(oggetto=='a')
                                             a.tipo();
                                           else
                                             b.tipo();
                                       break;
                                       }
                                  case 4:{ 
                                       cout<<"Vuoi verificare se una frazione e' maggiore o minore dell'altra (M/m)? :";
                                       cin>>lettera; cout<<endl;
                                       if(lettera=='M')
                                       {
                                                       c=a>b;
                                                       cout<<"la seguente frazione e' maggiore :"<<endl;
                                                       cout<<c;
                                       }
                                       else
                                       {
                                                       c=a<b;
                                                       cout<<"la seguente frazione e' minore :"<<endl;
                                                       cout<<c;
                                       }
                                       break;
                                       }
                                  case 5:{ 
                                       cout<<"il minimo comune multiplo tra le due frazioni e' : "<<minimo(a,b)<<endl;
                                       break;
                                       }
                                  case 6:{ 
                                       cout<<"il massimo comun divisore tra le due frazioni e' : "<<massimo(a,b)<<endl;
                                       break;
                                       }
                                  case 7:{ 
                                           cout<<"di quale oggetto vuoi visualizzare la frazione : "; cin>>oggetto; cout<<endl; 
                                           if(oggetto=='a')
                                             cout<<a;
                                           else
                                             cout<<b;
                                       break;
                                       }
                                  case 8:{ 
                                           c=a+b;
                                           c.riduzione();
                                           cout<<" la somma tra le due frazioni e' : "<<endl; cout<<c;
                                       break;
                                       }
                                  case 9:{ 
                                           c=a-b;
                                           c.riduzione();
                                           cout<<" la sottrazione tra le due frazioni e' : "<<endl; cout<<c;
                                       break;
                                       }
                                  case 10:{ 
                                           c=a/b;
                                           c.riduzione();
                                           cout<<" la divisione tra le due frazioni e' : "<<endl; cout<<c;
                                       break;
                                       }
                                  case 11:{ 
                                            c=a*b;
                                            c.riduzione();
                                            cout<<" la moltiplicazione tra le due frazioni e' : "<<endl; cout<<c;
                                       break;
                                       }
                                  case 12:{ 
                                       cout<<"Vuoi verificare se la frazione e' Uguale O Diversa (u/d) :"; 
                                       cin>>lettera; cout<<endl;
                                       if(lettera=='u')
                                       {
                                                       if((a==b)==1)
                                                        cout<<"le due frazioni sono uguali "<<endl;
                                                       else
                                                        cout<<"le due frazioni non sono uguali "<<endl;
                                       }
                                       else
                                       {
                                                       if((a!=b)==1)
                                                        cout<<"le due frazioni sono diverse "<<endl;
                                                       else
                                                        cout<<"le due frazioni non sono diverse "<<endl;
                                       }
                                       break;}
                                  case 13:{
                                       exit(1);
                                       break;
                                       }
                                  
                                  default :{ 
                                          cout<<" Hai sbagliato l'opzione l'opzione..."<<endl; 
                                          break;
                                          }
                         }                                                                 
          system("pause"); system("cls");                                 
        }while(r!=13);
        return 0;
    }
Devi accedere o registrarti per scrivere nel forum
7 risposte