//Operazioni su numeri razionali, rappresentati come frazioni #include class razionale {private: int n; int d; int mcd(int aa,int bb) {//calcola mcd int ma=aa; int mb=bb; while (ma != mb) if (ma < mb) ma = ma + aa; else mb = mb +bb; return aa*bb/ma; } public: razionale() //costruttore standard {n = 0; d = 1; } razionale(int i1,int i2=1) //costruttore con parametri {n = i1; if (i2 == 0) {cout << "ATTENZIONE!: denominatore nullo" << endl; d = 1;} else d = i2; } razionale operator+(razionale s) {razionale ris; ris.d = d * s.d; ris.n = n*s.d + s.n * d; ris.semplifica(); return ris; } razionale operator-(razionale s) {razionale ris; ris.d = d * s.d; ris.n = n*s.d - s.n * d; ris.semplifica(); return ris; } razionale operator*(razionale s) {razionale ris; ris.d = d * s.d; ris.n = n*s.n; ris.semplifica(); return ris; } int operator>(razionale s) { return (n * s.d > d * s.n); } void semplifica() { int m=mcd(abs(n),abs(d)); n=n/m; d=d/m; } void stampa(ostream& sout) {sout << n << '/' << d; return; } void leggi(istream& sin) {int num, den; char sep; sin >> num >> sep >> den; if (sep != '/') cout << "ATTENZIONE!: errore sintattico nella frazione" << endl; else {n = num; if (den == 0) {cout << "ATTENZIONE!: denominatore nullo" << endl; d = 1;} else d = den; } return; } }; ostream& operator<<(ostream& sout, razionale r) {r.stampa(sout); return sout; } istream& operator>>(istream& sin, razionale& r) {r.leggi(sin); return sin; } int main() {razionale a; razionale b; razionale c; char op; do { cout << "Immettere l'operazione aritmetica da eseguire (x op y): "; cin >> a >> op >> b; cout << endl << "Il risultato e': "; switch (op) { case '+': c=a+b; break; case '-': c=a-b; break; case '*': c=a*b; break; default: cout << "Sorry, operazione non implementata!" << endl; } cout << c << endl; cout << "Eseguire un'altra operazione? (s/n)" ; cin >> op; } while (op!='n'); return 0; }