/** * * \file Rationnel.h * * \authors M. Laporte, D. Mathieu * * \date 06/11/2007 * * \version V1.0 * * \brief Declaration de la classe Rationnel - V2 * Gestion des exceptions * **/ #ifndef __RATIONNEL_H__ #define __RATIONNEL_H__ #include "CException.h" typedef unsigned long long ULLong_t; namespace nsMath { class Rationnel { int myNum; int myDenom; void Simplifier (void) noexcept; public : Rationnel (const int num = 0, const int denom = 1) throw (nsUtil::CException); Rationnel (const Rationnel & r) noexcept; void display (void) const; bool operator < (const Rationnel & r) const noexcept; bool operator == (const Rationnel & r) const noexcept; Rationnel operator + (const Rationnel & r) const noexcept; Rationnel operator - (const Rationnel & r) const noexcept; Rationnel operator * (const Rationnel & r) const noexcept; Rationnel operator / (const Rationnel & r) const throw (nsUtil::CException); }; // Rationnel } // namespace nsMath #endif /* __RATIONNEL_H__ */ /** * * \file Rationnel.cpp * * \authors M. Laporte, D. Mathieu * * \date 07/12/2011 * * \version V1.0 * * \brief Definition des methodes de la classe Rationnel (V2) * Gestion des exceptions * **/ #include <iostream> #include <exception> #include <cmath> // abs() #include "Rationnel.h" #include "CstCodErr.h" #include "CException.h" #define RATIONNEL nsMath::Rationnel using namespace std; using namespace nsUtil; using namespace nsMath; namespace { unsigned PGDC (unsigned a, unsigned b) noexcept { for ( ; a != b; ) { if (a < b) b -= a; else a -= b; } return a; } // PGDC() } // namespace RATIONNEL::Rationnel (const int num /* = 0 */, const int denom /* = 1 */) throw (CException) : myNum (num), myDenom (denom) { if (myDenom == 0) throw CException ("Diviseur nul", KExcDivZero); Simplifier (); } // Rationnel() RATIONNEL::Rationnel (const Rationnel & r) noexcept : myNum (r.myNum), myDenom (r.myDenom) {} void RATIONNEL::display (void) const { cout << myNum << '/' << myDenom; } // display() void RATIONNEL::Simplifier (void) noexcept { if (myDenom < 0) { myNum = -myNum; myDenom = -myDenom; } int pgdc = (myNum == 0) ? myDenom : PGDC (abs (myNum), abs (myDenom)); myNum /= pgdc; myDenom /= pgdc; } // Simplifier() bool RATIONNEL::operator < (const Rationnel & r) const noexcept { return myNum * r.myDenom < myDenom * r.myNum; } // operator < bool RATIONNEL::operator == (const Rationnel & r) const noexcept { return myNum == r.myNum && myDenom == r.myDenom; } // operator == RATIONNEL RATIONNEL::operator + (const Rationnel & r) const noexcept { return Rationnel (myNum * r.myDenom + r.myNum * myDenom, myDenom * r.myDenom); } // operator + RATIONNEL RATIONNEL::operator - (const Rationnel & r) const noexcept { return Rationnel (myNum * r.myDenom - r.myNum * myDenom, myDenom * r.myDenom); } // operator - RATIONNEL RATIONNEL::operator * (const Rationnel & r) const noexcept { return Rationnel (myNum * r.myNum, myDenom * r.myDenom); } // operator * RATIONNEL RATIONNEL::operator / (const Rationnel & r) const throw (CException) { if (r.myNum == 0) throw CException ("Division par zero", KExcDivZero); return Rationnel (myNum * r.myDenom, myDenom * r.myNum); } // operator / #undef CRATIONNEL /** * * \file TestRationnel.cxx * * \authors M. Laporte, D. Mathieu * * \date 07/12/2011 * * \version V1.0 * * \brief Test de la classe Rationnel (V2) * Gestion des exceptions * **/ #include <iostream> #include <exception> #include "Rationnel.h" using namespace std; using namespace nsUtil; using namespace nsMath; namespace { void testRationnel (void) { try { cout << "Rationnel R1 (12, 0)\n"; Rationnel r1 (12, 0); cout << "R1 = "; r1.display (); cout << '\n'; } catch (const CException & e) { cout << "Erreur : " << e.getLibelle () << "; code d'erreur = " << e.getCodErr () << '\n'; } try { Rationnel r1 (4, 12); cout << "R1 = "; r1.display (); cout << '\n'; Rationnel r2 (0, 12); cout << "R2 = "; r2.display (); cout << '\n'; r1.display(); cout << " / "; r2.display(); cout << " = "; (r1 / r2).display (); cout << '\n'; } catch (const CException & e) { cout << "Erreur : " << e.getLibelle () << "; code d'erreur = " << e.getCodErr () << '\n'; } } // testRationnel() } // namespace int main (void) { try { testRationnel (); } catch (const CException & e) { cerr << "Erreur : " << e.getLibelle () << '\n' << "Code d'erreur = " << e.getCodErr () << '\n'; return e.getCodErr(); } catch (const exception & e) { cerr << "Exception standard : " << e.what () << '\n'; return KExcStd; } catch (...) { cerr << "Exception inconnue\n"; return KExcInconnue; } return KNoExc; } // main()