#include"Rational.h" #include using std::cout; using std::cin; CRational::CRational(long NewNumerator, long NewDenominator) :m_Numerator(NewNumerator), m_Denominator(NewDenominator) { Reduce(); } const CRational &CRational::operator=(const CRational & rValue) { if (&rValue != this) { m_Numerator = rValue.m_Numerator; m_Denominator = rValue.m_Denominator; } return *this; } bool CRational::operator==(const CRational & rValue) const { bool Equal = false; if (m_Numerator == rValue.m_Numerator && m_Denominator == rValue.m_Denominator) { Equal = true; } return Equal; } CRational CRational::operator+ (const CRational & rValue) const { long LCM = LeastCommonMultiple(rValue.m_Denominator, m_Denominator); CRational Result; Result.m_Numerator = (m_Numerator * (LCM / m_Denominator)) + (rValue.m_Numerator * (LCM / rValue.m_Denominator)); Result.m_Denominator = LCM; return CRational(Result); } CRational CRational::operator- (const CRational & rValue) const { long LCM = LeastCommonMultiple(rValue.m_Denominator, m_Denominator); CRational Result; Result.m_Numerator = (m_Numerator * (LCM / m_Denominator)) - (rValue.m_Numerator * (LCM / rValue.m_Denominator)); Result.m_Denominator = LCM; return CRational(Result); } CRational CRational::operator* (const CRational & rValue) const { return CRational(m_Numerator * rValue.m_Numerator, m_Denominator * rValue.m_Denominator); } CRational CRational::operator/ (const CRational & rValue) const { return CRational(m_Numerator * rValue.m_Denominator, m_Denominator * rValue.m_Numerator); } CRational &CRational::operator++() { m_Numerator = m_Numerator + m_Denominator; Reduce(); return *this; } CRational &CRational::operator--() { m_Numerator = m_Numerator - m_Denominator; Reduce(); return *this; } //private member functions long CRational::LeastCommonMultiple(long x, long y) const { bool Continue = true; long Guess = x; while (Continue) { if(Guess % y == 0) { Continue = false; } else { Guess += x; } } return Guess; } long CRational::GreatestCommonDivisor(long x, long y) const { long Remainder = x % y; while(Remainder != 0) { x = y; y = Remainder; Remainder = x % y; } return y; } void CRational::Reduce() { long GCD = GreatestCommonDivisor(m_Numerator, m_Denominator); m_Numerator = m_Numerator/GCD; m_Denominator = m_Denominator/GCD; } //friend functions ostream &operator <<( ostream &output, const CRational &Fraction) { output << Fraction.m_Numerator << "/" << Fraction.m_Denominator; return output; } istream &operator>>( istream &input, CRational &Fraction) { cout << "Numerator? "; input >> Fraction.m_Numerator; cout << "Denominator? "; input >> Fraction.m_Denominator; return input; } CRational operator+(const long lValue, const CRational & rValue) { return rValue + lValue; } CRational operator-(const long lValue, const CRational & rValue) { return (CRational(lValue) - rValue); } CRational operator*(const long lValue, const CRational & rValue) { return rValue * lValue; } CRational operator/(const long lValue, const CRational & rValue) { return (CRational(lValue)/rValue); } CRational operator++(CRational &Rational, int Garbage) { Rational.m_Numerator += Rational.m_Denominator; Rational.Reduce(); return CRational(Rational - 1); } CRational operator--(CRational &Rational, int Garbage) { Rational.m_Numerator -= Rational.m_Denominator; Rational.Reduce(); return CRational(Rational + 1); }