My code seems to work fine. However, I feel like it is a bit too long (fraction.cpp). I really want to create simple, readable, and efficient code.
Here is the fraction.h file:
#ifndef FRACTION_H #define FRACTION_H #include <QString> class Fraction { public: Fraction(); Fraction(int numberator, int denominator); void set(int numberator, int denominator); QString toString() const; double toDouble() const; int findGCD(int a, int b); Fraction simplify(); Fraction add(const Fraction& other); Fraction substract(const Fraction& other); Fraction multiphy(const Fraction& other); Fraction divide(const Fraction& other); private: int m_Numerator; int m_Denominator; }; #endif // FRACTION_H Here is the fraction.cpp file:
#include "fraction.h" // Constructors: Fraction::Fraction() :m_Numerator(0), m_Denominator(0) {} Fraction::Fraction(int numerator, int denominator) :m_Numerator(numerator), m_Denominator(denominator) { } // Setter method void Fraction::set(int numberator, int denominator) { m_Numerator = numberator; m_Denominator = denominator; } // GCD int Fraction::findGCD(int a, int b) { if (a == 0) return b; return findGCD(b%a, a); } // Simplify Fraction Fraction::simplify() { int gcd = findGCD(m_Numerator, m_Denominator); return Fraction::Fraction(m_Numerator / gcd, m_Denominator / gcd); } double Fraction::toDouble() const { return ((double) m_Numerator/m_Denominator); } QString Fraction::toString()const { return QString("%1 / %2 = %3") .arg(m_Numerator) .arg(m_Denominator) .arg(toDouble()); } Fraction Fraction::add(const Fraction &other) { int numeratorTemp(m_Numerator); int denominatorTemp(m_Denominator); if (m_Denominator == other.m_Denominator) { numeratorTemp = m_Numerator + other.m_Numerator; } else { numeratorTemp = m_Numerator * other.m_Denominator + other.m_Numerator * m_Denominator; denominatorTemp = m_Denominator * other.m_Denominator; } return Fraction::Fraction(numeratorTemp, denominatorTemp); } Fraction Fraction::substract(const Fraction &other) { int numeratorTemp(m_Numerator); int denominatorTemp(m_Denominator); if (m_Denominator == other.m_Denominator) { numeratorTemp = m_Numerator - other.m_Numerator; } else { numeratorTemp = m_Numerator * other.m_Denominator - other.m_Numerator * m_Denominator; denominatorTemp = m_Denominator * other.m_Denominator; } return Fraction::Fraction(numeratorTemp, denominatorTemp); } Fraction Fraction::divide(const Fraction &other) { int numeratorTemp(m_Numerator); int denominatorTemp(m_Denominator); numeratorTemp = m_Numerator * other.m_Denominator; denominatorTemp = m_Denominator * other.m_Numerator; return Fraction::Fraction(numeratorTemp, denominatorTemp); } Fraction Fraction::multiphy(const Fraction &other) { int numeratorTemp(m_Numerator); int denominatorTemp(m_Denominator); numeratorTemp = m_Numerator * other.m_Numerator; denominatorTemp = m_Denominator * other.m_Denominator; return Fraction::Fraction(numeratorTemp, denominatorTemp); } Main.cpp:
#include <QCoreApplication> #include <iostream> #include "fraction.h" int main() { using namespace std; Fraction frac1(1, 2); Fraction frac2(5, 2); cout << "Addition: 1/2 + 5/2 = " << frac1.add(frac2).simplify().toString().toUtf8().constData() << "\n"; cout << "Substraction: 1/2 - 5/2 = " << frac1.substract(frac2).simplify().toString().toUtf8().constData() << "\n"; cout << "Divide: 1/2 : 5/2 = " << frac1.divide(frac2).simplify().toString().toUtf8().constData() << "\n"; cout << "Multiplication: 1/2 * 5/2 = " << frac1.multiphy(frac2).simplify().toString().toUtf8().constData() << "\n"; } Output: https://i.sstatic.net/cnT9A.png
