Les alternatives du Bug¶
L’objectif de ce TP est :
Déterminer des structures conditionnelles (alternatives et conditions) et les implémenter.
Produire le comportement attendu du/des Bug(s).
Les structures conditionnelles en Java¶
La structure if¶
Elle permet d’effectuer des traitements conditionnels. Sa syntaxe est la suivante :
if ( expression booléenne ) {
// bloc d'instructions A
} else {
// bloc d'instructions B
}
Lors de l’exécution du programme, si l’évaluation de l’expression booléenne donne vrai, alors le bloc d’instructions A est exécuté, sinon le bloc d’instructions B est exécuté.
Si le bloc d’expression B est vide, le mot clef else et le bloc qui suit peuvent être omis :
if ( expression booléenne ) {
// bloc d'instructions
}
Lors de l’exécution du programme, le bloc d’instructions ne sera exécuté que si l’évaluation de l’expression booléenne donne vrai.
Enfin, si le bloc d’expression se résume à une seule expression, les accolades peuvent être enlevées. Par exemple:
int x, y;
//...
if (x > y)
System.out.println("x est plus grand");
else
System.out.println("y est plus grand");
La structure switch¶
La structure de contrôle switch permet d’effectuer des traitements suivant des valeurs possibles d’une expression entière. Sa syntaxe est la suivante :
switch (expression) {
case constante1:
// ...
break;
case constante2:
// ...
break;
// ...
default:
// ...
break;
}
L’expression est évaluée, puis l’exécution du programme continue à partir de l’étiquette case dont la constante est égale à la valeur de l’expression. L’exécution continue alors jusqu’à la première instruction break rencontrée. Si aucune étiquette ne correspond, l’exécution continue à partir de l’étiquette spéciale default si elle existe. L’étiquette default peut en effet être omise.
Attention, si une instruction break n’est pas mise, l’exécution peut continuer au cas suivant.
Par exemple, le fragment de code suivant affichera A si x vaut 0, BC si x vaut 1, C si x vaut 2, et D dans tous les autres cas.
int x;
// ...
switch (x) {
case 0:
System.out.print("A");
break;
case 1:
System.out.print("B");
case 2:
System.out.print("C");
break;
default:
System.out.print("D");
break;
}
Défi n°1 : alcôves¶
État initial
|
Résultat attendu
|
|
|
À faire
Récupérer
l'archive du programme, l’enregistrer dans le dossier du TP puis la décompresser.Le programme comprend les mêmes classes et fichiers que pour le TP précédent. Se reporter à l’énoncé du TP Le monde des Bugs pour les détails et pour la référence de l’API.
Compiler le programme tel qu’il est fourni, pour vérifier qu’il n’y a pas d’erreur et que l’état initial est bien celui reproduit ci-dessus.
Contrairement au TP précédent, le monde comprend ici plusieurs Bugs. Leur comportement demeure individuellement le même ; chaque Bug exécutera à son tour le programme de la méthode enRoute(). La difficulté est donc de concevoir un programme unique qui s’applique à chaque Bug tout en permettant de parvenir au résultat.
À faire
Déterminer l’algorithme permettant aux Bugs de se positionner convenablement, puis l’implémenter. Il faut être doux avec les Bugs et ne pas les faire se cogner aux murs.
Régler la vitesse en utilisant la méthode setVitesse() dont le paramètre est un nombre de mouvements par seconde.
Correction
Défi n°2 : intervalles¶
Préparatifs¶
Pour les défis suivants, nous n’aurons besoin que d’un seul Bug et nous allons utiliser le fichier dirigé vers l’entrée standard pour fournir des valeurs au Bug, qui les interprètera puis nous fournira des réponses sous forme de messages.
À faire
Modifier la valeur de la constante N_BUGS dans le fichier Main.java, pour la positionner à 1.
Positionner la variable readMaze à false (dans le fichier Main.java).
Supprimer le fichier Bug.java.
Récupérer le squelette du nouveau fichier
Bug.javapermettant au Bug d’utiliser un fichier pour lire les valeurs de test depuis l’entrée standard. L”enregister à la place de l’ancien (et le renommer Bug.java, naturellement).
Les ados¶
Un ado se caractérise par son âge, compris entre 13 et 19 ans (inclus). On va soumettre des groupes de trois valeurs entières (a, b, et c) au Bug et si au moins l’une de trois correspond à l’âge d’un ado, alors le Bug nous dira : ado ; Dans le cas contraire, il nous dira : pas ado.
À faire
Compléter le fichier Bug.java pour intégrer le calcul demandé. La lecture des valeurs a, b, et c est déjà réalisée, pour l’exemple.
Récupérer le fichier
data1.testcomprenant un jeu de valeurs de test.Soumettre les valeurs de test à votre programme. Les réponses du Bug doivent être les suivantes :
Ado Ado Pas ado Ado Ado Pas ado
Correction
Défi n°3 : intervalles 2D¶
On considère un Bug sur une grille 12x12 dans laquelle on distingue deux zones :
la zone rouge contenant la ligne 0
la zone bleue contenant la ligne 11
La démarquation entre ces deux zones est materialisée par des murs.
On fournit alors au Bug des coordonnées de cases et il doit :
se rendre sur la case désignée
peindre la case de la couleur du nom de la zone associée.
À faire
Positionner la variable readMaze à true et les dimensions de la grille à 12x12 dans la classe Main.
Récupérer le fichier
data2.test. Ce fichier contient cette fois trois parties :
au début : les positions des murs ;
la ligne
0 0 endWallsqui marque la fin des définitions de murs ;le jeu de valeurs de test qui seront lues par le Bug.
Récupérer le squelette du fichier
Bug.java.Concevoir le test à réaliser pour identifier la zone associée à la case désignée par chaque ligne du jeu de données test.
Implémenter ce test pour parvenir au résultat attendu. On peut également s’aider des messages en console pour mettre au point le programme, avec une sortie de ce type
x=1, y=4 --> bleu x=7, y=2 --> rouge x=10, y=2 --> rouge x=10, y=6 --> bleu x=2, y=0 --> rouge x=6, y=10 --> bleu x=9, y=4 --> rouge x=2, y=4 --> bleu x=1, y=11 --> bleu x=5, y=10 --> bleu
Correction
Défi n°4 : le Bug des maths¶
On va soumettre au Bug des opération arithmétiques simples du type op1 opérateur op2, où l’opérateur représentera l’une des opérations élémentaires suivantes :
addition
+soustraction
-multiplication
xdivision
/
Le Bug devra lire les opérations décrites dans le fichier de données test et fournir chaque fois le résultat sous forme de message dans la console.
Note
Les messages émis par les Bugs sont en fait générés par de simples appels à la méthode System.out.println(String).
À faire
Positionner la variable readMaze à false.
Récupérer le fichier
data3.txtcontenant le jeu de données test.Recupérer le fichier
Bug.javacomme squelette de travail du fichier Bug.java.Concevoir l’algorithme qui interpréte les lignes du fichier et fournit le résultat. Écrire deux variantes : l’une avec des
ifet l’autre avec unswitch.Implémenter les deux versions de l’algorithme, sans oublier de les commenter.
Vérifier la validité des résultats et commenter celui de la dernière opération.
Réflechir à la question : quelle est la meilleure des versions ?
Avertissement
Les valeurs lues dans le fichier ne sont plus des entiers. Consulter la documentation de la classe Double.
Correction
Défi n°5 : le Bug de l’an 2000¶
Le Bug va vous aider à déterminer si une année donnée est bissextile ou non. À toute fin utile, on en rappelle la définition : Une année est bissextile si et seulement si elle est divisible par 4, mais pas par 100. Les années divisibles par 400 sont toutefois bissextiles.
À faire
Récupérer le fichier
data4.txtcontenant le jeu de données test.Concevoir l’algorithme qui interpréte les lignes du fichier et fournit le résultat, comme ci-dessous
1900 n'est pas bissextile 1984 est bissextile 2000 est bissextile 2010 n'est pas bissextile 2100 n'est pas bissextile fini !
Adapter le code du fichier Bug.java pour rendre la partie lecture compatible avec les données à lire.
Implémenter l’algorithme et vérifier son bon fonctionnement à l’aide des exemples de résultats fournis ci-dessus.
Correction
Défi n°6 : le petit Bug illustré¶
Le Bug est très à cheval sur l’orthographe. Parmi les erreurs qu’il ne peut s’empêcher de corriger, l’oubli de la majuscule en début de phrase figure en bonne place.
Au travers d’un fichier et à raison d’une par ligne, vous allez donc soumettre au Bug un certain nombre de phrases qu’il lira une à une et dont il déterminera si elles commencent bien par une majuscule. Si ce n’est pas le cas, il effectuera la correction et comptabilisera les erreurs. À la fin du traitement, il donnera une note en pourcentage de phrases dont la majuscule était convenablement placée.
Indication
Plusieurs approches sont envisageables pour déterminer si une lettre est une majuscule, en particulier :
utiliser les intervalles de la table ASCII.
comparer la lettre et sa version après mise en majuscule.
La seconde vous est conseillée ; Elle vous donnera également l’occasion d’utiliser la documentation de référence Java (classe String).
Pour lire une ligne entière sur l’entrée standard, il faut utiliser la méthode nextLine() de la classe Scanner à la place de la méthode next() qui se contente de lire le prochain élément en s’arrètant dès le premier délimiteur rencontré (par défaut le caractère d’espacement).
À faire
Récupérer le fichier
data5.txtcontenant le jeu de phrases test.Concevoir l’algorithme qui interpréte les lignes du fichier et fournit le résultat, comme ci-dessous, puis l’implémenter.
Lorem ipsum dolor sit amet Consectetur adipisicing elit, sed do eiusmod Tempor incididunt ut labore et Dolore magna aliqua. Ut enim ad minim veniam, Quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo Consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse Cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non Proident, sunt in culpa qui officia deserunt mollit anim id est laborum. -------- fin de la correction ---------- Note : 50.0% de bonnes phrases.
Adapter le code du fichier Bug.java pour rendre la partie lecture compatible avec les données à lire.
Implémenter l’algorithme et vérifier son bon fonctionnement à l’aide de l’exemples de résultat ci-dessus.
Correction



