/*************************************************/
// R. A. Hillyard
// rational06.cpp
// November 2001
//
// Complete Rational class
/*************************************************/

#include<iostream>

using namespace std;

class Rational
  {
  public :
    friend Rational operator +(const Rational& f1, const Rational& f2);
    friend Rational operator -(const Rational& f1, const Rational& f2);
    friend Rational operator *(const Rational& f1, const Rational& f2);
    friend Rational operator /(const Rational& f1, const Rational& f2);
    friend bool operator ==(const Rational& f1, const Rational& f2);
    friend bool operator !=(const Rational& f1, const Rational& f2);
    friend bool operator <=(const Rational &f1, const Rational& f2);
    friend bool operator >=(const Rational &f1, const Rational& f2);
    friend bool operator  <(const Rational &f1, const Rational& f2);
    friend bool operator  >(const Rational &f1, const Rational& f2);

    friend istream& operator >>(istream& ins, Rational& f1);
    friend ostream& operator <<(ostream& output, const Rational& f1);
    friend int gcd(int x, int y);   

    //constructors
    Rational();
    Rational(int top);
    Rational(int top, int bottom);
    //accessor functions
    void output() const;
    int getTop() const;
    int getBottom() const;
    //mutator functions
    void setTop(int t);
    void setBottom(int b);
    
  private:
    int top;
    int bottom;  
  };
/********************************************************/
/********************************************************/
Rational operator +(const Rational& r, const Rational& s)
  {
  int factor;
  int t1 = r.top * s.bottom + s.top * r.bottom;
  int b1 = r.bottom * s.bottom;
  
  factor = gcd(t1,b1);
  Rational temp(t1/factor,b1/factor);
  return temp;
  }
/********************************************************/
Rational operator -(const Rational &r, const Rational &s)
  {
  int factor;
  int t1 = r.top * s.bottom - s.top * r.bottom;
  int b1 = r.bottom * s.bottom;
  
  factor = gcd(t1,b1);
  Rational temp(t1/factor,b1/factor);
  return temp;
  }
/********************************************************/
Rational operator *(const Rational &r, const Rational &s)
  {
  int factor;
  int t1 = r.top * s.top;
  int b1 = r.bottom * s.bottom;
  
  factor = gcd(t1,b1);
  Rational temp(t1/factor,b1/factor);
  return temp;
  }
/********************************************************/
Rational operator /(const Rational &r, const Rational &s)
  {
  int factor;
  int t1 = r.top * s.bottom;
  int b1 = r.bottom * s.top;
  
  factor = gcd(t1,b1);
  Rational temp(t1/factor,b1/factor);
  return temp;
  }
/********************************************************/
bool operator ==(const Rational& f1, const Rational& f2)
  { return((f1.top * f2.bottom) == (f1.bottom * f2.top ));  }
/********************************************************/
bool operator !=(const Rational& f1, const Rational& f2)
  {  return !(f1==f2);  }
/********************************************************/
bool operator <=(const Rational &f1, const Rational& f2)
  { return((f1.top * f2.bottom) <= (f1.bottom * f2.top ));  }
/********************************************************/
bool operator >=(const Rational &f1, const Rational& f2)
  { return((f1.top * f2.bottom) >= (f1.bottom * f2.top ));  }
/********************************************************/
bool operator  <(const Rational &f1, const Rational& f2)
  { return((f1.top * f2.bottom) < (f1.bottom * f2.top ));  }
/********************************************************/
bool operator  >(const Rational &f1, const Rational& f2)
  { return((f1.top * f2.bottom) > (f1.bottom * f2.top ));  }
/********************************************************/
ostream& operator <<(ostream& output, const Rational& f1)
  {
  output << f1.top << "/" << f1.bottom;
  return output;
  }
/********************************************************/
istream& operator >>(istream& ins, Rational& f1)
  {
  cout << "Enter top and bottom > ";
  ins >> f1.top >> f1.bottom;
  return ins;
  }
/********************************************************/
int gcd(int x, int y)
  {
  int c;     //store remainder
  
  while( (c = x%y) != 0 )
    {
    x = y;
    y = c;
    }//end while

  return y;  
  }//end of gcd
/********************************************************/
Rational::Rational()
  {
  top = 0;
  bottom = 1;
  }
/********************************************************/
Rational::Rational(int t)
  {
  top = t;
  bottom = 1;
  }
/********************************************************/
Rational::Rational(int t, int b)
  {
  top = t;
  bottom = b;
  }
/********************************************************/
int Rational::getTop() const
  {  return top;  }
/********************************************************/
int Rational::getBottom() const
  {  return bottom;  }
/********************************************************/
void Rational::output() const
  {  cout << top << "/" << bottom;  }
/********************************************************/
void Rational::setTop(int t)
  {  top = t;  }
/********************************************************/
void Rational::setBottom(int b)
  {  bottom = b;  }
/********************************************************/

/********************************************************/
int main( void )
  {
  char choice;
  Rational f1;
  Rational f2;
  Rational f3;
  Rational sentinal(-99, -99);
  
  while(f1 != sentinal)
    {
    cout << endl;
    cout << "A to add fractions\n";
    cout << "S to subtract fractions\n";
    cout << "D to divide fractions\n";
    cout << "M to multiply fractions\n";
    cout << "C to compare fractions\n";
    cout << "Any other char to quit\n";
    cin >> choice;


    if(choice == 'A')
      {
      cout << "Enter fractions to add:\n";
      cin >> f1 >> f2;
      cout << f1 << " + " << f2 << " = " << f1+f2 << endl;
      }
    else if(choice == 'S')
      {
      cout << "Enter fractions to subtract:\n";
      cin >> f1 >> f2;
      cout << f1 << " - " << f2 << " = " << f1-f2 << endl;
      }
    else if(choice == 'D')
      {
      cout << "Enter fractions to divide:\n";
      cin >> f1 >> f2;
      cout << f1 << " / " << f2 << " = " << f1/f2 << endl;
      }
    else if(choice == 'M')
      {
      cout << "Enter fractions to multiply:\n";
      cin >> f1 >> f2;
      cout << f1 << " * " << f2 << " = " << f1*f2 << endl;
      }

    else if(choice == 'C')
      {
      cout << "Enter fractions to compare:\n";
      cin >> f1 >> f2;
      if(f1 == f2)
        cout << f1 << " and " << f2 << " are equal\n";
      if(f1 != f2)
        cout << f1 << " and " << f2 << " are not equal\n";
      if(f1 >= f2)
        cout << f1 << " is greater or equal to " << f2 << endl;
      if(f1 > f2)
        cout << f1 << " is greater than " << f2  << endl;
      if(f1 <= f2)
        cout << f1 << " is less or equal to  " << f2  << endl;
      if(f1 < f2)
        cout << f1 << " is less than " << f2 <<  endl;
      }
    else
      f1 = Rational(-99, -99);
    }
  return 0;
  }
/********************************************************/

/*******************Program Output**********************
A to add fractions

A to add fractions
S to subtract fractions
D to divide fractions
M to multiply fractions
C to compare fractions
Any other char to quit
A
Enter fractions to add:
Enter top and bottom > 3 4
Enter top and bottom > 3 8
3/4 + 3/8 = 9/8

A to add fractions
S to subtract fractions
D to divide fractions
M to multiply fractions
C to compare fractions
Any other char to quit
S
Enter fractions to subtract:
Enter top and bottom > 3 4
Enter top and bottom > 3 8
3/4 - 3/8 = 3/8

A to add fractions
S to subtract fractions
D to divide fractions
M to multiply fractions
C to compare fractions
Any other char to quit
D
Enter fractions to divide:
Enter top and bottom > 3 4
Enter top and bottom > 3 8
3/4 / 3/8 = 2/1

A to add fractions
S to subtract fractions
D to divide fractions
M to multiply fractions
C to compare fractions
Any other char to quit

A to add fractions
S to subtract fractions
D to divide fractions
M to multiply fractions
C to compare fractions
Any other char to quit
C
Enter fractions to compare:
Enter top and bottom > 7 8 14 16
Enter top and bottom > 7/8 and 14/16 are equal
7/8 is greater or equal to 14/16
7/8 is less or equal to  14/16

A to add fractions
S to subtract fractions
D to divide fractions
M to multiply fractions
C to compare fractions
Any other char to quit
g



*/