Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Create a class RationalNumber (fractions) with the following capabilities: a.) C

ID: 3625372 • Letter: C

Question

Create a class RationalNumber (fractions) with the following capabilities:
a.) Create a constructor that prevents a 0 denominator in a fraction, reduces or simplifies fractions that are not in reduced form and avoids negative denominators.
b.) Overload the addition, subtraction, multiplication and division operators for this class.
c.) Overload the relational and equality operators for this class.

In addition to the capabilities outlined above, the RationalNumber class should overload the stream insertion (<<) and stream extraction (>>) operators. The stream extraction operator should prevent a 0 denominator in a fraction, reduce fractions that are not in reduced form, and prevent negative denominators. Negative or 0 denominators should be set to 1.

Sample output 1
Enter a Rational Number (n/d): 1/3
Enter a Rational Number (n/d): 2/4
1/3 + 1/2 = 5/6
1/3 - 1/2 = -1/6
1/3 * 1/2 = 1/6
1/3 / 1/2 = 2/3
1/3 <= 1/2 according to the overloaded > operator
1/3 < 1/2 according to the overloaded >= operator
1/3 < 1/2 according to the overloaded < operator
1/3 <= 1/2 according to the overloaded <= operator
1/3 != 1/2 according to the overloaded == operator
1/3 != 1/2 according to the overloaded != operator


Driver Program:

#include "RationalNumber.h"

int main()
{
// RationalNumber c( 1, 3 ), d( 2, 4 ), x;
RationalNumber c, d, x;

// test overloaded stream extraction operator
cout << "Enter a Rational Number (n/d): ";
cin >> c;
cout << "Enter a Rational Number (n/d): ";
cin >> d;

x = c + d; // test overloaded operators + and =
cout << c << " + " << d << " = " << x << endl;

x = c - d; // test overloaded operators - and =
cout << c << " - " << d << " = " << x << endl;

x = c * d; // test overloaded operators * and =
cout << c << " * " << d << " = " << x << endl;

x = c / d; // test overloaded operators / and =
cout << c << " / " << d << " = " << x << endl;

// test overloaded > operator
cout << c << ( ( c > d ) ? " > " : " <= " ) << d
<< " according to the overloaded > operator ";

// test overloaded >= operator
cout << c << ( ( c >= d ) ? " >= " : " < " ) << d
<< " according to the overloaded >= operator ";

// test overloaded < operator
cout << c << ( ( c < d ) ? " < " : " >= " ) << d
<< " according to the overloaded < operator ";

// test overloaded <= operator
cout << c << ( ( c <= d ) ? " <= " : " > " ) << d
<< " according to the overloaded <= operator ";

// test overloaded == operator
cout << c << ( ( c == d ) ? " == " : " != " ) << d
<< " according to the overloaded == operator ";

// test overloaded != operator
cout << c << ( ( c != d ) ? " != " : " == " ) << d
<< " according to the overloaded != operator ";

return 0;
} // end main


I have the driver program. Need help writing the rest.

Explanation / Answer

#include<iostream>

using namespace std;

class RationalNumberNumber

{

public:

RationalNumberNumber(int numerator, int denominator);

   RationalNumberNumber(int numerator); // sets denominator to 1

  RationalNumberNumber(); //sets numerator to 0,denominator to 1

friend RationalNumberNumber operator+

      (const RationalNumberNumber&,const RationalNumberNumber&);

friend RationalNumberNumber operator-

      (const RationalNumberNumber&,const RationalNumberNumber&);

friend RationalNumberNumber operator*

      (const RationalNumberNumber&,const RationalNumberNumber&);

friend RationalNumberNumber operator/

       (const RationalNumberNumber&,const RationalNumberNumber&);

friend bool operator<

             (const RationalNumberNumber&,const RationalNumber&);

friend bool operator<=

             (const RationalNumber&,const RationalNumber&);

friend bool operator>

             (const RationalNumber&,const RationalNumber&);

friend bool operator >=

            (const RationalNumber&,const RationalNumber&);

friend bool operator ==

           (const RationalNumber&,const RationalNumber&);

friend ostream& operator <<(ostream&,const RationalNumber&);

friend istream& operator >>(istream&,RationalNumber&);

private: int n;

          int d;

};

void normalize(int &n, int &d);

RationalNumber::RationalNumber(int numer, int denom)

{

normalize(numer, denom);

n = numer;

d = denom;

}

//sets denominator to 1

RationalNumber::RationalNumber(int numer): n(numer), d(1)

// See the initializer appendix

{

//body deliberately empty

}

// sets numerator to 0, denominator to 1

RationalNumber::RationalNumber():n(0), d(1)

// see initializer appendix

{

//body deliberately empty

}

RationalNumber operator +(const RationalNumber& left,

                              const RationalNumber& right)

{

int numer = left.n * right.d + left.d * right.n;

int denom = left.d * right.d;

normalize(numer, denom);

RationalNumber local(numer, denom);

return local;

}

RationalNumber operator -(const RationalNumber& left,

                              const RationalNumber& right)

{

int numer = left.n * right.d - left.d * right.n;

int denom = left.d * right.d;

normalize(numer, denom);

RationalNumber local (numer, denom);

return local;

}

RationalNumber operator *(const RationalNumber& left,

                           const RationalNumber& right)

{

RationalNumber product;

int numer = left.n * right.n;

int denom = left.d * right.d;

normalize(numer, denom);

product = RationalNumber(numer, denom);

return product;

}

RationalNumber operator/(const RationalNumber& left,

                             const RationalNumber& right)

{

RationalNumber quotient;

int numer = left.n * right.d;

int denom = left.d * right.n;

normalize(numer, denom);

quotient = RationalNumber(numer, denom);

return quotient;

}

//precondition: all relational operators require d > 0

bool operator <(const RationalNumber& left,const RationalNumber& right)

{

return left.n * right.d < right.n * left.d;

}

bool operator <=(const RationalNumber& left,

                               const RationalNumber& right)

{

   return left.n * right.d <= right.n * left.d;

}

bool operator >(const RationalNumber& left,

                        const RationalNumber& right)

{

   return left.n * right.d > right.n * left.d;

}

bool operator >=(const RationalNumber& left,

                               const RationalNumber& right)

{

   return left.n * right.d >= right.n * left.d;

}

{

return left.n * right.d == right.n * left.d;

}

istream& operator >>(istream& in_str,

                         RationalNumber& right)

{

   char ch;

   in_str >> right.n >> ch >> right.d;

   if (ch != '/')// properly done, we would set iostream

{// to fail here in case of error.

    cout << "bad input format for operator >>. Aborting!"

      << endl;

     exit (1);

   }

   normalize(right.n, right.d);

return in_str;

}

ostream& operator <<(ostream& out_str,

                              const RationalNumber& right)

{

     char ch;

   out_str << right.n << '/' << right.d;

   return out_str;

}

//postcondition: return value is gcd of the absolute values

//of m and n depends on function int abs(int); declared in

//cstdlib

int gcd(int m, int n)

{

int t;

m = abs (m); // don't care about signs.

n = abs (n);

if(n < m) // make m >= n so algorithm will work!

{

    t = m;

    m = n;

    n = t;

   }

   int r;

   r = m % n;

while(r != 0)

{

   r = m%n;

   m = n;

   n = r;

}

return m;

}

//postcondition: n and d (to be numerator and denominator

//of a fraction)have all common factors removed, and d > 0.

void normalize(int& n, int& d)

{

   // remove common factors:

int g = gcd(n, d);

n = n/g;

d = d/g;

if(n > 0 && d < 0 || n < 0 && d < 0)

{

   n = -n;

   d = -d;

}

}

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote