/* * module: Polynome.java * auteur: felipe IFT1010 * objet: une correction possible de l'exercice de la demo 6 */ public class Polynome { private int a, b, c; // a x^2 + b^x + c private double racine1, racine2; // les racines eventuelles private int nbRacines; // le nombre de racines /* * Poutine interne: calcul de la racine pour un polynome de degre 1 */ private void root1() { if (b == 0) nbRacines = 0; // pourrait etre une infinite de racines si c = 0 ! else { nbRacines = 1; racine1 = -c / (double) b; } } /* * Poutine interne: calcul de la racine pour un polynome de degre 2 */ private void root2() { if (a == 0) root1(); else { double delta = b*b - 4 * a * c; if (delta >= 0) { racine1 = (-b + Math.sqrt(delta)) / (2 * a); racine2 = (-b - Math.sqrt(delta)) / (2 * a); nbRacines = 2; } else if (delta == 0) { racine1 = -b / (2 * a); nbRacines = 1; } else nbRacines = 0; } // else } /* * contructeur pour les polynomes de degre 2 * Note: si l'utilisateur fournit comme valeur de a, ca n'est pas grave -> degre 1 */ public Polynome(int a, int b, int c) { this.a = a; this.b = b; this.c = c; // calculons les racines en direct (pourquoi pas ?) // avantage: si l'utilisateur appelle getRacine avant Solve, // votre classe fonctionne quand meme. // inconvenient: on fait un calcul qui eventuellement n'interesse // pas l'utilisateur root2(); } /* * contructeur pour les polynomes de degre 1 * Note: si l'utilisateur fournit comme valeur de b, ca n'est pas grave -> degre 0 */ public Polynome(int b, int c) { this.b = b; this.c = c; root1(); } /* * retourne true si le polynome de l'objet appelant possède au moins une racine (f(x) = 0). */ public boolean solve() { // rien a faire, le calcul a deja ete fait ... if ((a==0) && (b==0)) System.err.println("Je ne suis pas suppose traiter des polynomes de degre 0"); return nbRacines != 0; } /* * retourne le nombre de racines du polynôme stocké dans l'objet appelant */ public int getNbRacines() {return nbRacines;} /* * qui retourne la valeur de la i-ème racine, si elle existe. Si le * polynôme n'adment pas i racines, * cette méthode doit afficher le * message d'erreur: "MAUVAIS APPEL DE getRacine" * et retourner 0.0 */ public double getRacine(int i) { if ((a == 0) && (b==0) && (c==0)) return 0.0; // le cas particulier de degre 0 if ((i > nbRacines) || (i <= 0)) { System.err.println("MAUVAIS APPEL DE getRacine"); return 0.0; } return (i==1)? racine1:racine2; } /* * retourne un polynôme nouvellement crée qui contient l'addition * du polynôme appelant avec celui passé en argument (même * principe que l'opération d'addition vue sur la classe Rational * en cours) * Note: il peut en resulter un polynome de degre 0 */ public Polynome add(Polynome p) {return new Polynome(p.a + a, p.b + b, p.c + c);} /* * retourne la valeur du polynôme pour une valeur de x passée en paramètre. */ public double getValue(double x) {return x*x*a + x*b + c;} /* * affichons le mieux possible le polynôme. Par exemple cette * méthode affichera de préférence x^2 + 3 x - 5 à 1 x^2 + 3 x - 5 * Note: il existe plein de manieres d'ecrire cette methode ! */ public String toString() { String res=""; // on n'affiche pas le coefficient s'il est egal a 1 ou 0 if (a != 0) { // gerons le degre 2 if (a < 0) res += '-'; if (Math.abs(a) != 1) res += Math.abs(a); res += "x^2 "; } // = ou - sauf dans le cas ou on a encore rien affiche if (b != 0) { // gerons le degre 1 res += (b < 0)? '-' : ((res.length() ==0)? ' ' : '+'); if (Math.abs(b) != 1) res += Math.abs(b); res += "x "; } // ou n' affiche pas 0, sauf si c'est le seul coefficient if (c != 0) { // gerons le degre 0 if (c > 0) res += '+'; res += c; } else if ((a ==0) && (b==0)) res = "0"; return res; } // toString } // class Polynome