Il s'agit ici d'une version simplifée :
-
Calculs sur les réels
-
Opérations arithmétiques élémentaires :
-
Division
-
Multiplication
-
Addition
-
Soustraction
-
-
Possibilité d'effacer le dernier caractère saisi
-
Reprendre le calcul à partir de la dernière valeur calculée.
L'expression expression est stockée sous forme de chaîne de caractères.
Deux piles sont initialisées :
- ops pour stocker les opérateurs : + - * /
- pileExpression pour stocker les valeurs sucessives de expression.
La méthode effectuerCalcul(ops , pile expression) utilisée est définie ainsi:
public static void effectuerCalcul(Stack<Character> ops, Stack<Double> pileExpression) { char operateur = ops.pop(); double valeur2 = pileExpression.pop(); double valeur1 = pileExpression.pop(); double resultat = 0; switch (operateur) { case plus: resultat = valeur1 + valeur2; break; case moins: resultat = valeur1 - valeur2; break; case mul: resultat = valeur1 * valeur2; break; case div: if (valeur2 == 0) throw new UnsupportedOperationException("division par zero impossible"); resultat = (double) (valeur1 / valeur2); break; } pileExpression.push(resultat); }
Pour rappel, la méthode pop d'une pile retourne son sommet et le retire de la pile.
Chaque caractère de l'expression arithmétique est lu.
-
Si le caractère est un opérateur (opi), alors :
-
Soit l'opérateur au sommet (opSommet) de la pile ops est prioritaire par rapport à opi et dans ce cas la méthode effectuerCalcul(ops , pile expression) est appelée
-
Soit il ne l'est pas et opi est simplement stockée au sommet de ops.
-
-
Si le caractère est un chiffre alors cette lecture continue tant que le carcactère suivant est lui aussi un nombre ou un . (pour pouvoir stocker des réels)
-
Si le caractère est une parenthèse ouvrante alors il est stocké au sommet de ops.
-
Si le caractère est une parenthèse fermante alors tant que le sommet de ops n'est pas une parenthèse ouvrante la méthode effectuerCalcul(ops , pile expression) est appelée.
Ensuite ops est dépilé.
Par exemple pour l'expression : 1+(2+(3+4)) les états successifs de pileExpression sont1 1 2 1 2 3 1 2 3 4 1 2 7 1 9 10
et ceux de ops sont
+ + ( + ( + + ( + ( + ( + ( +
Illustrations de ce qui se passe au niveau de la pile des opérateurs et de la pile servant à stocker les résultats successifs de l'évaluation d'une expression.
Ces résultats sont aussi observables dans le fichier généré par les logs : logs/logPileCalculs.log
- Cloner le projet
- Dans un terminal : java -jar calculatrice-0.1.0.jar