IN101 : Sujet du TP5
Groupe ESIEE, Denis BUREAU, décembre 2005.
Attention !
Le sujet peut être modifié jusqu'à la veille du TP.
1 Les objectifs
Être capable de réaliser sur machine des programmes mettant en
oeuvre les notions vues aux TD 5.1 et 5.2, et savoir tester
les méthodes que l'on écrit.
2 La classe MiniCalc
- Écrire en Java une classe Minicalc contenant
simplement une méthode statique calc() prenant en
paramètres les 2 nombres réels et le caractère
représentant l'opération à effectuer, et n'affichant
rien du tout, mais retournant une String correspondant à
ce qui aurait été affiché, y compris les messages
d'erreur (voir la mini-calculatrice du TD5.1).
Contrainte : ne pas accepter la division par 0.
Supplément : ajouter l'opérateur
'^'
pour élever le
1er nombre à la puissance du 2ème nombre
(regarder la javadoc de la classe Math).
- Ajouter dans votre projet BlueJ les deux classes
CalculatorPanel
et
TPCalculette
qui vont
vous permettre de tester graphiquement votre méthode
calc(). Compiler et lancer la méthode run()
de la classe TPCalculette. Il faut cliquer sur
Entr après chaque nombre, sur C (comme Clear) avant de
commencer une autre opération ou sur M si on veut
mémoriser le résultat dans la 1ère opérande pour
l'opération suivante.
- Remarquez que rien ne garantit que les tests que vous avez
effectués sont "exhaustifs" ou au moins qu'ils testent tous
les cas particuliers les plus évidents. D'autre part,
si vous faites une modification dans la méthode
calc(), il va falloir refaire tous les tests à la main !
3 La classe Exercices (sur les boucles)
Pour pouvoir tester facilement les méthodes suivantes, déclarez
les toutes en static dans la classe Exercices,
afin de ne pas être obligés de créer un objet avant de lancer une
méthode.
- factorielle()
Écrire en Java la méthode factorielle vue en TD
(elle retournera -1 si le paramètre est négatif).
Contrainte : utiliser le type long pour le résultat
de la fonction afin d'offrir un maximum de possibilités.
Questions : Quel est le nombre maximum dont on peut calculer la
factorielle avec cette fonction ?
Pourquoi, simplement en voyant le résultat de 24!, sait-on
immédiatement que le maximum est inférieur à 24 ?
et pour 23! ?
- Tester la méthode factorielle()
Incorporez la classe
ExercicesTest
à votre projet
(menu Edition, choix Copier une classe...).
Rendez accessibles les outils de tests
(menu Outils, choix Preferences...,
onglet Divers, la case
Montrer les outils de test doit être cochée).
Compilez cette classe après avoir ajouté les squelettes des
exercices suivants : chiffresMots et suiteCubes
(squelette = signature suivie de {return "";} ).
Après un clic droit sur la classe ExercicesTest,
choisissez Test factorielle ;
si tout est vert, votre fonction est bonne ;
s'il y a du rouge, votre fonction ne fournit pas le résultat
attendu pour le test situé à la ligne indiquée ; dans ce cas,
il faut modifier votre programme, jamais la classe de test.
Les numéros de ligne sont visibles si vous avez coché
la case Afficher numeros de ligne de l'onglet Editeur
du choix Preferences... du menu Outils.
Inversez le sens de la boucle for (croissant
« décroissant) et modifiez les bornes en
conséquence ; il suffit de recompiler et de relancer le test !
- chiffresMots()
Écrire en Java la méthode qui retourne une String composée de la
suite de mots correspondant aux chiffres d'un nombre entier positif strictement
inférieur à 1000000, passé en paramètre.
Contraintes : ne pas effectuer de calcul de puissance et
ne pas mettre de zéro en tête du nombre.
Exemple : "42307 --> quatre deux trois zero sept"
Messages d'erreur : "Nombre trop petit !",
"Nombre trop grand !"
Comparez vos résultats avec Test chiffresMots
sur la classe ExercicesTest.
- suiteCubes()
Écrire en Java une procédure
de calcul de la suite numérique dite de << la
somme des cubes des chiffres du terme précédent >> .
u(0) = un entier positif non nul ; pour N > 0,
u(N) = somme des cubes des chiffres de u(N-1)
Théorème 1 : Si u(0) est un multiple de 3, cette suite devient
constante (donc u(N) = u(N-1) ) au bout d'un certain nombre
d'itérations, et la valeur de la constante ne dépend pas du
choix de u(0).
Théorème 2 : Si u(0) vaut 2 + un multiple de 3,
le théorème 1 s'applique, mais la constante atteinte est
différente.
Théorème 3 : Si u(0) vaut 1 + un multiple de 3,
non seulement la constante atteinte est variable,
mais la suite ne converge pas forcément.
Il nous faut donc impérativement fixer un nombre
maximum d'itérations pour éviter une boucle infinie,
par exemple 50.
Cette méthode prendra donc u(0) en paramètre,
calculera chaque terme successif,
puis retournera une String contenant la constante et le nombre
d'itérations nécessaires pour l'atteindre, ou bien un message de
non convergence après le maximum d'itérations.
Exemple de suite :
u(0)=15
==>
126, 225, 141, 66, 432, etc...
Exemples de messages pour pouvoir tester :
"Pour 3, la 4eme iteration egale la 3eme et vaut 153." ,
"Pour 13, la suite n'est toujours pas constante apres 50 iterations." .
Comparez vos résultats avec Test suiteCubes
sur la classe ExercicesTest.
4 La classe Droites
- Écrire en Java une classe Droite
comportant 3 attributs réels a, b, et c
qui représentent les coefficients de l'équation
ax+by+c=0 de la droite considérée.
La classe comportera un constructeur à trois paramètres
(qui positionnera, si a=b=0, un état d'erreur
qui provoquera ensuite la réponse "?")
ainsi que la méthode suivante.
Attention ! Vous pouvez reprendre ce que vous aviez fait
au 2.4 du TP2, mais en respectant toutes les contraintes
ci-dessous, y compris les noms de classe et de méthodes.
- Écrire en Java une méthode typeDroites()
déterminant si la droite est confondue, parallèle,
orthogonale ou sécante avec la droite passée en
paramètre (voir TD5.1).
Contrainte : respecter la hiérarchie des 4 cas et
tenir compte des problèmes de précision dans les
calculs avec des nombres réels (à 10-6 près).
Exemples :
0 0 9 & 0 0 0
-->
"?",
1 2 3 & 3 6 9
-->
"c",
2 0 3 & 9 0 5
-->
"p"'
(0 2 3 & 0 9 5 aussi),
2 2 0 & 1 -1 1
-->
"o"
(1 -1 1 & 2 2 0 aussi),
0 1 2 & 1 2 0
-->
"s",
1.23456789 9.87654321 2 & 9.8765432 -1.2345678 3
-->
"o".
- Tester la classe Droites
Incorporez la classe
DroitesTest
à votre projet
et lancez Test typeDroites ; tout est vert ?
5 Problèmes
- · rom()
Écrire en Java (dans la classe DecimalRomain)
une méthode auxilliaire qui prend comme paramètres
un chiffre (1 ou 5) et une puissance de 10, et qui retourne
le caractère romain correspondant.
Exemple : 5, 100
-->
'D').
· dec2rom()
Écrire en Java (dans la classe DecimalRomain)
la méthode qui convertit le nombre entier
compris entre 1 et 3999 passé en paramètre en une
String contenant le nombre romain correspondant.
Contraintes :
utiliser la méthode auxilliaire définie précédemment
et ne pas recalculer la puissance à chaque fois.
Exemples :
2443
-->
"MMCDXLIII",
1998
-->
"MCMXCVIII",
1
-->
"I",
7
-->
"VII",
3215
-->
"MMMCCXV",
2999
-->
"MMCMXCIX",
1444
-->
"MCDXLIV",
506
-->
"DVI",
3888
-->
"MMMDCCCLXXXVIII",
-1
-->
"?",
0
-->
"?",
3999
-->
"MMMCMXCIX",
4000
-->
"?"
- Tester la méthode dec2rom
Comme pour les exercices précédents, vous vous attendez à
ce que la classe DecimalRomainTest soit fournie ;
eh bien non !
Cette fois-ci, c'est à vous de la créer. Voici comment.
Clic droit sur la classe DecimalRomain, choisir
Creer classe de Test.
Clic droit sur la classe DecimalRomainTest nouvellement
créée, choisir Enregistrer une methode de test, saisir
dec2rom, vous êtes maintenant en mode
enregistrement.
Clic droit sur la classe DecimalRomain, choisir
dec2rom(), saisir 7, vérifier que le résultat est bien
"VII", et cocher la case Assertion:.
Vous devez donc essayer différentes valeurs pour dec2rom
afin de la tester au mieux. Pour cet exercice, suffisamment
d'exemples vous sont donnés ci-dessus (utilisez-les),
mais pour les prochains tp ou projets, ce sera à vous
d'inventer les bons exemples de test.
Lorsque vous avez essayé tous les exemples, cliquez sur le
bouton Terminer à gauche., puis double-cliquez sur la
classe de test, et retrouvez la méthode testDec2rom
qui vient d'être créée ; vous pouvez par exemple
ajouter un System.out.println au début et à la fin.
- calMois() (en travail personnel )
Écrire en Java, dans une autre classe,
la méthode qui affiche le calendrier du mois
comme spécifié en TD 5.2.
Contrainte : tenir compte des années bissextiles.
Rappel :
- une année est bissextile si elle est divisible par 4
- exception : elle n'est pas bissextile si elle est
divisible par 100
- exception de l'exception : elle est néanmoins
bissextile si elle est divisible par 400
Cette méthode n'est pas facile à tester automatiquement ;
comparez avec le calendrier du mois en cours.
File translated from
TEX
by
TTH,
version 3.70.
On 05 Dec 2005, 21:46.