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;
}