02 Fév2017
Surcharge des opérateurs de la classe Fraction
Objectifs:
- Surcharger les opérateurs arithmétiques
- Surcharger les opérateurs de comparaisons
- Définir un opérateur sur deux opérandes de types différents
Énoncé:
L'objectif de cet exercice corrigé en C++ est de définir les opérateurs de comparaisons et les opérateurs arithmétiques d'une classe Fraction en utilisant les fonctions membres et les fonctions amies.
- Créer la classe Fraction possédant deux données membres « num » et « den » qui correspondent respectivement au numérateur et au dénominateur de la fraction.
- Définir un constructeur d'initialisation
- Définir une fonction membre afficher()
- Définir les opérateurs arithmétiques (+, - , * et / ) entre deux fractions
- Définir les opérateurs arithmétiques (+, - , * et / ) entre une fraction et un nombre
- Définir les opérateurs de comparaison (==, !=, <, >, <=, >=) sur deux fractions.
- Créer un programme de test
Exemple d’exécution 1 :
Fraction F1 : 1/2
Fraction F2 : 3/5
F1 + F2 = 11/10
F1 - F2 = -1/10
F1 * F2 = 3/10
F1 / F2 = 5/6
F1 + 5 = 11/2
3 * F2 = 9/5
Les deux fractions ne sont pas egales
La fraction la plus grande est : 3/5
Exemple d’exécution 2 :
Fraction F1 : 3/5
Fraction F2 : 3/5
F1 + F2 = 30/25
F1 - F2 = 0/25
F1 * F2 = 9/25
F1 / F2 = 15/15
F1 + 5 = 28/5
3 * F2 = 9/5
Les deux fractions sont égales
Remarque :
On ne demande pas de normaliser la fraction
//Chapitre : Surcharge des opérateurs en C++ //Programme : Classe Fraction //Auteur : IDMAMSOUR //Copyright : Exelib.net #include <iostream> #include <cmath> using namespace std; class fraction { int num; int den; public: fraction(int a = 1, int b = 1) { num = a; den = b; } void afficher() { cout << num << "/" << den << endl; } //Une fonction qui sert pour la division fraction inverse() { fraction r; r.num = den; r.den = num; return r; } //Opérateurs entre deux fractions : fraction OP fraction fraction operator+(fraction f) { fraction s; s.num = num * f.den + den * f.num; s.den = den * f.den; return s; } fraction operator-(fraction f) { fraction s; s.num = num * f.den - den * f.num; s.den = den * f.den; return s; } fraction operator*(fraction f) { fraction s; s.num = num * f.num; s.den = den * f.den; return s; } fraction operator/(fraction f) { return *this * (f.inverse()); } //Opérateurs entre une fraction et un nombre : fraction OP nombre fraction operator+(int x) { fraction r(x, 1); return *this + r; /* Ou fraction s; s.num = num + den * x; s.den = den; return s; */ } fraction operator-(int x) { fraction r(x, 1); return *this - r; } fraction operator*(int x) { fraction r(x, 1); return *this * r; } fraction operator/(int x) { fraction r(x, 1); return *this / r; } //Opérateurs entre un nombre et une fraction: nombre OP fraction friend fraction operator+(int, fraction); friend fraction operator-(int, fraction); friend fraction operator*(int, fraction); friend fraction operator/(int, fraction); //Opérateurs de comparaison bool operator>(fraction f) { return (num * f.den > den * f.num); } bool operator>=(fraction f) { return (num * f.den >= den * f.num); } bool operator==(fraction f) { return (num * f.den == den * f.num); } bool operator<(fraction f) { return !(*this >= f); } bool operator<=(fraction f) { return !(*this > f); } bool operator!=(fraction f) { return !(*this == f); } }; fraction operator+(int x, fraction f) { //On appel l'opérateur : fraction + nombre) return f + x; } fraction operator-(int x, fraction f) { return f - x; } fraction operator*(int x, fraction f) { return f * x; } fraction operator/(int x, fraction f) { return f / x; } int main() { fraction f1(1, 2), f2(3, 5); cout << "Fraction F1 : "; f1.afficher(); cout << "Fraction F2 : "; f2.afficher(); cout << "F1 + F2 = "; (f1 + f2).afficher(); cout << "F1 - F2 = "; (f1 - f2).afficher(); cout << "F1 * F2 = "; (f1 * f2).afficher(); cout << "F1 / F2 = "; (f1 / f2).afficher(); cout << "F1 + 5 = "; (f1 + 5).afficher(); cout << "3 * F2 = "; (3 * f2).afficher(); if (f1 == f2) cout << "Les deux fractions sont egales" << endl; else cout << "Les deux fractions ne sont pas egales" << endl; if (f1 > f2){ cout << "La fraction la plus grande est : "; f1.afficher(); } else if(f1 < f2){ cout << "La fraction la plus grande est : "; f2.afficher(); } /* cout << "La fraction la plus petite: "; if (f1 < f2) f1.afficher(); else if(f1 > f2) f2.afficher(); if (f1 != f2) cout << "les deux fractions ne sont pas egales" << endl; else cout << "Les deux fractions sont egales" << endl; */ }
Note
- L’opérateur nombre + fraction doit être une fonction amie puisque le premier opérande n'est pas de type fraction.