You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
2.0 KiB
61 lines
2.0 KiB
"""
|
|
Fonctions non documentées (sauf une !).
|
|
Beaucoup de choses inutilement compliquées, et hors programme : isinstance, fonctions lambda, affectation conditionnelles, ...
|
|
Méthode __str__ absente
|
|
Mauvaise gestion des exceptions (les return None ou return "Expression invalide" n'ont pas de sens)
|
|
Pas de gestion des erreurs dans l'expression entrée
|
|
Des noms de variables ou des commentaires en anglais qui semblent peu personnels...
|
|
|
|
Note : 12
|
|
"""
|
|
|
|
|
|
#from File import File_chaine as File
|
|
#from Pile import Pile_chaine as Pile
|
|
|
|
class Expression:
|
|
def __init__(self, valeur, gauche=None, droite=None):
|
|
self.valeur = valeur
|
|
self.gauche = gauche
|
|
self.droite = droite
|
|
|
|
def evalue(self):
|
|
if isinstance(self.valeur, (int, float)):
|
|
return self.valeur
|
|
|
|
operateurs = {
|
|
'+': lambda x, y: x + y,
|
|
'*': lambda x, y: x * y,
|
|
'/': lambda x, y: x / y if y != 0 else float('inf'),
|
|
'-': lambda x, y: x - y
|
|
}
|
|
return operateurs[self.valeur](self.gauche.evalue(), self.droite.evalue())
|
|
|
|
class Calculette:
|
|
def __init__(self):
|
|
pass
|
|
|
|
def npi2tree(self, lst):
|
|
pile = []
|
|
for element in lst:
|
|
if element in ['+', '-', '*', '/']:
|
|
droite = pile.pop()
|
|
gauche = pile.pop()
|
|
pile.append(Expression(element, gauche, droite))
|
|
else:
|
|
try:
|
|
valeur = int(element) if element.isdigit() else float(element)
|
|
pile.append(Expression(valeur))
|
|
except ValueError:
|
|
return None
|
|
return pile[0]
|
|
|
|
def calculer(self, expression):
|
|
try:
|
|
elements = expression.split()
|
|
arbre = self.npi2tree(elements)
|
|
if arbre:
|
|
return arbre.evalue()
|
|
return "Expression invalide"
|
|
except Exception as e:
|
|
return str(e)
|
|
|