/* * classe: Rational.java * auteur: Lewis & Loftus * destructeur: felipe@ift010 */ //class Rational implements Comparable { class Rational { /* * @param n le numerateur * @param d le denominateur * Cree un rationnel avec les valeurs specifiees */ public Rational(int n,int d) { if (d == 0) { System.err.println("impossible, => den=1"); d = 1; } else if (d<0) { n = -n; // le numerateur porte le signe (convention interne) d = Math.abs(d); } // le veritable but du constructeur: num = n; den = d; reduce(); // 2/4 ->Ý1/2 } /* * @param n le numerateur * Cree le rationnel d/1 */ public Rational (int n) {this(n,1);} /* * Cree un rationnele en choisissant aleatoirement * son numerateur et son denominateur */ public Rational() { // tirage aleatoire this((int) (Math.random() * 100) +1,(int) (Math.random() * 100) +1); } /* * @return le denominateur de ce rationnel */ public int getDenominateur() {return den;} // assesseur /* * @return le numerateur de ce rationnel */ public int getNumerateur() {return num;} // assesseur /* * @return une valeur approchee du rationnel */ public double getApproximateValue() {return (den == 0)? 0:(((double) num) / den);} // assesseur /* * @return une string contenant le rationnel */ public String toString() { if (num == 0) return "0"; if (den == 1) return num + ""; // expliquer "" if (den == num) return "1"; // note num == 1 aurait fait l'affaire return num + "/" + den; // realisez les conversion faites } /* * @param o2 la reference d'un objet rationnel a ajouter a l'objet appelant * Cree un objet contenant le resultat */ public Rational add (Rational o2) { return new Rational ( num * o2.getDenominateur() + den * o2.getNumerateur(), den * o2.getDenominateur() ); } /* * @param o2 la reference d'un objet rationnel a retrancher de l'objet appelant * Cree un objet contenant le resultat */ public Rational sub (Rational o2) { return new Rational ( num * o2.getDenominateur() - den * o2.getNumerateur(), den * o2.getDenominateur() ); } /* * @return true si les deux rationnels sont egaux * Note: si nous n'avions pas reduit le rationnel, il aurait ici fallu faire un calcul */ public boolean equals(Rational o2) { return (num == o2.getNumerateur()) && (den == o2.getDenominateur()); } /* * methode qui compare deux objets: * * @return 0 si l'objet appelant (O1) et l'objet passe en argument (O2) sont egaux * n<0 si o1 est inferieur a o2 * n>0 sinon */ public int compareTo(Rational o2) { if (equals(o2)) return 0; Rational tmp = sub(o2); // objet temporaire contenant o1 - o2 return tmp.getNumerateur(); // ouatche ! (discuter) } /* * version 2: une generalisation que vous rencontrerez en 1020 * lorsque vous verrez du polymorphisme * * public int compareTo(Object o2) { * if (o2 instanceof Rational) { * if (equals((Rational) o2)) return 0; // en pratique inutile * * Rational tmp = sub((Rational) o2); // objet temporaire * return tmp.getNumerateur(); // ouatche ! (discuter) * } * return -1; // un defaut * } * */ /* * les methodes de service (methodes privees) */ private void reduce() { if (num == 0) return; // note: pas beau, mais pour illustrer que return sort de la methode (qui ne retourne rien ici) int common = gcd(Math.abs(num),den); num /= common; den /= common; } // le plus grand commun diviseur de a et b (algo de Euler je crois) private int gcd(int a,int b) { while (a != b) { if (a