// Program that includes a defintion for a class that stores rational numbers // along with some client code. #include #include using namespace std; class rational { public: rational(int numer = 0, int denom = 1) { numerator = numer; denominator = denom; fix_signs(); reduce(); } int get_numerator() const{ return numerator; } int get_denominator() const { return denominator; } // n1/d1 - n2/d2 = (n1 * d2 - n2 * d1) / (d1 * d2) rational & operator-=(const rational & rhs) { numerator = numerator * rhs.denominator - rhs.numerator * denominator; denominator *= rhs.denominator; reduce(); } private: int numerator; int denominator; void fix_signs() { if (denominator < 0) { numerator = -numerator; denominator = -denominator; } } int gcd(int x, int y) { if (x < 0 || y < 0) { return gcd(abs(x), abs(y)); } else if (y == 0) { return x; } else { return gcd(y, x % y); } } void reduce() { int common = gcd(numerator, denominator); numerator /= common; denominator /= common; } }; ostream & operator<<(ostream & out, const rational & value) { out << value.get_numerator(); if (value.get_denominator() != 1) { out << "/" << value.get_denominator(); } return out; } int main() { rational r1(3, 4), r2(5), r3; cout << "r1 = " << r1 << ", r2 = " << r2 << ", r3 = " << r3 << endl; cout << endl; rational r4(6, -16); cout << "r4 = " << r4 << endl; cout << endl; r1 -= r4; r2 -= r4; r3 -= r4; cout << "r1 = " << r1 << ", r2 = " << r2 << ", r3 = " << r3 << endl; cout << endl; return 0; }