#ifndef RATIONAL_H #define RATIONAL_H #include #include using std::istream; using std::ostream; class Rational { int numerator; int denominator; void reduce(); double toDouble() const; public: Rational(int numerator = 0, int denominator = 1); Rational operator-() const; friend Rational operator+(const Rational&, const Rational&); friend Rational operator-(const Rational&, const Rational&); friend Rational operator*(const Rational&, const Rational&); friend Rational operator/(const Rational&, const Rational&); friend ostream& operator<<(ostream&, const Rational&); // Extra credit stuff Rational& operator+=(const Rational&); Rational& operator-=(const Rational&); Rational& operator*=(const Rational&); Rational& operator/=(const Rational&); friend istream& operator>>(istream&, Rational&); friend bool operator<(const Rational&, const Rational&); friend bool operator>(const Rational&, const Rational&); friend bool operator<=(const Rational&, const Rational&); friend bool operator>=(const Rational&, const Rational&); friend bool operator==(const Rational&, const Rational&); friend bool operator!=(const Rational&, const Rational&); }; inline Rational::Rational(int numerator, int denominator) { this->numerator = numerator; this->denominator = denominator; assert(denominator != 0); reduce(); } inline Rational Rational::operator-() const { return Rational(-numerator, denominator); } inline Rational operator+(const Rational& r1, const Rational& r2) { Rational temp(r1); return temp += r2; } inline Rational operator-(const Rational& r1, const Rational& r2) { Rational temp(r1); return temp -= r2; } inline Rational operator*(const Rational& r1, const Rational& r2) { Rational temp(r1); return temp *= r2; } inline Rational operator/(const Rational& r1, const Rational& r2) { Rational temp(r1); return temp /= r2; } inline bool operator<(const Rational& r1, const Rational& r2) { return r1.toDouble() < r2.toDouble(); } inline bool operator>(const Rational& r1, const Rational& r2) { return r1.toDouble() > r2.toDouble(); } inline bool operator<=(const Rational& r1, const Rational& r2) { return r1.toDouble() <= r2.toDouble(); } inline bool operator>=(const Rational& r1, const Rational& r2) { return r1.toDouble() >= r2.toDouble(); } inline bool operator==(const Rational& r1, const Rational& r2) { return r1.toDouble() == r2.toDouble(); } inline bool operator!=(const Rational& r1, const Rational& r2) { return !(r1.toDouble() == r2.toDouble()); } inline double Rational::toDouble() const { return double(numerator)/denominator; } #endif