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

Develop and test a class of rational numbers. A rational number is of the form a

ID: 3541910 • Letter: D

Question

Develop and test a class of rational numbers. A rational number is of the form a/b where a and b are integers and b is not 0. Use operator overloading for the +, -, * and / operations. You also need to have default constructor, parameterized constructor, copy constuctor and the assignment operator overload.

Your class should handle arbitary numbers. To test your implementation, use the following numbers in the driver:

3/8+1/6; 1/2-1/6; 3/8*2/5; 3/8 / 1/6

And the following operations as well:

rational x; //Test the default constructor then display x

rational y(4, 5); //Test the parameterized constructor then display y

rational z = y; //Test the copy constructor then display z

x = y; //Test the assignment overload then display x

Explanation / Answer

Indented code can be found at:

https://dl.dropboxusercontent.com/u/42883368/chegg/Fraction.cpp


#include <iostream>
#include <string>

class Fraction {
   private:
      int numerator, denominator;
   public:
      //accessor methods
      void setNumerator(int);
      void setDenominator(int);
      int getNumerator();
      int getDenominator();
      //constructors
      Fraction();
      Fraction(int, int);
      //operator overloading methods
      Fraction operator+ (Fraction);
      Fraction operator- (Fraction);
      Fraction operator* (Fraction);
      Fraction operator/ (Fraction);
      //utility methods
      std::string print();
      int GCD(int, int);
      void reduce();
      void negateQuot();
};

//accessor method implementations
void Fraction::setNumerator(int n) { numerator = n; }
void Fraction::setDenominator(int d) { denominator = d; }
int Fraction::getNumerator() { return numerator; }
int Fraction::getDenominator() { return denominator; }

//constructor implementations
Fraction::Fraction() {
   numerator = 1;
   denominator = 1;
   reduce();
   negateQuot();
}

Fraction::Fraction(int a, int b) {
   numerator = a;
   denominator = b;
}

//operator overloading method implementations
Fraction Fraction::operator* (Fraction b) {
   return Fraction((numerator * b.getNumerator()), (denominator * b.getDenominator()));
}

Fraction Fraction::operator/ (Fraction b) {
   return Fraction((numerator * b.getDenominator()), (denominator * b.getNumerator()));
}

Fraction Fraction::operator+ (Fraction b) {
   if (numerator == 0 || b.getNumerator() == 0) {
      if (numerator != 0) {
         return Fraction(numerator, denominator);
      }
      else {
         return Fraction(b.getNumerator(), b.getDenominator());
      }
   }
   else {
      return Fraction((numerator * b.getDenominator()) + (denominator * b.getNumerator()), denominator * b.getDenominator());
   }
}

Fraction Fraction::operator- (Fraction b) {
   if (numerator == 0 || b.getNumerator() == 0) {
      if (numerator != 0) {
         return Fraction(numerator, denominator);
      }
      else {
         return Fraction(b.getNumerator(), b.getDenominator());
      }
   }
   else {
      return Fraction(numerator * b.getDenominator() - (denominator * b.getNumerator()), (denominator * b.getDenominator()));
   }
}

std::string to_string(int number){
    std::string number_string = "";
    char ones_char;
    int>     while(true){
        % 10;
        switch(ones){
            case 0:; break;
            case 1:; break;
            case 2:; break;
            case 3:; break;
            case 4:; break;
            case 5:; break;
            case 6:; break;
            case 7:; break;
            case 8:; break;
            case 9:; break;
            default : break;
        }
        number -= ones;
        number_string = ones_char + number_string;
        if(number == 0){
            break;
        }
        number = number/10;
    }
    return number_string;
}

//utility method implementations
std::string Fraction::print() {
   return to_string(numerator) + " / " + to_string(denominator);
}

int Fraction::GCD(int a, int b) {
   if (a == 0 || b == 0) {
      return 0;
   }
   else {
      int a1, b1, c = 0;
      if (a >= b) {
         a1 = a;
         b1 = b;
      }
      else {
         a1 = b;
         b1 = a;
      }

      while (b1 != 0) {
         c = a1 % b1;
         a1 = b1;
         b1 = c;
      }
      return a1;
}
}

void Fraction::reduce() {
   if (numerator == 0 || denominator == 0) {
      numerator = 0;
      denominator = 0;
   }
   else {
      int gcd = GCD(numerator, denominator);
      numerator /= gcd;
      denominator /= gcd;
   }
}

void Fraction::negateQuot() {
   if ((numerator < 0 && denominator < 0) || (numerator >= 0 && denominator < 0)) {
      numerator = -numerator;
      denominator = -denominator;
   }
}

int main(int argc, const char *argv[]) {
   int a,b;

   std::cout << "Give me the first numerator: ";
   std::cin >> a;
   std::cout << "Give me the second denominator: ";
   std::cin >> b;

   Fraction a1(a,b);
   std::cout << "The first fraction is " << a1.print() << std::endl;

   std::cout << "Give me the second numerator: ";
   std::cin >> a;
   std::cout << "Give me the second denominator: ";
   std:: cin >> b;

   Fraction a2(a,b);
   std::cout << "The second fraction is " << a2.print() << std::endl;

   std::cout << "The following operations were completed:" << std::endl;

   Fraction a3 = a1 + a2;
   std::cout << "ADDITION: " << a1.print() << " + " << a2.print() << " is " << a3.print() << std::endl;

   a3 = a1 - a2;
   std::cout << "SUBTRACTION: " << a1.print() << " - " << a2.print() << " is " << a3.print() << std::endl;

   a3 = a1 * a2;
   std::cout << "MULTIPLICATION: " << a1.print() << " * " << a2.print() << " is " << a3.print() << std::endl;

   a3 = a1 / a2;
   std::cout << "DIVISION: " << a1.print() << " / " << a2.print() << " is " << a3.print() << std::endl;
   return 0;
}