programmation Java (école d'ingénieur) · Chapitre 8 · Exercice de TD
Compléter la classe Fraction
Encapsulation, membres de classe et paquets · niveau 2
Énoncé
Ajouter à la classe Fraction du cours :
- un constructeur
Fraction(int n)pour les entiers ; - les méthodes
moins,diviseParetinverse; - une méthode
estPlusPetiteQue(Fraction f); - une méthode
egale(Fraction f)qui compare deux fractions, et une méthodevaleur()qui retourne la valeur approchée endouble.
Expliquer pourquoi l'invariant rend egale et estPlusPetiteQue très simples. Tester avec et .
Corrigé
class Fraction {
private final int num;
private final int den; // invariant : den > 0 et fraction irréductible
Fraction(int num, int den) {
if (den == 0) throw new ArithmeticException("dénominateur nul");
if (den < 0) { num = -num; den = -den; }
int g = pgcd(Math.abs(num), den);
this.num = num / g;
this.den = den / g;
}
Fraction(int n) { this(n, 1); }
private static int pgcd(int a, int b) {
while (b != 0) { int r = a % b; a = b; b = r; }
return a;
}
public Fraction moins(Fraction f) { return new Fraction(num * f.den - f.num * den, den * f.den); }
public Fraction inverse() { return new Fraction(den, num); } // ArithmeticException si num = 0
public Fraction divisePar(Fraction f) { return new Fraction(num * f.den, den * f.num); }
public boolean estPlusPetiteQue(Fraction f) { return num * f.den < f.num * den; } // den > 0 !
public boolean egale(Fraction f) { return num == f.num && den == f.den; }
public double valeur() { return (double) num / den; }
@Override
public String toString() { return den == 1 ? "" + num : num + "/" + den; }
}
public class Ex3Fraction {
public static void main(String[] args) {
Fraction a = new Fraction(2, 3), b = new Fraction(-5, 6);
System.out.println(a + " - " + b + " = " + a.moins(b));
System.out.println(a + " / " + b + " = " + a.divisePar(b));
System.out.println(b + " < " + a + " : " + b.estPlusPetiteQue(a));
System.out.println(new Fraction(4, 6).egale(a) + " " + new Fraction(3).egale(new Fraction(6, 2)));
System.out.println(b.valeur());
}
}
2/3 - -5/6 = 3/2
2/3 / -5/6 = -4/5
-5/6 < 2/3 : true
true true
-0.8333333333333334
Grâce à l'invariant, deux fractions égales ont exactement les mêmes attributs : egale compare donc les attributs un à un. Et comme les dénominateurs sont positifs, équivaut à sans changer le sens de l'inégalité : avec un dénominateur négatif, cette multiplication en croix serait fausse. Le constructeur protège aussi inverse : inverser appelle new Fraction(1, 0), qui lève une ArithmeticException. Les classes de la bibliothèque redéfinissent plutôt equals ; nous le ferons au chapitre 9.
100 % gratuit
La suite du chapitre est sur Adloun
- 10 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le podcast et la vidéo du chapitre : 2 minutes d'écoute sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours, le premier QCM et 2 minutes de podcast et de vidéo. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.