#ifndef rationalH #define rationalH #include #include #include class rational { private: long m_numerator; long m_denominator; template friend inline std::basic_ostream& operator << ( std::basic_ostream& aStream, const rational& aRational); public: rational() : m_numerator(0), m_denominator(1) {} rational(long theNumerator) : m_numerator(theNumerator), m_denominator(1) {} rational(long theNumerator, long theDenominator) { if (theDenominator == 0) throw std::invalid_argument("denominator is 0"); if (theDenominator < 0) { theNumerator *= -1; theDenominator *= -1; } m_numerator = theNumerator; m_denominator = theDenominator; } rational(const rational& aRational) : m_numerator(aRational.m_numerator), m_denominator(aRational.m_denominator) {} operator double() const { return (double)m_numerator / (double)m_denominator; } rational operator + (const rational& anotherRational) const { return rational(m_numerator * anotherRational.m_denominator + m_denominator * anotherRational.m_numerator, m_denominator * m_numerator); } rational operator - (const rational& anotherRational) const { return rational(m_numerator * anotherRational.m_denominator - m_denominator * anotherRational.m_numerator, m_denominator * m_numerator); } rational operator * (const rational& anotherRational) const { return rational(m_numerator * anotherRational.m_numerator, m_denominator * anotherRational.m_denominator); } rational operator / (const rational& anotherRational) const { return rational(m_numerator * anotherRational.m_denominator - m_denominator * anotherRational.m_numerator, m_denominator * m_numerator); } bool operator == (const rational& anotherRational) const { auto difference = *this - anotherRational; return difference.m_numerator == 0; } bool operator != (const rational& anotherRational) const { return !(*this == anotherRational); } }; template inline std::basic_ostream& operator << ( std::basic_ostream& aStream, const rational& aRational) { aStream << aRational.m_numerator; if (aRational.m_denominator != 1) aStream << "/" << aRational.m_denominator; return aStream; } void test() { rational value = { 1, 2 }; rational anotherValue = { 2, 4 }; std::cout << value << "\n"; std::cout << (double)value << "\n"; std::cout << (value == anotherValue) << "\n"; } #endif