/* Costruire la classe "Razionale" con due dati privati che rappresentano numeratore e denominatore (non dimenticate costruttore/i e distruttore!). Scrivere un programma che chieda all'utente di inserire due numeri razionali (nella forma `n/d', fare l'overloading dell'operatore `>>') e il simbolo di operazione che si vuole eseguire (somma, sottrazione, moltiplicazione o divisione). Queste operazioni verranno eseguite utilizzando l'overloading di operatori (`+', `-', `*', `/'). Restituire i risultati (sempre nella forma `n/d', fare l'overloading dell'operatore `<<') semplificati, cioe', le frazioni devono essere ridotte ai minimi termini. Ripetere l'esercizio fintanto che il risultato dell'operazione risulta positivo (overloading dell'operatore `>' o dell'operatore `<'). */ #include #include using namespace std; class Razionale { private: // Numeratore. int n; // Denominatore. int d; // Calcola il massimo comune divisore tra due interi. int mcd(int x,int y); // Riduce ai minimi termini la frazione e, se il numero // e' negativo, lega il segno `-' al numeratore. void semplifica(); public: // Costruttore di default. Razionale(); // Costruttore con parametri. Razionale(int num, int den); // Distruttore. ~Razionale(); // Restituisce il numeratore del numero razionale. int numeratore() const; // Restituisce il denominatore del numero razionale. int denominatore() const; // Overloading operatore `+'. Razionale operator+(const Razionale& x) const; // Overloading operatore `-'. Razionale operator-(const Razionale& x) const; // Overloading operatore `*'. Razionale operator*(const Razionale& x) const; // Overloading operatore `/'. Razionale operator/(const Razionale& x) const; // Overloading operatore `>'. int operator>(const Razionale& x) const; // Stampa il numero razionale nella forma `n/d'. void stampa(ostream& s_out) const; // Legge il numero razionale nella forma `n/d'. void leggi(istream& s_in); }; int Razionale::mcd(int x,int y) { int r = y; while (r != 0){ r = x % y; x = y; y = r; } return x; } Razionale::Razionale() { n = 0; d = 1; } Razionale::Razionale(int num, int den = 1) { n = num; if (den == 0) { cout << "ATTENZIONE!: denominatore nullo (lo pongo uguale ad 1)" << endl; // Mettere `d = 1' e' una scelta // (non bella, vedremo come si puo' migliorare). d = 1; } else d = den; } Razionale::~Razionale() { // eventuali operazioni in chiusura, in questo caso nessuna. } int Razionale::numeratore() const { return n; } int Razionale::denominatore() const { return d; } Razionale Razionale::operator+(const Razionale& x) const { Razionale risultato; risultato.d = d * x.d; risultato.n = n * x.d + x.n * d; risultato.semplifica(); return risultato; } Razionale Razionale::operator-(const Razionale& x) const { Razionale risultato; risultato.d = d * x.d; risultato.n = n * x.d - x.n * d; risultato.semplifica(); return risultato; } Razionale Razionale::operator*(const Razionale& x) const { Razionale risultato; risultato.d = d * x.d; risultato.n = n * x.n; risultato.semplifica(); return risultato; } Razionale Razionale::operator/(const Razionale& x) const { Razionale risultato; risultato.d = d * x.n; risultato.n = n * x.d; risultato.semplifica(); return risultato; } int Razionale::operator>(const Razionale& x) const { return (n * x.d > d * x.n); } void Razionale::semplifica() { int m = mcd(abs(n), abs(d)); n = n / m; d = d / m; if ((n < 0 && d < 0) || (n > 0 && d < 0)) { n *= -1; d *= -1; } } int main() { Razionale c; char op; do { int num, den; cout << endl << "Immettere numeratore e denominatore (interi) del " << "primo numero razionale:"; cout << endl << "num = "; cin >> num; do { cout << endl << "den = "; cin >> den; if (den == 0) cout << "Il denomnatore non puo' essere nullo!!!" << endl; } while (den == 0); Razionale a(num, den); cout << endl << "Immettere numeratore e denominatore (interi) del " << "secondo numero razionale:"; cout << endl << "num = "; cin >> num; do { cout << endl << "den = "; cin >> den; if (den == 0) cout << "Il denomnatore non puo' essere nullo!!!" << endl; } while (den == 0); Razionale b(num, den); cout << endl << "Immettere l'operazione aritmetica da eseguire:" << endl; cin >> op; bool operazione_svolta = true; switch (op) { case '+': c = a + b; break; case '-': c = a - b; break; case '*': c = a * b; break; case '/': c = a / b; break; default: operazione_svolta = false; cout << "Operazione non implementata!" << endl; } if (operazione_svolta) cout << endl << "Il risultato e': " << c.numeratore() << "/" << c.denominatore() << endl; } while (c > Razionale(0)); cout << endl << "Arrivederci!" << endl; getch(); return 0; }