cours4
Calculatrice polonaise inversée
On veut utiliser la ligne de commande pour faire une calculatrice en ordre inversée. Comme on ne veut pas utiliser de structure de données compliquée, on décide de fonctionner en notation polonaise inverse.
Par exemple, pour ajouter 5 à 12 on écrira:
java Calculatrice 5 12 +
Que fait l'opération suivante ?
java Calculatrice 5 12 4 + 3 - x
Est-ce différent de :
java Calculatrice 12 4 + 5 3 - x
Ecrire la classe Calculatrice
correspondante !
Il y a plusieurs façons de réaliser cette calculatrice. La structure de donnée la mieux adaptée est la pile. Une pile P a deux opérations, une opération push(int)
qui empile un entier [en sommet de pile] et une opération pop():int
qui prend l'élément en sommet de pile, le dépile et le rend à l'utilisateur. Cette dernière opération provoque une erreur si la pile est vide.
L'algorithme suivant est proposé :
Pour chaque argument arg
- Si
arg
un nombre, on l'empile - Si
arg
un opérateur unaire - On dépile une valeur,
- On applique l'opérateur,
- On empile le résultat
- Si
arg
un opérateur binaire - On dépile deux valeurs ,
- On applique l'opérateur,
- On empile le résultat
On peut réaliser facilement une pile avec une ArrayList mais l'interface Deque5 est le type abstrait le plus naturel.
- Quel type concret choisirez-vous ? Justifier votre choix !
- Pourquoi est-ce qu'un tableau n'est a priori pas la bonne structure de données ?
Supplément
Quelles structures de données faut-il utiliser pour une calculatrice avec des entrées entre notation infixe ou préfixe ? Voir la discussion6.
Pour réviser, vous pouvez essayer d'implanter ces deux autres solutions !
Recherche
Proposer une méthode rechercheDichotomique
qui permet de trouver un entier dans une List7 supposée ordonnée. On pourra utiliser la méthode Collections.sort8
pour trier la collection. Par contre, il est INTERDIT d'utiliser une des deux méthodes Collections.binarySearch9
vues en cours et il faudra ré-implanter cette méthode. On rappelle pour cela le principe de la recherche dichotomique.
Je cherche l'indice de l'élément e
dans t
du début à la fin :
- Je compare e à l'élément qui se trouve au milieu
t[milieu]
- Si
t[milieu]==e
, j'ai terminé et je renvoie l'indice milieu
- Si
t[milieu]<e
, je cherche l'élément e
entre le début et le milieu
- Si
t[milieu]>e
, je cherche l'élément e
entre le milieu
et la fin - Je recommence en 1.
Notes de bas de page
1 http://miageprojet2.unice.fr/User:FredericMallet/Programmation_Orient%c3%a9e_Objet/Les_collections#Calculatrice_polonaise_invers.c3.a9e
2 http://miageprojet2.unice.fr/User:FredericMallet/Programmation_Orient%c3%a9e_Objet/Les_collections#Suppl.c3.a9ment
3 http://miageprojet2.unice.fr/User:FredericMallet/Programmation_Orient%c3%a9e_Objet/Les_collections#Recherche
4 http://deptinfo.unice.fr/~fmallet/java/poo/cm6.pdf
5 http://docs.oracle.com/javase/9/docs/api/java/util/Deque.html
6 https://en.wikipedia.org/wiki/Calculator_input_methods
7 http://docs.oracle.com/javase/9/docs/api/java/util/List.html
8 https://docs.oracle.com/javase/9/docs/api/java/util/Collections.html#sort-java.util.List-java.util.Comparator-
9 https://docs.oracle.com/javase/9/docs/api/java/util/Collections.html#binarySearch-java.util.List-T-java.util.Comparator-