Create a class called Rational for performing arithmetic with fractions. Write a
ID: 3698465 • Letter: C
Question
Create a class called Rational for performing arithmetic with fractions. Write a program to test your class. Use integer variables to represent the private data of the class – the numerator and the denominator. Provide a constructor that enables an object of this class to be initialized when its declared. The constructor should contain default values in case no initializers are provided and should store the fraction in reduced form. For example the fraction would be stored in the object as 1 in the numerator and 2 in the denominator. Provide public member functions that perform each of the following tasks: add – Adds two rational numbers. The result should be stored in reduced form. subtract – Subtracts two rational numbers. Store the result in reduced form. multiply – Multiplies two rational numbers. The result should be stored in reduced form. divide – Divides two rational numbers. Store the result in reduced form. toRationalString – Returns a string representation of a Rational number in the form a/b, where a is the numberator and b is the denominator (e.g. “1/2”). toDouble – Returns the Rational number as a double. 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. Overload the addition, subtraction, multiplication and division operators for this class. Overload the relational and equality operators for this class.
Explanation / Answer
#include <iostream>
using namespace std;
class Rational
{
private:
int numerator;
int denominator;
public:
Rational() //default constructor
{
numerator = 0;
denominator = 1;
}
Rational(int num,int den) //argument constructor
{
if(denominator != 0)
{
numerator=num;
denominator=den;
}
simplify();
}
const Rational add(const Rational &r) const
{
Rational temp;
temp.numerator=numerator*r.denominator+r.numerator*denominator; // adding fractions
temp.denominator=denominator*r.denominator;
temp.simplify();
return temp;
}
const Rational subtract(const Rational &r) const
{
Rational temp;
temp.numerator=numerator*r.denominator-r.numerator*denominator;// subtract fractions
temp.denominator=denominator*r.denominator;
temp.simplify();
return temp;
}
const Rational multiply(const Rational &r) const
{
Rational temp;
temp.numerator=numerator*r.numerator;
temp.denominator=denominator*r.denominator;// multiply fractions
temp.simplify();
return temp;
}
const Rational divide(const Rational &r) const
{
Rational temp;
temp.numerator=numerator*r.denominator; // divide fractions
temp.denominator=denominator*r.numerator;
temp.simplify();
return temp;
}
//operator overloading functions
Rational operator+(Rational r)
{
Rational temp;
temp.numerator=numerator*r.denominator+r.numerator*denominator;
temp.denominator=denominator*r.denominator;
temp.simplify();
temp.simplify();
return temp;
}
Rational operator-(Rational r)
{
Rational temp;
temp.numerator=numerator*r.denominator-r.numerator*denominator;
temp.denominator=denominator*r.denominator;
temp.simplify();
return temp;
}
Rational operator*(Rational r)
{
Rational temp;
temp.numerator=numerator*r.numerator;
temp.denominator=denominator*r.denominator;
temp.simplify();
return temp;
}
Rational operator/(Rational r)
{
Rational temp;
temp.numerator=numerator*r.denominator;
temp.denominator=denominator*r.numerator;
temp.simplify();
return temp;
}
friend std::ostream& operator<<( std::ostream &output, const Rational &F )
{
output << F.numerator << " / " << F.denominator;
return output;
}
void toRationalString()
{
cout<<numerator<<"/"<<denominator;
}
double toDouble()
{
return (double)numerator/denominator;
}
int gcd(int x, int y) // compute greatest common divisor
{
int t;
while (y>0) {
t = x % y;
x = y;
y = t;
}
return x;
}
void simplify() {
int factor;
factor = gcd(numerator, denominator);
numerator = numerator / factor;
denominator = denominator / factor;
}
bool operator== (Rational &f2) //operator function
{
return ( this->numerator == f2.numerator && this->denominator == f2.denominator);
}
bool operator!= (Rational &f2) //operator function
{
return ( this->numerator != f2.numerator && this->denominator!= f2.denominator);
}
bool operator>(Rational &f2) //operator function
{
return ( this->numerator > f2.numerator && this->denominator == f2.denominator);
}
bool operator <(Rational &f2) //operator function
{
return ( this->numerator < f2.numerator && this->denominator != f2.denominator);
}
};
int main()
{
Rational r1(3,4);
Rational r2(2,5);
cout<<"Using operators : ";
cout<<" r1 + r2 = "<<r1+r2;
cout<<" r1 - r2 = "<<r1-r2;
cout<<" r1 * r2 = "<<r1*r2;
cout<<" r1 / r2 = "<<r1/r2;
cout<<" Using functions: ";
cout<<" r1 + r2 = "<<r1.add(r2);
cout<<" r1 - r2 = "<<r1.subtract(r2);
cout<<" r1 * r2 = "<<r1.multiply(r2);
cout<<" r1 / r2 = "<<r1.divide(r2);
if(r1 == r2)
cout<<" Both fractions are equal ";
else
cout<<" Both fractions are not equal ";
if(r1 > r2)
cout<<" r1 is greater than r2 ";
else
cout<<" r1 is not greater than r2 ";
return 0;
}
Output:
Using operators :
r1 + r2 = 23 / 20
r1 - r2 = 7 / 20
r1 * r2 = 3 / 10
r1 / r2 = 15 / 8
Using functions:
r1 + r2 = 23 / 20
r1 - r2 = 7 / 20
r1 * r2 = 3 / 10
r1 / r2 = 15 / 8
Both fractions are not equal
r1 is not greater than r2
Do ask if any doubt. Please upvote
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.