/*************************************************/
// R. A. Hillyard
// rational05.cpp
// November 2001
//
// class with constructors, friend functions and
// more operator overloading
// overload insertion and extraction operator
/*************************************************/

#include<iostream>

using namespace std;

class Rational
  {
  public :
    friend istream& operator >>(istream& ins, Rational& f1);
    friend ostream& operator <<(ostream& output, const Rational& f1);

    friend bool operator ==(const Rational& f1, const Rational& f2);
    friend bool operator !=(const Rational& f1, const Rational& f2);
    friend Rational operator -(const Rational& f1, const Rational& f2);
    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;  
  };
/********************************************************/
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;
  }
/********************************************************/
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);  }
/********************************************************/
Rational operator -(const Rational& f1, const Rational& f2)
  {
  int factor;
  int t = f1.top * f2.bottom - f2.top * f1.bottom;
  int b = f1.bottom * f2.bottom;

  factor = gcd(t,b);
  Rational temp(t/factor,b/factor);
  return temp;
  }
/********************************************************/
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 << "S to subtract fractions\n";
    cout << "C to compare fractions\n";
    cout << "Any other char to quit\n";
    cin >> choice;
    
    if(choice == 'S')
      {
      cout << "Enter fractions to subtract:\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";
      else
        cout << f1 << " and " << f2 << " are not equal\n";
      }
    else
      f1 = Rational(-99, -99);
    }
  return 0;
  }
/********************************************************/
/*******************Program Output**********************
S to subtract fractions
C to compare fractions
Any other char to quit
S
Enter fractions to subtract:
Enter top and bottom > 5 8
Enter top and bottom > 5 16
5/8 - 5/16 = 5/16
S to subtract fractions
C to compare fractions
Any other char to quit
S
Enter fractions to subtract:
Enter top and bottom > 5 16
Enter top and bottom > 5 8
5/16 - 5/8 = -5/16
S to subtract fractions
C to compare fractions
Any other char to quit
C
Enter fractions to compare:
Enter top and bottom > 5 13
Enter top and bottom > 3 8
5/13 and 3/8 are not equal
S to subtract fractions
C to compare fractions
Any other char to quit
C

Enter fractions to compare:
Enter top and bottom > 1 2
Enter top and bottom > 50 100
1/2 and 50/100 are equal
S to subtract fractions
C to compare fractions
Any other char to quit
g

*/