#ifndef __FE_RATIONAL_H #define __FE_RATIONAL_H /* * Module Rational.h * auteur: felipe * objet: * - montrer le decoupage declaration/definition (h/cc) en C++ * - montrer la surdefinition des operateurs (et ses inconvenients) * - montrer les parametres par defaut (ici applique au constructeur) * * compilation: g++ -o rat Rational.cc rat.cc * execution: rat */ #include class Rational { private: int num,den; inline int pgcd(int a, int b) { while (a != b) if (a < b) b -= a; else a -= b; return a; } /* * en pratique il faudrait lever une exception si le denominateur est 0 */ inline void normalise() { if (den <0) {num = - num; den = abs(den);} // le numerateur porte le signe (choix) int p = pgcd(abs(num),den); // reduction au meme denominateur num /= p; den /= p; } public: Rational(int n=0,int d=1):num(n),den(d) {normalise();}; inline Rational& operator- (); // le moins unaire inline Rational& operator+= (const Rational&); /* Note: * Voici un exemple de surdefinition qui nuit a la lisibilite * car ajouter un au num et den n'est pas une operation naturelle * sur les rationnels * * Note: c'est la version prefixee */ inline Rational& operator++() {++num; ++den; normalise(); return (*this);} /* * voici la version post-fixee * l'entier n'a aucune utilite, c'est juste une convention C++ * pour differencier ++x et x++ (beurk !) */ inline Rational& operator++(int z=0) {++num; ++den; normalise(); return (*this);} friend Rational operator+ (const Rational&,const Rational&); friend Rational operator- (const Rational&,const Rational&); friend Rational operator/ (const Rational&,const Rational&); friend Rational operator* (const Rational&,const Rational&); friend ostream& operator<<(ostream&,const Rational&); friend istream& operator>>(istream&,Rational&); friend bool operator==(const Rational&,const Rational&); friend bool operator!=(const Rational&,const Rational&); }; // le moins unaire (modifie l'objet appelant) Rational& Rational::operator- () { num = -num; return *this; } // modifie l'objet appelant Rational& Rational::operator+= (const Rational& r){ num = num*r.den + r.num*den; den = den*r.den; normalise(); return *this; } #endif