/* Fichier Opera.cpp (premier exemple simple de surcharger qq opérateurs simples) Matière dans cet exemple : . Style d'implémentation des méthodes en dehors de la classe . surcharge quelques opérateurs < , >=, == << . révision de patrons de fonctions (plusieurs dans cet exemple) par LVN pour IFT 1166 */ #include // entrée-sortie standard #include // formatage (présentation) #include using namespace std; // librairie standard class Fraction { private: int numerateur, denominateur; public: Fraction(int , int ); Fraction(int); bool operator < (const Fraction & autre); bool operator >= (const Fraction & autre); bool operator == (const Fraction & autre); void afficher(string mess); /* surcharger de l'opérateur d'affichage : pas aux examens, seulement pour TP3 */ friend ostream& operator << (ostream& , const Fraction & autre); }; Fraction::Fraction(int numerateur , int denominateur ) { this->numerateur = numerateur; this->denominateur = denominateur ; } Fraction::Fraction(int nombre) { this->numerateur = nombre; this->denominateur = 1; } bool Fraction::operator < (const Fraction & autre) { return this->numerateur * autre.denominateur < this->denominateur * autre.numerateur; } bool Fraction::operator >= (const Fraction & autre) { return ! ( *this < autre ); } bool Fraction::operator == (const Fraction & autre) { return this->numerateur * autre.denominateur == this->denominateur * autre.numerateur; } void Fraction::afficher(string mess){ cout << "Infos de la fraction " << mess << ":\n"; cout << " - numerateur : " << numerateur <\n"; return sortie; } void continuer() { cout << endl << endl << "Appuyez sur une lettre suivie de Entree " ; char lettre; cin >> lettre ; cout << endl << endl; } void demo1() { cout << "Premiere demonstration :\n"; Fraction fr1(1, 2), fr2(3, 4), fr3(6), fr4(5,10); fr1.afficher("fr1"); fr2.afficher("numero 2"); fr3.afficher("# 3"); fr4.afficher("fr4"); cout << "Infos de fr4 : " << fr4 << endl ; cout << "fr1 < fr2 vaut " << (fr1 < fr2) << endl ; cout << "fr1 >= fr2 vaut " << (fr1 >= fr2) << endl ; cout << "fr1 == fr4 vaut " << (fr1 == fr4) << endl ; cout << "fr1 == fr2 vaut " << (fr1 == fr2) << endl ; cout << "\nFin de la premiere demonstration :\n\n"; } template void afficher(T tableau[], int nbElem, string mess) { cout << "\nContenu du tableau " << mess << " :\n"; for (int i = 0; i < nbElem; i++) cout << setw(2) << i << ") " << tableau[i] ; cout << endl ; } template int indMin ( T tableau[], int nbElem) { int indice = 0; for (int i = 1; i < nbElem ; i++) if ( tableau[i] < tableau[indice]) indice = i; return indice; } // patron de fonctions : une des nouveautés de C++ template void permuter(T & a, T &b) { T tempo = a; a = b; b = tempo; } template void trier(T tableau[], int nbElem) { for (int i = 0 ; i < nbElem-1; i++) { int indMin = i; for (int j = i+1; j < nbElem; j++) if (tableau[j] < tableau[indMin]) indMin = j; if ( indMin != i) permuter(tableau[i], tableau[indMin]); } } void demo2() { cout << "Deuxieme demonstration :\n"; Fraction fr[] = { Fraction(2, 3), Fraction(5, 7), Fraction(18, 11), Fraction(9), Fraction(6, 5), Fraction(1, 7), Fraction(3, 8) }; int nbFract = sizeof(fr) / sizeof(Fraction); afficher(fr, nbFract, "des fractions avant le tri"); cout << "La fraction la plus petite du tableau: " << fr [ indMin(fr, nbFract) ] << endl ; trier(fr, nbFract); afficher(fr, nbFract, "des fractions apres le tri"); cout << "\nFin de la deuxieme demonstration :\n"; } int main() { demo1(); continuer(); demo2(); continuer(); return 0; } /* Exécution : Premiere demonstration : Infos de la fraction fr1: - numerateur : 1 - denominateur : 2 Infos de la fraction numero 2: - numerateur : 3 - denominateur : 4 Infos de la fraction # 3: - numerateur : 6 - denominateur : 1 Infos de la fraction fr4: - numerateur : 5 - denominateur : 10 Infos de fr4 : <5 / 10> fr1 < fr2 vaut 1 fr1 >= fr2 vaut 0 fr1 == fr4 vaut 1 fr1 == fr2 vaut 0 Fin de la premiere demonstration : Appuyez sur une lettre suivie de Entree f Deuxieme demonstration : Contenu du tableau des fractions avant le tri : 0) <2 / 3> 1) <5 / 7> 2) <18 / 11> 3) <9 / 1> 4) <6 / 5> 5) <1 / 7> 6) <3 / 8> La fraction la plus petite du tableau: <1 / 7> Contenu du tableau des fractions apres le tri : 0) <1 / 7> 1) <3 / 8> 2) <2 / 3> 3) <5 / 7> 4) <6 / 5> 5) <18 / 11> 6) <9 / 1> Fin de la deuxieme demonstration : Appuyez sur une lettre suivie de Entree */