diff --git a/src/NR.cpp b/src/NR.cpp index d86584b..b32d64e 100644 --- a/src/NR.cpp +++ b/src/NR.cpp @@ -1,159 +1,130 @@ #include "NR.h" + +#include #include int PGCD(int x, int y) { - if(x==0 || y==0) - return 1; - else if(x%y == 0) - return abs(y); - else - return PGCD(y, x%y); + if (x == 0 || y == 0) + return 1; + else if (x % y == 0) + return std::abs(y); + else + return PGCD(y, x % y); } -NR::NR(int numerator, int denominator) { - NRset(numerator, denominator); +NR::NR() : m_Numerator(0), m_Denominator(1) {} + +NR::NR(int entier) : m_Numerator(entier), m_Denominator(1) {} + +NR::NR(int numerator, int denominator) : + m_Numerator((denominator > 0) ? numerator : -numerator), m_Denominator(std::abs(denominator)) { + assert(denominator != 0); } -void NR::NRset(int numerator, int denominator) { - if(denominator > 0) - m_Numerator = numerator; - else - m_Numerator = (-1)*numerator; - if(denominator == 0) { - std::cout<<"Essaie de créer une fraction avec un dénominateur = 0, impossible"<(const NR& opNR) const { + return (m_Numerator * opNR.GetDenominator() > m_Denominator * opNR.GetNumerator()); } -bool NR::operator <(const NR& opNR) const { - return (m_Numerator * opNR.NRgetDen() < m_Denominator * opNR.NRgetNum()); +bool NR::operator!=(const NR& opNR) const { + return !(*this == opNR); } -bool NR::operator >(const NR& opNR) const { - return (m_Numerator * opNR.NRgetDen() > m_Denominator * opNR.NRgetNum()); +bool NR::operator<=(const NR& opNR) const { + return !(*this > opNR); } -bool NR::operator !=(const NR& opNR) const { - return (not (*this == opNR)); +bool NR::operator>=(const NR& opNR) const { + return !(*this < opNR); } -bool NR::operator <=(const NR& opNR) const { - return (not (*this > opNR)); +std::ostream& operator<<(std::ostream& os, const NR& opNR) { + os << opNR.GetNumerator() << "/" << opNR.GetDenominator(); + return os; } -bool NR::operator >=(const NR& opNR) const { - return (not (*this < opNR)); +std::istream& operator>>(std::istream& is, NR& opNR) { + char slash; + is >> opNR.m_Numerator >> slash >> opNR.m_Denominator; + opNR.Reduce(); + return is; } -std::ostream& operator <<(std::ostream& os, const NR& opNR) { - os<>(std::istream& is, NR& opNR) { - int num, den; - std::cout<<"Numerator: "; - is>>num; - std::cout<<"Denominator: "; - is>>den; - opNR.NRset(num, den); - return is; +NR NR::operator-(const NR& opNR) const { + int num, den; + num = m_Numerator * opNR.GetDenominator(); + den = m_Denominator * opNR.GetDenominator(); + num -= (opNR.GetNumerator() * m_Denominator); + NR result(num, den); + return result; } -NR NR::operator +(const NR& opNR) const { - int num, den; - num = m_Numerator * opNR.NRgetDen(); - den = m_Denominator * opNR.NRgetDen(); - num += (opNR.NRgetNum() * m_Denominator); - NR result(num, den); - return result; +NR NR::operator*(const NR& opNR) const { + int num, den; + num = m_Numerator * opNR.GetNumerator(); + den = m_Denominator * opNR.GetDenominator(); + NR result(num, den); + return result; } -NR NR::operator -(const NR& opNR) const { - int num, den; - num = m_Numerator * opNR.NRgetDen(); - den = m_Denominator * opNR.NRgetDen(); - num -= (opNR.NRgetNum() * m_Denominator); - NR result(num, den); - return result; +NR NR::operator/(const NR& opNR) const { + int num, den; + num = m_Numerator * opNR.GetDenominator(); + den = m_Denominator * opNR.GetNumerator(); + NR result(num, den); + return result; } -NR NR::operator *(const NR& opNR) const { - int num, den; - num = m_Numerator * opNR.NRgetNum(); - den = m_Denominator * opNR.NRgetDen(); - NR result(num, den); - return result; +NR& NR::operator+=(const NR& opNR) { + *this = *this + opNR; + return *this; } -NR NR::operator /(const NR& opNR) const { - int num, den; - num = m_Numerator * opNR.NRgetDen(); - den = m_Denominator * opNR.NRgetNum(); - NR result(num, den); - return result; +NR& NR::operator-=(const NR& opNR) { + *this = *this - opNR; + return *this; } -void NR::test() { - NR* frac = new NR; - NR frac2(3); - NR frac3(2,5); - int a, b; - std::cout<<"PGCD : entrez deux entiers"<>a>>b; - std::cout<>a>>b; - NR fractest(a, b); - std::cout<> "<<(fractest + frac3)<> "<<(fractest + frac3).NRgetNum()<<"/"<<(fractest + frac3).NRgetDen()<> "<NRset(2, 4); - NR anotherfrac; - std::cin>>anotherfrac; - std::cout<<"Compare "<=? "<<(fractest >= anotherfrac)<< std::endl; - std::cout<> "<> "<> "<> "<<(numNR - otherNR)<> "< 0, sign is carried by the numerator + int m_Denominator; // has to be > 0, sign is carried by the numerator public: - NR() : m_Numerator(0), m_Denominator(1) {} + NR(); + NR(int entier); + NR(int numerator, int denominator); // check if denominator != 0 - NR(int entier) : m_Numerator(entier), m_Denominator(1) {} - NR(int numerator, int denominator); //check if denominator != 0 - void NRset(int numerator, int denominator); //same + int GetNumerator() const; + int GetDenominator() const; - void reduceNR(); //divide by PGCD, not automatically called yet - void invertNR(); + bool operator==(const NR& opNR) const; + bool operator<(const NR& opNR) const; + bool operator>(const NR& opNR) const; - int NRgetNum() const; - int NRgetDen() const; - NR& operator =(const NR& opNR); + bool operator!=(const NR& opNR) const; + bool operator<=(const NR& opNR) const; + bool operator>=(const NR& opNR) const; - bool operator ==(const NR& opNR) const; - bool operator <(const NR& opNR) const; - bool operator >(const NR& opNR) const; + NR operator+(const NR& opNR) const; + NR operator-(const NR& opNR) const; + NR operator*(const NR& opNR) const; + NR operator/(const NR& opNR) const; - bool operator !=(const NR& opNR) const; - bool operator <=(const NR& opNR) const; - bool operator >=(const NR& opNR) const; + NR& operator+=(const NR& opNR); + NR& operator-=(const NR& opNR); + NR& operator*=(const NR& opNR); + NR& operator/=(const NR& opNR); - friend std::ostream& operator <<(std::ostream& os, const NR& opNR); - friend std::istream& operator >>(std::istream& os, NR& opNR); + void Invert(); - NR operator +(const NR& opNR) const; - NR operator -(const NR& opNR) const; - NR operator *(const NR& opNR) const; - NR operator /(const NR& opNR) const; + friend std::ostream& operator<<(std::ostream& os, const NR& opNR); + friend std::istream& operator>>(std::istream& os, NR& opNR); - static void test(); + private: + void Reduce(); }; int PGCD(int x, int y);