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) { if (den == 0) { string str = "il denominatore non puo' essere nullo!"; throw str; } n = num; 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; string str; if (sep != '/') { str = "errore sintattico nella frazione."; throw str; } if (den == 0) { str = "il denominatore non puo' essere nullo!"; throw str; } n = num; 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; }