#include <iostream>
#include <cstdlib>
using namespace std;
class Fraction
{
public:
Fraction( );
Fraction(int, int);
void reduce( );
void setFraction(int , int );
void getFraction(int&, int&);
void display( );
friend const Fraction operator + (const Fraction& lhs, const Fraction& rhs);
friend const Fraction operator - (const Fraction& lhs, const Fraction& rhs);
friend const Fraction operator * (const Fraction& lhs, const Fraction& rhs);
friend const Fraction operator / (const Fraction& lhs, const Fraction& rhs);
private:
int myNumerator, myDenominator, myGCF;
};
Fraction :: Fraction():myNumerator(0), myDenominator(1)
{}
Fraction :: Fraction(int n, int d)
{
myNumerator = n;
myDenominator = d;
reduce( );
}
void Fraction :: reduce()
{int gcf;
bool finished=false;
if (myDenominator == 0)
myDenominator = 1;
if (myNumerator < 0 && myDenominator < 0)
{myNumerator = -myNumerator;
myDenominator= -myDenominator;
}
if (myNumerator > 0 && myDenominator < 0)
{myNumerator= -myNumerator;
myDenominator= -myDenominator;
}
if (abs(myNumerator) > abs(myDenominator)) // set gcf to larger of denominator / numerator
gcf = abs(myDenominator);
else
gcf = abs(myNumerator);
while ( !finished && gcf >= 2 )
{
if ( myNumerator % gcf == 0 && myDenominator % gcf == 0) // find greatest common factor
{myNumerator = myNumerator / gcf;
myDenominator = myDenominator / gcf;
finished = true;
}
gcf--;
}
}
void Fraction :: setFraction(int n, int d)
{
myNumerator = n;
myDenominator = d;
reduce( );
}
void Fraction :: getFraction(int &n, int &d)
{
n = myNumerator;
d = myDenominator;
reduce( );
}
void Fraction :: display()
{cout << myNumerator << "/" << myDenominator;
}
const Fraction operator + (const Fraction& lhs, const Fraction& rhs)
{
Fraction temp;
temp.myDenominator = lhs.myDenominator * rhs.myDenominator;
temp.myNumerator = lhs.myNumerator * rhs.myDenominator +
rhs.myNumerator * lhs.myDenominator;
temp.reduce();
return temp;
}
const Fraction operator - ( const Fraction& lhs, const Fraction& rhs)
{
Fraction temp;
temp.myDenominator = lhs.myDenominator * rhs.myDenominator;
temp.myNumerator = lhs.myNumerator * rhs.myDenominator - rhs.myNumerator * lhs.myDenominator;
temp.reduce();
return temp;
}
const Fraction operator * (const Fraction& lhs, const Fraction& rhs)
{
Fraction temp;
temp.myNumerator = lhs.myNumerator * rhs.myNumerator;
temp.myDenominator = lhs.myDenominator * rhs.myDenominator;
temp.reduce();
return temp;
}
const Fraction operator / (const Fraction& lhs, const Fraction& rhs)
{
Fraction temp;
temp.myNumerator = rhs.myDenominator * lhs.myNumerator;
temp.myDenominator = rhs.myNumerator * lhs.myDenominator;
temp.reduce();
return temp;
}
int main( )
{Fraction frac1, frac2(2, 3), result;
int n, d;
cout << " Fraction Class Program " << endl << endl;
cout << " Enter the numerator, press enter, then enter the denominator followed by enter: ";
cin >> n >> d;
frac1.setFraction(n, d);
result = frac1 + frac2;
frac1.display ();
cout << " + " ;
frac2.display();
cout << " = ";
result.display();
cout << endl;
result = frac1 - frac2;
frac1.display();
cout << " - ";
frac2.display();
cout << " = ";
result.display();
cout << endl;
result = frac1 * frac2;
frac1.display();
cout << " * " ;
frac2.display();
cout << " = ";
result.display();
cout << endl;
result = frac1 / frac2;
frac1.display();
cout << " / " ;
frac2.display();
cout << " = ";
result.display();
cout << endl;
return 1;
}