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

(rationalNumber Class) create a class ratioanlNumber(fractional) with the follow

ID: 3630428 • Letter: #

Question

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

Rational numbers (fractions) are to be represented by their numerator and denominator. In order to have a unique representation, the constructor must simplify the fraction, making sure that the denomiator is a positive number, and that the numerator and denominator do not have a common divider.
For instance, -2/-4 should be reduced to 1/2, 6/-15 should be reduced to -2/5, and 12/8 should be reduced to 3/2. 0/100 should be 0/1.
To compute greatest common denominator, you need to use the Euclid algorithm (see for instance http://en.wikipedia.org/wiki/Euclidean_algorithm).
Comparing fractions can be done without doing any floating point calculation: a/b < c/d is the same as ad < bc when b and d are positive.

Explanation / Answer

#include "stdafx.h"

#include <iostream>

using namespace std;

class RationalNumber

{

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

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

public:

RationalNumber( int = 0, int = 1 ); // default constructor

RationalNumber operator+(RationalNumber x);

RationalNumber operator-(RationalNumber x);

RationalNumber operator*(RationalNumber x);

RationalNumber operator/(RationalNumber x);

bool operator<(RationalNumber x);

bool operator<=(RationalNumber x);

bool operator!=(RationalNumber x);

private:

int numerator; // private variable numerator

int denominator; // private variable denominator

void reduction(); // function for fraction reduction

}; // end class RationalNumber

//overloading extraction operator

istream& operator >> (istream &in, RationalNumber &num)

{

in>>num.numerator;

in>>num.denominator;

return in;

}

//overloading insertion operator

ostream& operator << (ostream &out, RationalNumber &num)

{

out<<num.numerator <<"/"<<num.denominator;

return out;

}

//reduces the fraction

void RationalNumber::reduction()

{

int largest;

int gcd = 0; // greatest common divisor

largest = numerator > denominator ? numerator : denominator;

for ( int loop = 2; loop <= largest; loop++ )

if ( numerator % loop == 0 && denominator % loop == 0 )

gcd = loop;

if (gcd != 0)

{

numerator /= gcd;

denominator /= gcd;

} // end if

} // end function reduction

//constructor

RationalNumber::RationalNumber(int n, int d)

{

numerator = n;

denominator = (d <= 0) ? 1 : d ;

}

//overloading addition operator

RationalNumber RationalNumber::operator + (RationalNumber x)

{

RationalNumber temp;

temp.numerator=numerator*x.denominator+x.numerator*denominator;

temp.denominator=x.denominator*denominator;

temp.reduction();

return(temp);

}

//overloading subtraction operator

RationalNumber RationalNumber::operator - (RationalNumber x)

{

RationalNumber temp;

temp.numerator=numerator*x.denominator-x.numerator*denominator;

temp.denominator=x.denominator*denominator;

temp.reduction();

return(temp);

}

//overloading multiplication operator

RationalNumber RationalNumber::operator *(RationalNumber x)

{

RationalNumber temp;

temp.numerator=numerator*x.numerator;

temp.denominator=denominator*x.denominator;

temp.reduction();

return(temp);

}

//overloading division operator

RationalNumber RationalNumber::operator / (RationalNumber x)

{

RationalNumber temp;

temp.numerator=numerator*x.denominator;

temp.denominator=denominator*x.numerator;

temp.reduction();

return(temp);

}

//overloading relation operator lessthan

bool RationalNumber::operator<(RationalNumber x)

{

float value = ((float) this->numerator)/this->denominator;

float xValue = ((float) x.numerator)/x.denominator;

return (value < xValue);

}

//overloading relation operator lessthan or equal to

bool RationalNumber::operator<=(RationalNumber x)

{

float value = ((float) this->numerator)/this->denominator;

float xValue = ((float) x.numerator)/x.denominator;

return (value <= xValue);

}

//overloading relation operator not equla to

bool RationalNumber::operator != (RationalNumber x)

{

float value = ((float) this->numerator)/this->denominator;

float xValue = ((float) x.numerator)/x.denominator;

return (value != xValue);

}

// main function

int main()

{

RationalNumber a,b;

char ch, choise;

do

{

cout << "Enter the first fraction: ";

cin >> a;

cout<<"Enter operator (+, - , * or /): ";

cin>>ch;

cout << "Enter the second fraction: ";

cin >> b;

RationalNumber c;

switch(ch)

{

case '+': c = a+b; break;

case '-': c = a-b; break;

case '*': c = a*b; break;

case '/': c = a/b; break;

default : cout<<"Invalid choise"<<endl;

}

cout << " The reuslt is: " << c<<endl;

cout<<" Do you want to continue (y-yes, n-no): ";

cin>>choise;

}while(choise != 'n' && choise!='N');

return 0;

}