AndroidStudioProjects
Automate
ControleMachine1
ControleMachine2
ControleMachineJava
DEV1.1
DEV2.1
DEV3.1
DEV3.2
DEV3.4
ControleMachine
test
.bashrc
AbstractToken.java
Exemple.java
ExempleSY1.java
ExempleSY2.java
ExempleSY3.java
ExempleSY4.java
ExempleSY5.java
Operator.java
Questions.md
README.txt
ReservedWord.java
Separator.java
ShuntingYard.java
Shunting_yard.svg.png
TestShuntingYard1.java
TestShuntingYard2.java
TokenConstant.java
TokenOperator.java
TokenSeparator.java
TokenVariable.java
pourchot_dev34.tar.gz
test.tar.gz
TP2
TP4
TP5
TP6
TP7
TPnote
TP3.mdj
ex2.mdj
DEV32
DEV4.4
SAe
.gitignore
Ex1TP2.mdj
README.md
Vote.java
pourchot_dev32.tar.gz
215 lines
6.4 KiB
Markdown
215 lines
6.4 KiB
Markdown
|
# 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.
|
||
|
|
||
|
```bash
|
||
|
tar -czvf test.tar.gz test/
|
||
|
```
|
||
|
|
||
|
Nom : Pourchot
|
||
|
Prénom : Adrian
|
||
|
|
||
|
|
||
|
## Programmation défensive.
|
||
|
|
||
|
1. [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.
|
||
|
|
||
|
---
|
||
|
```java
|
||
|
/**
|
||
|
* 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. [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
|
||
|
3. [2 points] Quels sont les invariants des méthodes suivantes?
|
||
|
shuntFromInput()
|
||
|
shuntFromStack()
|
||
|
pushToStack()
|
||
|
---
|
||
|
|
||
|
|
||
|
---
|
||
|
|
||
|
## Debug
|
||
|
4. [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:
|
||
|
|
||
|
1) pushStack(TestShuntingYard1)
|
||
|
|
||
|
|
||
|
Test échoué:
|
||
|
|
||
|
1) shuntingTest1(TestShuntingYard1)
|
||
|
2) shuntInput(TestShuntingYard1)
|
||
|
3) shuntStack(TestShuntingYard1)
|
||
|
4) CandyCrush(TestShuntingYard1)
|
||
|
|
||
|
---
|
||
|
|
||
|
5. [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):
|
||
|
|
||
|
```java
|
||
|
return (this.input.isEmpty() || this.stack.isEmpty());
|
||
|
```
|
||
|
|
||
|
devient
|
||
|
ShuntingYard.java line 73 (après):
|
||
|
|
||
|
```java
|
||
|
return (this.input.isEmpty() && this.stack.isEmpty()); //BUG FIX 0
|
||
|
```
|
||
|
|
||
|
### Test concerné :
|
||
|
???
|
||
|
|
||
|
```java
|
||
|
// BUGFIX 1
|
||
|
```
|
||
|
|
||
|
```java
|
||
|
// BUGFIX 2
|
||
|
```
|
||
|
|
||
|
---
|
||
|
1) 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.
|
||
|
|
||
|
2) shuntInput(TestShuntingYard1): On observe que l'AbstractToken n'est pas trouvé dans la file alors qu'il devrait.
|
||
|
|
||
|
3) shuntStack(TestShuntingYard1): Même chose que pour shuntInput, un AbstractToken n'est pas trouvé dans la pile alors qu'il devrait.
|
||
|
|
||
|
4) CandyCrush(TestShuntingYard1): On observe qu'une parenthèse droite est trouvé alors qu'il devrait s'agir d'une parenthèse gauche.
|
||
|
|
||
|
|
||
|
---
|
||
|
|
||
|
6. [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).
|
||
|
|
||
|
---
|
||
|
|
||
|
|
||
|
```java
|
||
|
|
||
|
```
|
||
|
|
||
|
---
|
||
|
|
||
|
|
||
|
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 :
|
||
|
|
||
|
---
|
||
|
|
||
|
---
|