(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;
}
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.