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