programmation Java (école d'ingénieur) · Chapitre 9 · Exercice de TD
Des fractions comparables
Héritage et polymorphisme · niveau 2
Énoncé
Écrire une classe Fraction immuable, toujours rangée sous forme irréductible avec un dénominateur positif ( devient ), et qui refuse un dénominateur nul. Redéfinir toString, equals et hashCode. Vérifier que , et sont égales, et qu'un HashSet contenant ces trois fractions et a pour taille .
Corrigé
On normalise une fois pour toutes dans le constructeur : ensuite, deux fractions égales ont exactement les mêmes attributs, et equals se réduit à les comparer.
class Fraction {
private final int num, den; // forme irréductible, den > 0
Fraction(int num, int den) {
if (den == 0) throw new IllegalArgumentException("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;
}
private static int pgcd(int a, int b) { return b == 0 ? Math.max(a, 1) : pgcd(b, a % b); }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Fraction f)) return false;
return num == f.num && den == f.den; // formes irréductibles : comparaison directe
}
@Override
public int hashCode() { return 31 * num + den; }
@Override
public String toString() { return num + "/" + den; }
}
La fraction devient , car le pgcd de et de vaut . Le Math.max(a, 1) est une simple précaution : il garantit que pgcd ne renvoie jamais , ce qui n'arriverait que pour , déjà refusé par le constructeur. Le test :
Fraction a = new Fraction(1, 2), b = new Fraction(2, 4), c = new Fraction(-3, -6);
System.out.println(a + " " + b + " " + c);
System.out.println(a.equals(b) + " " + b.equals(c) + " " + a.equals("1/2"));
Set<Fraction> s = new HashSet<>();
s.add(a); s.add(b); s.add(c); s.add(new Fraction(1, 3));
System.out.println(s.size());
1/2 1/2 1/2
true true false
2
a.equals("1/2") est faux : une chaîne n'est pas une fraction, même si elle s'affiche pareil.
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.