/* THE FRACTION CLASS
-Sanchit Karve
born2c0de@hotmail.com
Use this class to carry out a few mathematical operations on Fractions.
-> Add,Subtract,Multiply,Divide and Compare Fractions.
-> Contains Various Methods of assigning values to objects.
-> Example Program ( in main() ) to show how each function in the class can
be used for various operations.
*/
#include <iostream>
using namespace std;
class fraction
{
private:
int num; // Numerator
int den; // Denominator
void simplify(); // Simplify Function
static int lcm(int,int); // lcm...but not really as u shall see...
public:
fraction(); // Constructor
fraction(int,int); // 2 Argument Constructor
fraction(float); // 1 Argument Constructor
fraction(fraction&); // Copy Constructor
~fraction(); // Destructor
float fractofloat(); // Fraction to Float Function
void operator =(float); // Overloaded Assignment Operator 1
void operator =(fraction);// Overloaded Assignment Operator 2
fraction operator +(fraction); // Addition of Fractions
fraction operator -(fraction); // Subtraction of Fractions
fraction operator *(fraction); // Product of Fractions
fraction operator /(fraction); // Division of Fractions
bool operator ==(fraction); // Equality Overloaded Function
bool operator !=(fraction); // InEquality Overloaded Function
bool operator <(fraction); // Comparison
bool operator <=(fraction); // Overloaded
bool operator >(fraction); // Functions
bool operator >=(fraction); // ''
friend ostream& operator <<(ostream &s,fraction f); // for cout
};
fraction::fraction()
{
num=0;
den=1;
}
fraction::fraction(int n,int d)
{
num=n;
den=(d==0)? 1 :d;
simplify();
}
fraction::fraction(float f)
{
num=f*100000;
den=100000;
simplify();
}
fraction::fraction(fraction& f)
{
num=f.num;
den=f.den;
fraction::simplify();
}
fraction::~fraction()
{
}
void fraction::simplify()
{
float n=(float)this->num;
float d=(float)this->den;
int i=2;
while((i<=n) && (n!=1))
{
while((n/i==(int)n/i) && (d/i ==(int)d/i))
{
n/=i;
d/=i;
}
i++;
}
num=n;
den=(n==0)?1:d;
}
int fraction::lcm(int a,int b)
{
return a*b;
// Just the Multiplied product is returned since the
// Fraction will be simplified further anyway
}
float fraction::fractofloat()
{
return (float)num /(float)den;
}
void fraction::operator =(fraction f)
{
num=f.num;
den=f.den;
fraction::simplify();
}
void fraction::operator =(float f)
{
num=f*100000;
den=100000;
fraction::simplify();
}
fraction fraction::operator +(fraction f)
{
fraction::simplify();
fraction tmp;
f.simplify();
if(den==f.den)
{
tmp.num=num+f.num;
tmp.den=den;
}
else
{
int lcm=fraction::lcm(den,f.den);
tmp.num=(num*(lcm/den)) + (f.num*(lcm/f.den));
tmp.den=lcm;
}
tmp.simplify();
return tmp;
}
fraction fraction::operator -(fraction f)
{
fraction::simplify();
fraction tmp;
f.simplify();
if(den==f.den)
{
tmp.num=num - f.num;
tmp.den=den;
}
else
{
int lcm=fraction::lcm(den,f.den);
tmp.num=(num*(lcm/den)) - (f.num*(lcm/f.den));
tmp.den=lcm;
}
tmp.simplify();
return tmp;
}
fraction fraction::operator *(fraction f)
{
fraction::simplify();
fraction tmp;
tmp.num=this->num * f.num;
tmp.den=this->den * f.den;
tmp.simplify();
return tmp;
}
fraction fraction::operator /(fraction f)
{
fraction::simplify();
fraction tmp;
tmp.num=this->num / f.num;
tmp.den=this->den / f.den;
tmp.simplify();
return tmp;
}
bool fraction::operator ==(fraction f)
{
fraction::simplify();
f.simplify();
return ((num==f.num) && (den==f.den)) ? 1 : 0;
}
bool fraction::operator !=(fraction f)
{
fraction::simplify();
f.simplify();
return ((num==f.num) && (den==f.den)) ? 0 : 1;
}
bool fraction::operator <(fraction f)
{
int d;
d=this->den;
den*=f.den;
num*=f.den;
f.den*=d;
f.num*=d;
return (num<f.num) ? 1 : 0;
}
bool fraction::operator <=(fraction f)
{
int d;
d=this->den;
den*=f.den;
num*=f.den;
f.den*=d;
f.num*=d;
return (num<=f.num) ? 1 : 0;
}
bool fraction::operator >(fraction f)
{
int d;
d=this->den;
den*=f.den;
num*=f.den;
f.den*=d;
f.num*=d;
return (num>f.num) ? 1 : 0;
}
bool fraction::operator >=(fraction f)
{
int d;
d=this->den;
den*=f.den;
num*=f.den;
f.den*=d;
f.num*=d;
return (num>=f.num) ? 1 : 0;
}
ostream& operator <<(ostream &s,fraction f)
{
s<<f.num<<" / "<<f.den;
return s;
}
int main()
{
fraction a; // Calls ZERO ARGUMENT Contructor
fraction b(3,2); // Calls 2 Argument Constructor
fraction c=1.2; // Calls 1 Argument Constructor
cout<<"1.2 is equal to "<<c<<endl;
fraction d=b; // Calls Copy Constructor
cout<<d<<" is equal to "<<d.fractofloat();//Calls fractofloat(),<< overloaded
a=6.25; // Calls void operator =(float)
cout<<"\nValue of a = "<<a;
a=c; // Calls void operator =(fraction)
cout<<"\nNew Value of a = "<<a<<endl;
cout<<b<<" + "<<c<<" = "<<(b+c); // Calls fraction operator +(fraction)
d=(b-a)*c/a; // Calls -,*,/ Overloaded Functions
cout<<"\nNew Value of d = "<<d;
if(a==c) // Calls == overloaded function
cout<<endl<<a<<" is equal to "<<c;
if(b!=c) // Calls != Overloaded Function
cout<<endl<<b<<" is not equal to "<<c;
if(b>c) // Calls > Overloaded Function
cout<<endl<<b<<" is greater than "<<c;
if(b>=c)// Calls >= Overloaded Function
cout<<endl<<b<<" is greater than or equal to "<<c;
if(b<c)// Calls < Overloaded Function
cout<<endl<<b<<" is lesser than "<<c;
if(b<=c)// Calls <= Overloaded Function
cout<<endl<<b<<" is lesser than or equal to "<<c;
return 0;
}