6.4 KiB
Questions.
ce fichier sert à indiquer les réponses après chaque question, indiquez aussi svp vos nom et prénom. il faut rédiger au format markdown svp. En particulier, le code est à mettre entre deux triple quotes.
Les sources sont disponibles en ligne sur le site des TPs.
Vous devez rendre sur devoir une archive tar.gz contenant un répertoire test/ contenant les fichiers java (pas les .class) et ce fichier Questions.md.
tar -czvf test.tar.gz test/
Nom : Pourchot Prénom : Adrian
Programmation défensive.
- [2 points] Préparez la javadoc pour les 4 méthodes suivantes de ShuntingYard
shuntFromInput()
shuntFromStack()
pushToStack()
crushParenthesis()
Il faut prévoir un comportement adapté en cas de problème. Par exemple shuntFromInput ne devrait transférer que des TokenConstant et des TokenVariable et pushToStack ne devrait transférer que des TokenOperator ou des parenthèse gauche.
Indiquez la javadoc dans ce fichier juste après cette ligne, en recopiant la première ligne de déclaration de chaque méthode.
/**
* Envoie la premiere constante ou variables de la file d'entrée vers la file de sortie.
* Si le Token récupéré n'est pas TokenConstant ou un TokenVariable, il y a 2 cas possible:
* Soit il s'agit d'un TokenOperator ou d'un TokenSeparator de gauche, dans ce cas on replace l'élément extrait au départ de la file d'entrée
* puis on fait appel à la méthode shuntFromStack() plutôt que celle-ci.
* Soit il s'agit d'un TokenSeparator de droite, dans ce cas on la replace au départ de ola file d'entrée et on fait appel à la méthode crushParenthesis()
* pour la supprimer.
*/
public void shuntFromInput() {
/**
* Envoie le dernier élément de la pile stack vers la file de sortie.
*/
public void shuntFromStack() {
/**
* Envoie le premier opérateur ou parenthèse gauche de la file d'entrée vers la pile stack.
* Si le Token récupéré n'est pas un TokenOperator ou un TokenSeparator de gauche, il y a 2 cas possible:
* Soit le Token est un TokenConstant ou un TokenVariable, dans ce cas on replace le Token extrait au départ de la file d'entrée
* puis on fait appel à la méthode shuntFromInput() plutôt que celle-ci.
* Soit il s'agit d'un TokenSeparator de droite, dans ce cas on la replace au départ de ola file d'entrée et on fait appel à la méthode crushParenthesis()
* pour la supprimer.
*/
public void pushToStack(){
/**
* Supprime le premier élément de la file d'entrée et le dernier de la pile stack.
* @exception IllegalStateException Renvoyer si il y s'agit d'un cas particulier.
*/
public void crushParenthesis(){
- [2 points] Proposez le changement adapté au code de shuntFromInput et de pushToStack
donnez le code ci-dessous.
public void shuntFromInput() { x=this.input.getFirst(); if(x instanceof(TokenConstant)||x instanceof(TokenVariable)) this.output.addLast(x); else if(x instanceof(TokenOperator)){ this.input.addFirst(x); shuntFromStack(); } else if(x.getSeparator().equals(Separator.LB)){ this.input.addFirst(x); shuntFromStack(); } else{ this.input.addFirst(x); crushParenthesis(); } }
Invariant
- [2 points] Quels sont les invariants des méthodes suivantes? shuntFromInput() shuntFromStack() pushToStack()
Debug
- [1 point] Faite tourner les tests avec le fichier JUnit fourni (TestShuntingYard1.java) Quels tests sont passés avec succès? Quels tests ne sont pas passés avec succès?
Test réussi:
- pushStack(TestShuntingYard1)
Test échoué:
- shuntingTest1(TestShuntingYard1)
- shuntInput(TestShuntingYard1)
- shuntStack(TestShuntingYard1)
- CandyCrush(TestShuntingYard1)
- [7 points] Pour chaque test non passé, indiquez le bug que vous observez en français. Puis pour chaque test non passé, proposez un changement de code.
Il faut indiquer le numéro de la ligne dans le fichier initial (vous pouvez le renommer en ajoutant OLD au bout avant de changer le fichier dans une copie). recopier la ligne, puis indiquez en dessous la nouvelle ligne. Il faut expliquer en français dans un commentaire ci-dessous en quoi ce changement consiste. Dans le fichier changé, il faut ajouter en commentaire à la fin //BUGFIX 0 où le numéro correspond à la notation ci-dessous. En dessous je vous donne une exemple en cadeau.
Test concerné :
aucun, ceci est un BUGFIX gratuit pour indiquer le format attendu Le test d'arrêt de ShuntingYard est incorrect, car il faut lever l'exception seulement quand l'input et la pile sont vide, pas l'un ou l'autre.
ShuntingYard.java line 73 (avant):
return (this.input.isEmpty() || this.stack.isEmpty());
devient ShuntingYard.java line 73 (après):
return (this.input.isEmpty() && this.stack.isEmpty()); //BUG FIX 0
Test concerné :
???
// BUGFIX 1
// BUGFIX 2
-
shuntingTest1(TestShuntingYard1): On observe que le shunting c'est arrêter car la file d'entrée et la pile stack étaient vide ce qui ne devrait pas être le cas.
-
shuntInput(TestShuntingYard1): On observe que l'AbstractToken n'est pas trouvé dans la file alors qu'il devrait.
-
shuntStack(TestShuntingYard1): Même chose que pour shuntInput, un AbstractToken n'est pas trouvé dans la pile alors qu'il devrait.
-
CandyCrush(TestShuntingYard1): On observe qu'une parenthèse droite est trouvé alors qu'il devrait s'agir d'une parenthèse gauche.
- [6 points] Complétez le fichier de test TestShuntingYard2.java
a) [1 point] Proposez un test JUnit pour attraper un NullPointerException lorsqu'on appelle shuntFromInput() sur un input vide.
indiquez le nom de ce test ici :
b) [1 point] Proposez un test JUnit pour attraper l'exception adaptée lorsqu'on appelle shuntFromInput() sur un input dont le prochain token n'est pas un TokenVariable ou un TokenConstant.
indiquez le nom de ce test ici :
c) [2 points] Pour l'exemple ExempleSY2.java, proposez la liste des instructions primitives correspondant à l'algo de Dijkstra. (i.e. les primitives que shunting devrait appeller si code convenablement).
d) [3 points] Proposez un test JUnit correspondant à l'exemple ExempleSY2.java Expliquez bien votre démarche.
indiquez le nom de ce test ici, puis expliquez votre démarche :