#ifndef _rational_h #include "rational.h" #endif Rational::Rational(int n, int d) { if(d==0) throw "Denominator of a fraction can not be 0" ; if (d < 0) { d = -d; n = -n; } numerator = n; denominator = d; simpleRatio(); } ostream& operator << (ostream& s, const Rational &r) { return r.print(s); } ostream& Rational::print(ostream &s)const { return(s << numerator<<'/'<>(istream &s, Rational &r) { return r.read(s); } istream& Rational::read(istream &s) { numerator =0; denominator = 1; int mult = 1; char line[80]; int i=0; s>>line; if (line[0]== '-') { i++; mult *= -1; } if (line[0] == '+') i++; while ((line[i])&&(line[i] != '/')) { if (line[i]>= '0' && line[i] <='9') { numerator = 10*numerator + (line[i] - '0'); i++; } else throw "You must type a number" ; } if (line[i] == '/') { i++; denominator = 0; if (line[i] == '-') { mult *= -1; i++; } } while (line[i]) { if (line[i]>= '0' && line[i] <='9') { denominator = 10*denominator + (line[i] - '0'); i++; } else throw "You must type a number"; } if(denominator==0) { throw "Denominator of a fraction can not be 0"; // denominator = 1; } else simpleRatio(); numerator *= mult; return s; } void Rational::simpleRatio() { if (numerator==0) { denominator =1; return; } if(denominator==0) throw "Denominator of a fraction can not be 0"; int c = abs(numerator); int d = abs(denominator); int e = denominator; // must store initial value of denominator in case numerator and denominator same variable while (c != d) if (c > d) c = c - d; else d = d - c; numerator = numerator/c; denominator = e/c; } Rational Rational::operator+=(const Rational &r) { numerator = r.numerator * denominator + r.denominator * numerator; denominator = r.denominator*denominator; simpleRatio(); return *this; } Rational Rational::operator-=(const Rational &r) { numerator = numerator * r.denominator - denominator * r.numerator; denominator = r.denominator*denominator; simpleRatio(); return *this; } Rational Rational::operator*=(const Rational &r) { numerator = r.numerator*numerator; denominator = r.denominator * denominator; simpleRatio(); return *this; } Rational Rational::operator/=(const Rational &r) { if (r.numerator == 0) throw "Cannot divide by zero"; numerator = numerator * r.denominator; denominator = denominator * r.numerator; simpleRatio(); return *this; } Rational operator + (const Rational &r, const Rational &s) { Rational result = r; result+=s; return result; } Rational operator - (const Rational &r, const Rational &s) { Rational result = r; result-=s; return result; } Rational operator * (const Rational &r, const Rational &s) { Rational result = r; result*=s; return result; } Rational operator / (const Rational &r, const Rational &s) { Rational result = r; result/=s; return result; } Rational Rational::operator -()const { Rational t(-numerator,denominator); return t; } Rational& Rational::operator =(const Rational& r) { if (this == &r) return *this; numerator = r.numerator; denominator = r.denominator; return *this; } int Rational::less (const Rational &s)const { int num1 = numerator * s.denominator; int num2 = denominator * s.numerator; return(num1 < num2); } int Rational::equal (const Rational &s)const { if (numerator != s.numerator) return 0; return(denominator ==s.denominator); } int Rational::lessEqual (const Rational &s)const { return less(s)||equal(s); } int Rational::greater (const Rational &s)const { return !lessEqual(s); } int Rational::greaterEqual (const Rational &s)const { return !less(s); } int Rational::notEqual (const Rational &s)const { return !equal(s); } int operator < (const Rational &r, const Rational & s) { return r.less(s); } int operator == (const Rational &r, const Rational & s) { return r.equal(s); } int operator <= (const Rational &r, const Rational & s) { return r.lessEqual(s); } int operator > (const Rational &r, const Rational & s) { return (r.greater(s)); } int operator >= (const Rational &r, const Rational & s) { return r.greaterEqual(s); } int operator != (const Rational &r, const Rational & s) { return r.notEqual(s); }