Laurent Tichit
qui renvoie la valeur de lexpression pour la valeur de x donne. Bien entendu, toutes
les classes concrtes de cette hirarchie devront fournir une dfinition de la mthode
valeur. Elles fourniront aussi une refinition intressante de la mthode String
toString().
Constante classe concrte dont chaque instance reprsente une occurrence dune
constante. Cette classe a un membre : la valeur de la constante.
Variable classe concrte dont chaque instance reprsente une occurrence de la
}
...
=
=
=
=
=
=
3.0
3.5915987628795243
3.3038488872202123
2.2072015782112175
0.5701543440099361
-1.2064865584328883
Par exemple, la mthode dite par dichotomie est une technique de rsolution approche de lquation
f(x) = 0 . Sous rserve que f soit une fonction continue (cest--dire sans sauts ) et quon connaisse
deux valeurs a et b telles que les signes de f(a) et de f(b) soient opposs, alors cette mthode trouve
rapidement une valeur z, comprise entre a et b, qui nest pas plus loigne que epsilon dune solution de
lquation f(x) = 0, o epsilon est une prcision arbitraire fixe lavance. Dit autrement : la mthode
trouve z tel que f(z) = 0 avec une erreur infrieure epsilon.
Lalgorithme est bien connu ; en voici une programmation accompagne dun essai consistant rsoudre
x2 4 = 0 (c.--d. trouver la racine carre de 4) avec une prcision de 10 -12 ( lexcution, ce
programme affiche 1.9999999999995453) :
public class TestDichotomie {
/* lappel de la mthode */
public static void main(String[] args) {
double y = zero(0, 4, 1e-12);
System.out.println(y);
}
/* la fonction f(x) = x * x - 4 */
static double f(double x) {
return x * x - 4;
}
/* la mthode elle mme (on suppose que f(a) et f(b) sont de signes
distincts) */
static double zero(double a, double b, double epsilon) {
/* si on na pas f(a) < 0 on change a et b */
if (f(a) > 0) {
double w = a; a = b; b = w;
}
/* on itre jusqu avoir |a - b| <= epsilon */
while (Math.abs(b - a) > epsilon) {
double c = (a + b) / 2;
if (f(c) < 0)
a = c;
else
b = c;
}
/* lorsque |a - b| <= epsilon, toute valeur comprise entre a et
b convient */
return (a + b) / 2;
}
}
crite comme cela, la mthode zero fonctionne mais elle est peu rutilisable, car elle emploie une
fonction f qui ne figure pas parmi ses arguments. Pour trouver un zro dune autre fonction il faut
changer le corps de f et recompiler ce programme ! Plus grave, puisque f est fig, on ne peut pas dans le
mme programme utiliser zero sur des fonctions diffrentes.
On va donc faire en sorte dcrire la mthode zro avec la fonction parmi les arguments, cest--dire avec
len-tte
static double zero(Fonction f, double a, double b, double epsilon)
o Fonction reprsente le concept de fonction, cest--dire ce que toutes les fonctions ont en
commun. Pour ce qui nous intresse ici, ce que les fonctions ont en commun est la possibilit dtre
appeles avec un double pour argument, et de renvoyer alors un double comme rsultat. On introduit
donc linterface :
Exercice. Rcrivez la mthode zero en prenant un objet Fonction comme premier argument, ensuite
crivez une fonction main qui rsout lquation cos(x) = x avec une erreur infrieure 10-10. Il vous
faudra donc dcfinir un objet Fonction dont la mthode appel se rduit return
cos(x) x; .
crivez lessai (la mthode main) de deux manires, sans utiliser puis en utilisant les classes anonymes.
A - Pour l'exercice, dfinissez ces mthodes (dans une autre classe), et affichez simplement quelques
attribut de l'argument pass en paramtre. Instanciez dans votre main quelques Personnel,
Enseignant et Chercheur, et testez ces trois mthodes.
B- Maintenant on aimerait acoir des objets qui soient la fois des Personnels, des Enseignants et des
Chercheurs et qu'on puisse passer chacune des trois mthodes. Il va donc falloir modifier notre code.
Lexercice est le suivant : dfinir une classe UnPersonnelEnseignantChercheur destine
reprsenter des personnels de lducation nationale qui sont en mme temps des enseignants et des
chercheurs. Il faut utiliser les trois classes Personnel, Enseignant et Chercheur, et la nouvelle
classe doit tre dfinie de telle manire que ses instances puissent tre donnes pour argument aux
mthodes ci-dessus, ventuellement au prix dun (trs lger) changement de nom de certains types.
L'ide gnrale est de parler de comportements qui sont au nombre de 3 et qui seront des interfaces. Ce
sont elles qui, dans l'ultime version du code seront appelles Personnel, Enseignant et
Chercheur. Les classes concretes seront nommes UnPersonnel, UnEnseignant et
UnChercheur. On pourra de la mme manire crer des classes UnPersonnelEnseignant,
UnEnseignantChercheur et UnPersonnelChercheur. Ces classes concretes implmenteront 2
des trois interfaces et les mthodes static ci-dessus doivent donc dsormais, sans aucun changement,
fonctionner avec deux objets de type diffrent.