Compare commits

..

2 Commits

Author SHA1 Message Date
b8ee47e267 add very basic NR test
Some checks failed
Linux arm64 / Build (push) Failing after 8m57s
2024-02-25 20:29:10 +01:00
abd5c7ac56 refactor NR 2024-02-25 20:28:01 +01:00
3 changed files with 164 additions and 138 deletions

View File

@@ -1,159 +1,130 @@
#include "NR.h" #include "NR.h"
#include <cassert>
#include <iostream> #include <iostream>
int PGCD(int x, int y) { int PGCD(int x, int y) {
if(x==0 || y==0) if (x == 0 || y == 0)
return 1; return 1;
else if(x%y == 0) else if (x % y == 0)
return abs(y); return std::abs(y);
else else
return PGCD(y, x%y); return PGCD(y, x % y);
} }
NR::NR(int numerator, int denominator) { NR::NR() : m_Numerator(0), m_Denominator(1) {}
NRset(numerator, denominator);
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) { void NR::Reduce() {
if(denominator > 0) int divisor = PGCD(m_Denominator, m_Numerator);
m_Numerator = numerator; m_Denominator /= divisor;
else m_Numerator /= divisor;
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::reduceNR() { void NR::Invert() {
int divisor = PGCD(m_Denominator, m_Numerator); *this = NR(m_Denominator, m_Numerator);
m_Denominator /= divisor;
m_Numerator /= divisor;
} }
void NR::invertNR() { int NR::GetNumerator() const {
NRset(m_Denominator, m_Numerator); return m_Numerator;
} }
int NR::NRgetNum() const { int NR::GetDenominator() const {
return m_Numerator; return m_Denominator;
} }
int NR::NRgetDen() const { bool NR::operator==(const NR& opNR) const {
return m_Denominator; return (m_Numerator * opNR.GetDenominator() == m_Denominator * opNR.GetNumerator());
} }
NR& NR::operator =(const NR& opNR) { bool NR::operator<(const NR& opNR) const {
NRset(opNR.NRgetNum(),opNR.NRgetDen()); return (m_Numerator * opNR.GetDenominator() < m_Denominator * opNR.GetNumerator());
return *this;
} }
bool NR::operator ==(const NR& opNR) const { bool NR::operator>(const NR& opNR) const {
return (m_Numerator * opNR.NRgetDen() == m_Denominator * opNR.NRgetNum()); return (m_Numerator * opNR.GetDenominator() > m_Denominator * opNR.GetNumerator());
} }
bool NR::operator <(const NR& opNR) const { bool NR::operator!=(const NR& opNR) const {
return (m_Numerator * opNR.NRgetDen() < m_Denominator * opNR.NRgetNum()); return !(*this == opNR);
} }
bool NR::operator >(const NR& opNR) const { bool NR::operator<=(const NR& opNR) const {
return (m_Numerator * opNR.NRgetDen() > m_Denominator * opNR.NRgetNum()); return !(*this > opNR);
} }
bool NR::operator !=(const NR& opNR) const { bool NR::operator>=(const NR& opNR) const {
return (not (*this == opNR)); return !(*this < opNR);
} }
bool NR::operator <=(const NR& opNR) const { std::ostream& operator<<(std::ostream& os, const NR& opNR) {
return (not (*this > opNR)); os << opNR.GetNumerator() << "/" << opNR.GetDenominator();
return os;
} }
bool NR::operator >=(const NR& opNR) const { std::istream& operator>>(std::istream& is, NR& opNR) {
return (not (*this < opNR)); char slash;
is >> opNR.m_Numerator >> slash >> opNR.m_Denominator;
opNR.Reduce();
return is;
} }
std::ostream& operator <<(std::ostream& os, const NR& opNR) { NR NR::operator+(const NR& opNR) const {
os<<opNR.NRgetNum()<<"/"<<opNR.NRgetDen(); int num, den;
return os; 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) { NR NR::operator-(const NR& opNR) const {
int num, den; int num, den;
std::cout<<"Numerator: "; num = m_Numerator * opNR.GetDenominator();
is>>num; den = m_Denominator * opNR.GetDenominator();
std::cout<<"Denominator: "; num -= (opNR.GetNumerator() * m_Denominator);
is>>den; NR result(num, den);
opNR.NRset(num, den); return result;
return is;
} }
NR NR::operator +(const NR& opNR) const { NR NR::operator*(const NR& opNR) const {
int num, den; int num, den;
num = m_Numerator * opNR.NRgetDen(); num = m_Numerator * opNR.GetNumerator();
den = m_Denominator * opNR.NRgetDen(); den = m_Denominator * opNR.GetDenominator();
num += (opNR.NRgetNum() * m_Denominator); NR result(num, den);
NR result(num, den); return result;
return result;
} }
NR NR::operator -(const NR& opNR) const { NR NR::operator/(const NR& opNR) const {
int num, den; int num, den;
num = m_Numerator * opNR.NRgetDen(); num = m_Numerator * opNR.GetDenominator();
den = m_Denominator * opNR.NRgetDen(); den = m_Denominator * opNR.GetNumerator();
num -= (opNR.NRgetNum() * m_Denominator); NR result(num, den);
NR result(num, den); return result;
return result;
} }
NR NR::operator *(const NR& opNR) const { NR& NR::operator+=(const NR& opNR) {
int num, den; *this = *this + opNR;
num = m_Numerator * opNR.NRgetNum(); return *this;
den = m_Denominator * opNR.NRgetDen();
NR result(num, den);
return result;
} }
NR NR::operator /(const NR& opNR) const { NR& NR::operator-=(const NR& opNR) {
int num, den; *this = *this - opNR;
num = m_Numerator * opNR.NRgetDen(); return *this;
den = m_Denominator * opNR.NRgetNum();
NR result(num, den);
return result;
} }
void NR::test() { NR& NR::operator*=(const NR& opNR) {
NR* frac = new NR; *this = *this * opNR;
NR frac2(3); return *this;
NR frac3(2,5); }
int a, b;
std::cout<<"PGCD : entrez deux entiers"<<std::endl; NR& NR::operator/=(const NR& opNR) {
std::cin>>a>>b; *this = *this / opNR;
std::cout<<PGCD(a,b)<<std::endl; return *this;
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;
} }

View File

@@ -5,39 +5,41 @@
class NR { class NR {
private: private:
int m_Numerator; 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: 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) {} int GetNumerator() const;
NR(int numerator, int denominator); //check if denominator != 0 int GetDenominator() const;
void NRset(int numerator, int denominator); //same
void reduceNR(); //divide by PGCD, not automatically called yet bool operator==(const NR& opNR) const;
void invertNR(); bool operator<(const NR& opNR) const;
bool operator>(const NR& opNR) const;
int NRgetNum() const; bool operator!=(const NR& opNR) const;
int NRgetDen() const; bool operator<=(const NR& opNR) const;
NR& operator =(const NR& opNR); bool operator>=(const NR& opNR) const;
bool operator ==(const NR& opNR) const; NR operator+(const NR& opNR) const;
bool operator <(const NR& opNR) const; NR operator-(const NR& opNR) const;
bool operator >(const NR& opNR) const; NR operator*(const NR& opNR) const;
NR operator/(const NR& opNR) const;
bool operator !=(const NR& opNR) const; NR& operator+=(const NR& opNR);
bool operator <=(const NR& opNR) const; NR& operator-=(const NR& opNR);
bool operator >=(const NR& opNR) const; NR& operator*=(const NR& opNR);
NR& operator/=(const NR& opNR);
friend std::ostream& operator <<(std::ostream& os, const NR& opNR); void Invert();
friend std::istream& operator >>(std::istream& os, NR& opNR);
NR operator +(const NR& opNR) const; friend std::ostream& operator<<(std::ostream& os, const NR& opNR);
NR operator -(const NR& opNR) const; friend std::istream& operator>>(std::istream& os, NR& opNR);
NR operator *(const NR& opNR) const;
NR operator /(const NR& opNR) const;
static void test(); private:
void Reduce();
}; };
int PGCD(int x, int y); int PGCD(int x, int y);

53
test/test_rational.cpp Normal file
View File

@@ -0,0 +1,53 @@
#include "NR.h"
#include <cassert>
static void 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).GetNumerator() << "/" << (fractest + frac3).GetDenominator() << 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.Reduce();
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 frac1 {2};
NR frac2 {1};
assert(frac1 != frac2);
frac2 *= 2;
assert(frac1 == frac2);
}
int main(int argc, char** argv) {
test();
return 0;
}