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; }