Today I started to make a class called Fraction
, where the class will act just like a fraction does in real mathematics. I am doing this just for the challenge. So far I only made the addition part, because I wanted to know if anybody had any suggestions for me.
#include <iostream>
#include <string>
#include <cmath> //fmax
#include <vector>
#include <sstream> //stringstream
typedef const std::string constr;
namespace Util
{
template <typename T>
constr tostring (T t)
{
std::stringstream s;
s << t;
return s.str();
}
}//namespace Util
namespace math
{
class Fraction;
typedef const double cd;
typedef const long cl;
typedef std::vector<Fraction> vf;
class Math //for future use
{
private:
public:
};
class Fraction //Fractions cannot be of type 1.2/5.6
{
private: //variables
public: //variables
long numerator;
long denominator;
private: //functions
public:
Fraction();
Fraction(cl numerator_, cl denominator_);
~Fraction();
Fraction operator+ (const Fraction num);
Fraction operator+ (cl num); //should be possible, for mixed numbers (1 1/2 = 1+1/2=1/2+1)
cl getcommondemon (cl num1, cl num2);
vf setcommondemon (const Fraction& num1, const Fraction& num2);
constr tostring(void);
};
Fraction Fraction::operator+ (const Fraction num)
{
vf out = Fraction::setcommondemon(*this, num);
Fraction nn1 = out.at(0);
Fraction nn2 = out.at(1);
Fraction output;
output.numerator = nn1.numerator+nn2.numerator;
output.denominator = nn1.denominator;
return output;
}
cl Fraction::getcommondemon(cl num1, cl num2)
{
if(num1 == num2) return num1;
int max = fmax(num1, num2);
int min = fmin(num1, num2);
if(max % min == 0) //is max a multiple of min? if yes
{
return max;
}
else
{
return max*min;
}
}
Fraction::Fraction()
{
numerator = 0;
denominator = 0;
}
Fraction::Fraction(cl numerator_, cl denominator_)
{
numerator = numerator_;
denominator = denominator_;
}
Fraction::~Fraction()
{
//destructor
}
vf Fraction::setcommondemon(const Fraction& num1, const Fraction& num2)
{
vf output;
Fraction out1;
Fraction out2;
if(num1.denominator == num2.denominator)
{
output.push_back(num1);
output.push_back(num2);
return output;
}
bool num1bigger = false;
long max = 0;
long min = 0;
if(num1.denominator > num2.denominator)
{
num1bigger= true;
max = num1.denominator;
min = num2.denominator;
}
else
{
min = num1.denominator;
max = num2.denominator;
}
if(max % min == 0) //is max a multiple of min? if yes
{
cl multi = max/min;
if(num1bigger == true)
{
out2.numerator = num2.numerator*multi;
out2.denominator = num2.denominator*multi;
out1 = num1;
}
else
{
out1.numerator = num1.numerator*multi;
out1.denominator = num1.denominator*multi;
out2 = num2;
}
output.push_back(out1);
output.push_back(out2);
return output;
}
else
{
out1.numerator = num1.numerator*num2.denominator;
out1.denominator = num1.denominator*num2.denominator;
out2.numerator = num2.numerator*num1.denominator;
out2.denominator = num2.denominator*num1.denominator;
output.push_back(out1);
output.push_back(out2);
return output;
}
}
constr Fraction::tostring()
{
return Util::tostring(numerator) + "/" + Util::tostring(denominator);
}
} //namespace math
int main(int argc, char* argv[])
{
math::Fraction a(1,6);
math::Fraction b(1,3);
math::Fraction out = a+b;
std::cout << out.tostring() << std::endl;
return 0;
}