// Rational number (fraction) class #ifndef FRACTION #define FRACTION const Fraction #include "global.hpp" class Fraction { long numer, denom; // Denominator always positive public: // Constructors, accessors, and conversion functions // ------------------------------------------------- Fraction(LONG n=0, LONG d=1) : numer(n), denom(d) {assert(d > 0); reduce();} long numerator() const {return numer;} long denominator() const {return denom;} double real() const return double(numer) / double(denom);} Fraction reciprocal() const {return Fraction(denom,numer);} // The compiler will supply an acceptable destructor, copy constructor, // and assignment operator // Arithmetic operators // -------------------- Fraction operator- () {return Fraction(-numer,denom);} Fraction& operator+= (FRACTION rs); Fraction& operator-= (FRACTION rs); Fraction& operator*= (FRACTION rs); Fraction& operator/= (FRACTION rs); // Internal functions // ------------------ void reduce(); // Reduce to lowest terms // (Done after most operations) long gcd(LONG m, LONG n); // User program may already have a copy of these long lcm(LONG m, LONG n); // two, but included here for simplicity. }; // Non-member operators // -------------------- // Arithmetic inline Fraction operator+(FRACTION ls, FRACTION rs) {return Fraction(ls) += rs;} inline Fraction operator-(FRACTION ls, FRACTION rs) {return Fraction(ls) -= rs;} inline Fraction operator*(FRACTION ls, FRACTION rs) {return Fraction(ls) *= rs;} inline Fraction operator/(FRACTION ls, FRACTION rs) {return Fraction(ls) /= rs;} // Relationals (template will generate others) inline bool operator==(FRACTION ls, FRACTION rs) {return ls.numerator() == rs.numerator() && ls.denominator() == rs.denominator();} inline bool operator< (FRACTION ls, FRACTION rs) {return ls.real() < rs.real();} ostream& operator<<(ostream& s, FRACTION x); #endif