/* Costruire la classe "Razionale" con due dati privati che rappresentano il numeratore ed il denominatore. 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 class Razionale { private: // Numeratore. int n; // Denominatore. int d; // Calcola il massimo comune divisore tra due interi. int mcd(int x,int y); public: // Costruttore di default. Razionale(); // Costruttore con parametri. Razionale(int num, int den); // 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; // Riduce ai minimi termini la frazione e, se il numero // e' negativo, lega il segno `-' al numeratore. void semplifica(); // 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" << endl; // Mettere `d = 1' e' una scelta // (non bella, vedremo come si puo' migliorare). d = 1; } else d = den; } 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; } } void Razionale::stampa(ostream& s_out) const { s_out << n << '/' << d; } void Razionale::leggi(istream& s_in) { int num, den; char sep; s_in >> num >> sep >> den; if (sep != '/') cout << "ATTENZIONE!: errore sintattico nella frazione" << endl; else { n = num; if (den == 0) { cout << "ATTENZIONE!: denominatore nullo" << endl; // Mettere `d = 1' e' una scelta // (non bella, vedremo come si puo' migliorare). d = 1; } else d = den; } } ostream& operator<<(ostream& s_out, const Razionale& r) { r.stampa(s_out); return s_out; } istream& operator>>(istream& s_in, Razionale& r) { r.leggi(s_in); return s_in; } int main() { Razionale c; char op; do { Razionale a; Razionale b; cout << endl << "Immettere i due numeri razionali nella forma `n/d':"; cout << endl << "x = "; cin >> a; cout << endl << "y = "; cin >> b; 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 << endl; } while (c > Razionale(0)); cout << endl << "Arrivederci!" << endl; return 0; }