/*************************************************/
// R. A. Hillyard
// rational03.cpp
// November 2001
//
// class with constructors
// and friend functions
/*************************************************/
#include <iostream>
#include<string>
using namespace std; //introduces namespace std
class Rational
{
public :
friend bool equal(Rational f1, Rational f2);
friend Rational subtract(Rational f1, Rational f2) ;
friend int gcd(int x, int y);
//constructors
Rational();
Rational(int top);
Rational(int top, int bottom);
//acessor functions
void output();
int getTop() ;
int getBottom() ;
//mutator functions
void setTop(int t);
void setBottom(int b);
private:
int top;
int bottom;
};
/********************************************************/
bool equal(Rational f1, Rational f2)
{
//reduce fractions before comparision
int factor1 = gcd(f1.top, f1.bottom);
int factor2 = gcd(f2.top, f2.bottom);
Rational t1(f1.top/factor1,f1.bottom/factor1);
Rational t2(f2.top/factor2,f2.bottom/factor2);
if( (t1.top == t2.top) && (t1.bottom == t2.bottom ))
return true;
return false;
}
/********************************************************/
Rational subtract(Rational f1, Rational f2)
{
int factor;
//new top and bottom
int t1 = (f1.top * f2.bottom) - (f2.top * f1.bottom);
int b1 = (f1.bottom * f2.bottom);
factor = gcd(t1,b1); //reduce fraction
Rational temp(t1/factor,b1/factor); //construct new object
return temp; //return it
}
/********************************************************/
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()
{ return top; }
/********************************************************/
int Rational::getBottom()
{ return bottom; }
/********************************************************/
void Rational::output()
{ cout << top << "/" << bottom; }
/********************************************************/
void setTop(int t)
{ top = t; }
/********************************************************/
void setBottom(int b)
{ bottom = b; }
/********************************************************/
/********************************************************/
int main( void )
{
Rational f1(2,6);
Rational f2(1,3);
Rational f3;
Rational f4;
f3 = Rational(7,9);
cout << "To start your fractions are: ";
f1.output(); cout << " ";
f2.output(); cout << " ";
f3.output(); cout << endl;
f1 = Rational(3,6);
f2 = Rational(50,100);
f4 = subtract(f1,f3);
cout << "After your fractions are: ";
f1.output(); cout << " ";
f2.output(); cout << " ";
f3.output(); cout << " ";
f4.output(); cout << endl;
if(equal(f1,f2))
cout << "f1 and f2 are equal\n";
else
cout << "f1 and f2 are not equal\n";
return 0;
}
/********************Program Output*********************
To start your fractions are: 2/6 1/3 7/9
After your fractions are: 3/6 50/100 7/9 -5/18
f1 and f2 are equal
*/