#include using namespace std; class Rational { public: Rational(int n=0, int d=1) : n_(n), d_(d) { if (d==0) { throw exception();} riduci(); } int num() const {return n_;} int den() const {return d_;} const Rational operator-() const { return Rational(-num(), den()); } const Rational inv() const { return Rational(den(),num()); } private: int n_, d_; void riduci() { if (n_%d_==0) { n_/=d_; d_=1; } } friend ostream& operator<<(ostream&, const Rational&); }; ostream& operator<<(ostream& out , const Rational& r) { return out << r.n_ << "/" << r.d_; } istream& operator>>(istream& in, Rational& r) { int n,d; char c = in.peek(); if (c == '\n' ) { r=Rational(); in.ignore(); return in; } in >> n; c = in.peek(); if (c == '\n' ) { r=Rational(n); in.ignore(); return in; } else if (c=='/') { in.ignore(); } in >> d; if ( d==0 ) { cout << "Denominatore == 0! " << endl; in.clear(); throw exception(); } r=Rational(n,d); in.ignore(); return in; } const Rational operator*(const Rational& l, const Rational& r) { return Rational(l.num()*r.num(), l.den()*r.den()); } const Rational operator/(const Rational& l, const Rational& r) { return l*r.inv(); } const Rational operator+(const Rational& l, const Rational& r) { return Rational(l.num()*r.den()+l.den()*r.num(), l.den()*r.den()); } const Rational operator-(const Rational& l, const Rational& r) { return (l)+(-r); } int main() { Rational r1(10); Rational r2(3,5); cout << "r1 " << r1<< endl; cout << "r2 " << r2<< endl; Rational r3 = r1 * r2; cout << "r3 " << r3<< endl; Rational r4 = r1 * 3; cout << "r4 " << r4<< endl; Rational r5 = 3 * r1; // r5 = 3.operator*(r1); ?? 3 e' in int! cout << "r5 " << r5<< endl; try{ Rational r6(3,0);} catch(...){ cout << "Errore nel costruttore!" << endl;} Rational r7=-r1; cout << "r7 " << r7<< endl; Rational r8=r1.inv(); cout << "r8 " << r8<< endl; Rational r9=r1/r7; cout << "r9 " << r9<< endl; Rational r10; std::cin >> r10; cout << "r10 " << r10<< endl; }