// rational.cc // member function definitions for rational class // for Problem 6.6 in D&D #include "rational.h" #include #include #include // constructor function to initialize private data // default to 0 (see class definition) rational::rational(int num, int denom) { setrational(num, denom); } // set the numerator and denominator void rational::setrational(int num, int denom) { numerator = num; denominator = (denom == 0) ? 1 : denom; } // get functions int rational::getnumerator() { return numerator; } int rational::getdenominator() { return denominator; } // printing functions void rational::printfract() { cout << numerator << "/" << denominator << endl; } void rational::printfloat() { cout << setiosflags(ios::fixed | ios::showpoint) << setprecision(2) << ((float) numerator / denominator) << endl; } // arithmetic functions rational rational::add(rational r2) { // use two temps because this and r2 will be altered in processing rational temp1, temp2; temp1 = (*this); temp2 = r2; rational solution; makeCommonDenom(r2); solution.setrational((numerator + r2.numerator), denominator); solution.reduceform(); // reset this and r2 to original form (*this) = temp1; r2 = temp2; return solution; } rational rational::subtract(rational r2) { // use two temps because this and r2 will be altered in processing rational temp1, temp2; temp1 = (*this); temp2 = r2; rational solution; makeCommonDenom(r2); solution.setrational((numerator - r2.numerator), denominator); solution.reduceform(); // reset this and r2 to original form (*this) = temp1; r2 = temp2; return solution; } rational rational::mult(rational r2) { rational solution; solution.setrational((numerator * r2.numerator), (denominator * r2.denominator)); solution.reduceform(); return solution; } rational rational::divide(rational r2) { rational solution; solution.setrational((numerator * r2.denominator), (denominator * r2.numerator)); solution.reduceform(); return solution; } int rational::findCommonDenom(rational r2) { return (denominator * r2.denominator); } // reduces the form of the rational number void rational::reduceform() { int num, denom, i, smaller; // cout << "Entering reduceform with numberator = " << numerator // << " and denominator = " << denominator << endl; num = numerator; denom = denominator; smaller = (fabs(static_cast(numerator)) <= fabs(static_cast(denominator))) ? fabs(static_cast(numerator)) : fabs(static_cast(denominator)); i = 2; while (i <= smaller) { // cout << endl << "in reduceform -- i = " << i << ", smaller = " // << smaller // << ", num = " << num << ", denom = " << denom << endl; if ((num % i) == 0 && (denom % i) == 0) { num /= i; denom /= i; smaller /= i; } else i++; } numerator = num; denominator = denom; } // alters the rational numbers this and r2 so that they // have a common denominator void rational::makeCommonDenom(rational &r2) { int cdenom; cdenom = findCommonDenom(r2); numerator *= (cdenom / denominator); denominator = cdenom; r2.numerator *= (cdenom / r2.denominator); r2.denominator = cdenom; }