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

  1. É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).
  2. 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.
  3. 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.
  1. 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! ?
  2. 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 !
  3. 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.
  4. 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

  1. É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.
  2. É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".
  3. Tester la classe Droites
    Incorporez la classe DroitesTest à votre projet et lancez Test typeDroites ; tout est vert ?

5  Problèmes

  1. · 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 --> "?"
  2. 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.
  3. 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 : 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.