Adloun

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, divisePar et inverse ;
  • une méthode estPlusPetiteQue(Fraction f) ;
  • une méthode egale(Fraction f) qui compare deux fractions, et une méthode valeur() qui retourne la valeur approchée en double.

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

Exercice suivant et tuteur

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.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →