Addizione di due frazioni, risultati non corretti

di il
2 risposte

Addizione di due frazioni, risultati non corretti

Salve, stavo cazzeggiando con c++ quando mi è venuta la strana idea di fare una specie di tool aritmetici per le frazioni... Tra questi, ho inserito l'addizione tra frazioni che non da sempre risultati corretti. Mi spiego meglio: Se do in pasto due frazioni del tipo 1/3 + 1/2 non ha problemi ha scrivere il risultato corretto (5/6) ma nel momento in cui inserisco qualcosa del tipo 4/6 + 6/2, da un risultato non corretto. Sto sbagliando sicuramente qualcosa ma dopo 2 ore di ricerche non ho trovato il problema (sicuramente sarà una cretinata). Spero mi possiate dare una mano, grazie in anticipo.

PS: La funzione di tipo INT etichettata "euclide", si occupa di calcolare il MCD utilizzando l'algoritmo di Euclide ed è correttamente funzionante.

Questa è il codice... La porzione interessata all'addizione comincia con il commento "//INIZIO ALGORITMO ADDIZIONE" e termina con il commento "//FINE ALGORITMO ADDIZIONE" (RIGO 109-121)
Source:


#include <iostream>
#include <cstdlib>

using namespace std;

class Frazione{
    private:
        int numeratore, denominatore, num, den; //Attributi
    public:
        Frazione(int n, int d, int nn, int dd){ //Costruttore
            numeratore = n;
            denominatore = d;
            num = nn;
            den = dd;
        }
        int getNumeratore(){return numeratore;}
        int getDenominatore(){return denominatore;}
        int getNum(){return num;}
        int getDen(){return den;}
        void setNumeratore(int n){numeratore = n;}
        void setDenominatore(int d){denominatore = d;}
        void setNum(int nn){num = nn;}
        void setDen(int dd){den = dd;}
        int controllo(){
            int i;
            if(numeratore < denominatore){i = 1;} //Propria
            if(numeratore > denominatore){i = 2;} //Impropria
            if(numeratore == denominatore || numeratore%denominatore == 0){i = 3;} //Apparente
            return i;
        }
        int confronto(){
            int i;
            if(numeratore/denominatore > num/den){i = 1;} //Prima maggiore della seconda
            if(numeratore/denominatore < num/den){i = 2;} //Seconda maggiore della prima
            if((numeratore/denominatore) - (num/den) == 0){i = 3;} //Prima uguale alla seconda
            return i;
        }
};

void menu();
void menuop();
int euclide(int a, int b);

int main(){
    int s1, s2, s3;
    do{
        menu();
        cin >> s1;
        if(s1 == 1){
            do{
                system("clear");
                int n, d, nn, dd;
                cout << "Numeratore: ";
                cin >> n;
                cout << "Denominatore: ";
                cin >> d;
                Frazione f(n, d, nn, dd);
                cout << n << "/" << d << endl;
                if(f.controllo() == 1){cout << "La frazione è propria." << endl;}
                if(f.controllo() == 2){cout << "La frazione è impropria." << endl;}
                if(f.controllo() == 3){cout << "La frazione è apparente." << endl;}
                cout << "Inserisci '1' per ricominciare, '2' per terminare." << endl;
                cin >> s2;
            }while(s2 != 2);
        }
        if(s1 == 2){
            do{
                system("clear");
                int n, d, nn, dd;
                cout << "Numeratore prima frazione: ";
                cin >> n;
                cout << "Denominatore prima frazione: ";
                cin >> d;
                cout << "Numeratore seconda frazione: ";
                cin >> nn;
                cout << "Denominatore seconda frazione: ";
                cin >> dd;
                Frazione f(n, d, nn, dd);
                if(f.confronto() == 1){cout << "La prima frazione è maggiore della seconda." << endl;}
                if(f.confronto() == 2){cout << "La prima frazione è minore della seconda." << endl;}
                if(f.confronto() == 3){cout << "La prima frazione è uguale alla seconda." << endl;}
                cout << "Inserisci '1' per ricominciare, '2' per terminare." << endl;
                cin >> s2;
            }while(s2 != 2);
        }
        if(s1 == 3){
            do{
                system("clear");
                int n, d, mcd;
                cout << "Numeratore: ";
                cin >> n;
                cout << "Denominatore: ";
                cin >> d;
                mcd = euclide(n, d);
                n = n / mcd;
                d = d / mcd;
                cout << "Frazione semplificata: " << n << "/" << d << endl;
                cout << "Inserisci '1' per ricominciare, '2' per terminare." << endl;
                cin >> s2;
            }while(s2 != 2);
        }
        if(s1 == 4){
            do{
                menuop();
                cin >> s3;
                if(s3 == 1){
                    do{
                        system("clear");
                        int n, d, nn, nf, dd, mcd, mcm;
                        cout << "Numeratore prima frazione: ";
                        cin >> n;
                        do{cout << "Denominatore prima frazione: ";
                        cin >> d;}while(d < 1);
                        cout << "Numeratore seconda frazione: ";
                        cin >> nn;
                        do{cout << "Denominatore seconda frazione: ";
                        cin >> dd;}while(dd < 1);
                        // INIZIO ALGORITMO ADDIZIONE
                        mcd = euclide(d, dd); 
                        mcm = (d * dd) / mcd;
                        nf = ((mcm / d) * n) + ((mcm / dd) * n);
                        cout << "Risultato: " << nf << "/" << mcm << endl;
                        // FINE ALGORITMO ADDIZIONE
                        cout << "Inserisci '1' per ricominciare, '2' per terminare." << endl;
                        cin >> s2;
                    }while(s2 != 2);
                }
                if(s3 == 2){}
                if(s3 == 3){}
                if(s3 == 4){}
            }while(s3 != 5);
        }
    }while(s1 != 5);
    cout << "Terminato." << endl;
}

void menu(){
    system("clear");
    cout << "=========MENU==========" << endl;
    cout << "1. TIPO" << endl;
    cout << "2. CONFRONTO" << endl;
    cout << "3. SEMPLIFICAZIONE" << endl;
    cout << "4. OPERAZIONI ARITMETICHE" << endl;
    cout << "5. ESCI" << endl;
    cout << "=======================" << endl;
    cout << "Selezione: ";
}

void menuop(){
    system("clear");
    cout << "======OPERAZIONI=======" << endl;
    cout << "1. ADDIZIONE" << endl;
    cout << "2. SOTTRAZIONE" << endl;
    cout << "3. MOLTIPLICAZIONE" << endl;
    cout << "4. DIVISIONE" << endl;
    cout << "5. ESCI" << endl;
    cout << "=======================" << endl;
    cout << "Selezione: ";
}

int euclide(int a, int b){
    int r, m;
    do{
        r = a % b;
        a = b;
        b = r;
    }while(b != 0);
    if(a < 0){a = abs(a);}
    m = a;
    return m;
}

2 Risposte

Devi accedere o registrarti per scrivere nel forum
2 risposte