refactor NR
This commit is contained in:
199
src/NR.cpp
199
src/NR.cpp
@@ -1,159 +1,130 @@
|
||||
#include "NR.h"
|
||||
|
||||
#include <cassert>
|
||||
#include <iostream>
|
||||
|
||||
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"<<std::endl;
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
else
|
||||
m_Denominator = abs(denominator);
|
||||
void NR::Reduce() {
|
||||
int divisor = PGCD(m_Denominator, m_Numerator);
|
||||
m_Denominator /= divisor;
|
||||
m_Numerator /= divisor;
|
||||
}
|
||||
|
||||
void NR::reduceNR() {
|
||||
int divisor = PGCD(m_Denominator, m_Numerator);
|
||||
m_Denominator /= divisor;
|
||||
m_Numerator /= divisor;
|
||||
void NR::Invert() {
|
||||
*this = NR(m_Denominator, m_Numerator);
|
||||
}
|
||||
|
||||
void NR::invertNR() {
|
||||
NRset(m_Denominator, m_Numerator);
|
||||
int NR::GetNumerator() const {
|
||||
return m_Numerator;
|
||||
}
|
||||
|
||||
int NR::NRgetNum() const {
|
||||
return m_Numerator;
|
||||
int NR::GetDenominator() const {
|
||||
return m_Denominator;
|
||||
}
|
||||
|
||||
int NR::NRgetDen() const {
|
||||
return m_Denominator;
|
||||
bool NR::operator==(const NR& opNR) const {
|
||||
return (m_Numerator * opNR.GetDenominator() == m_Denominator * opNR.GetNumerator());
|
||||
}
|
||||
|
||||
NR& NR::operator =(const NR& opNR) {
|
||||
NRset(opNR.NRgetNum(),opNR.NRgetDen());
|
||||
return *this;
|
||||
bool NR::operator<(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 (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<<opNR.NRgetNum()<<"/"<<opNR.NRgetDen();
|
||||
return os;
|
||||
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;
|
||||
}
|
||||
|
||||
std::istream& operator >>(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"<<std::endl;
|
||||
std::cin>>a>>b;
|
||||
std::cout<<PGCD(a,b)<<std::endl;
|
||||
std::cout<<"frac : entrez deux entiers"<<std::endl;
|
||||
std::cin>>a>>b;
|
||||
NR fractest(a, b);
|
||||
std::cout<<fractest<<" + "<<frac3<<" = "<<std::endl;
|
||||
std::cout<<">> "<<(fractest + frac3)<<std::endl;
|
||||
std::cout<<">> "<<(fractest + frac3).NRgetNum()<<"/"<<(fractest + frac3).NRgetDen()<<std::endl;
|
||||
fractest = fractest + frac3;
|
||||
std::cout<<">> "<<fractest<<std::endl;
|
||||
frac->NRset(2, 4);
|
||||
NR anotherfrac;
|
||||
std::cin>>anotherfrac;
|
||||
std::cout<<"Compare "<<fractest<<" and "<<anotherfrac<<" : ==? "<<(fractest == anotherfrac)<<" <? "<<(fractest < anotherfrac)<<" >=? "<<(fractest >= anotherfrac)<< std::endl;
|
||||
std::cout<<anotherfrac<<" - "<<*frac<<" = "<<anotherfrac - *frac<<std::endl;
|
||||
std::cout<<anotherfrac<<" * "<<*frac<<" = "<<std::endl<<">> "<<anotherfrac * *frac<<std::endl;
|
||||
fractest = anotherfrac * *frac;
|
||||
std::cout<<">> "<<fractest<<std::endl;
|
||||
fractest.reduceNR();
|
||||
std::cout<<">> "<<fractest<<std::endl;
|
||||
std::cout<<anotherfrac<<" / "<<frac2<<" = "<<anotherfrac / frac2<<std::endl;
|
||||
NR numNR(2,4);
|
||||
NR otherNR(3,1);
|
||||
std::cout<<numNR<<" - "<<otherNR<<" = "<<std::endl;
|
||||
NR subNR = numNR - otherNR;
|
||||
std::cout<<">> "<<(numNR - otherNR)<<std::endl<<">> "<<subNR<<std::endl;
|
||||
delete frac;
|
||||
NR& NR::operator*=(const NR& opNR) {
|
||||
*this = *this * opNR;
|
||||
return *this;
|
||||
}
|
||||
|
||||
NR& NR::operator/=(const NR& opNR) {
|
||||
*this = *this / opNR;
|
||||
return *this;
|
||||
}
|
||||
48
src/NR.h
48
src/NR.h
@@ -5,39 +5,41 @@
|
||||
class NR {
|
||||
private:
|
||||
int m_Numerator;
|
||||
int m_Denominator; //has to be > 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);
|
||||
|
||||
Reference in New Issue
Block a user