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

"""
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)