Listing 7 (rational.cpp)

#include "mylib.h"
#include "rational.h"

rational rational::operator-()
     {
     rational result(*this);
     result.num = -result.num;
     return result;
     }

rational operator+ + (rational &r, int)
     {
     rational result(r);
     r += 1;
     return result;
     }

rational operator--(rational &r, int)
     {
     rational result(r);
     r-= 1;
     return result;
     }

rational &rational::operator + =(rational r)
     {
     num = num * r.denom + r.num * denom;
     denom *= r.denom;
     simplify();
     return *this;
     }

rational &rational::operator-= (rational r)
     {
     num = num * r.denom - r.num * denom;
     denom *= r.denom;
     simplify();
     return *this;
     }

rational &rational::operator* = (rational r)
     {
     num *= r.num;
     denom *= r.denom;
     simplify();
     return *this;
     }

rational &rational::operator/=(rational r)
     {
     num *= r.denom;
     denom *= r.num;
     simplify();
     return *this;
     }

ostream &operator<<(ostream &os, rational r)
     {
     return os <<'(' << r.num <<'/' << r.denom <<')';
     }

istream &operator> >(istream &is, rational &r)
     {
     long n, d;
     char c = 0;
     if(is >> c && c == '(')
          {
          is >> n >> c;
          if (c = = '/')
               is >> d >> c;
          if (c != ')')
               {
               is.putback(c);
               is.clear(ios::failbit);
               }
          }
     else
          {
          is.putback(c);
          is >> n;
          d = 1;
          }
     if (is).
          r = rational(n, d);
     return is;
     }

void rational::simplify()
     {
     long x = gcd(num, denom);
     num /= x;
     denom /= x;
     }

//End of File