Listing 11 (rational.cpp)

#include <stdlib.h>
#include "rational.h"

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;
       }

rational rational::operator+(rational r)
       {
       rational result(*this);
       return result += r;
       }

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

rational rational::operator*(rational r)
       {
       rational result(*this);
       return result *= r;
       }

rational rational::operator/(rational r)
       {
       rational result(*this);
       return result /= r;
       }

void rational::put(FILE *f)
       {
       fprintf(f, "(%1d/%1d)", num, denom);
       }

long gcd(long x, long y)
       {
       x = labs(x);
       y = labs(y);
       while (x != y)
              {
              if (x < y)
                     y -= x;
              if (y < x)
                     x -= y;
              }
       return x;
       }

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

// End of File