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.
65 lines
2.2 KiB
65 lines
2.2 KiB
# Note: 12/20
|
|
# impossible à tester : pas de programme principal et pile non défini
|
|
# Pas d'interface graphique
|
|
# Le choix fait pour l'évaluation n'est pas très logique : normalement on fait
|
|
# plutôt gauche op droit que droit op gauche. Mais il faudrait modifier npi2tree
|
|
# pour dépiler d'abord le fils droit puis le fils gauche.
|
|
# Incohérence sur la division : il faudrait utiliser // puisque tu ne gères que les entiers
|
|
# La gestions des parenthèses dans __str__ va poser problème si un nœud n'a qu'un fils
|
|
# Dans npi2tree, quel sens donnes-tu à if valeur or ope ?????
|
|
|
|
class Expression():
|
|
def __init__(self,valeur,g,d):
|
|
""""initialisation de la racine et de ses deux fils(gauche et droit)"""
|
|
self.valeur = valeur
|
|
self.g = g
|
|
self.d = d
|
|
|
|
def evalue(self):
|
|
""""Mise en place des différents moyens de calculs de manière récursive"""
|
|
|
|
ope = ["+","-","*","**","/"]
|
|
|
|
if self.g is None and self.d is None:
|
|
return int(self.valeur)
|
|
if self.valeur in ope:
|
|
if self.valeur == "+":
|
|
return self.d.evalue() + self.g.evalue()
|
|
elif self.valeur == "-":
|
|
return self.d.evalue() - self.g.evalue()
|
|
elif self.valeur == "*":
|
|
return self.d.evalue() * self.g.evalue()
|
|
elif self.valeur == "**":
|
|
return self.d.evalue() ** self.g.evalue()
|
|
elif self.valeur == "/":
|
|
return self.d.evalue() / self.g.evalue()
|
|
|
|
|
|
def __str__(self):
|
|
"""Fonction qui permet d'afficher l'expression"""
|
|
|
|
s = ""
|
|
if self.g is not None:
|
|
s = '(' + s + self.g.__str__()
|
|
s = s + str(self.valeur)
|
|
if self.d is not None:
|
|
s = s + self.d.__str__() + ')'
|
|
return s
|
|
|
|
def npi2tree(lst):
|
|
"""Fonction prenant en paramètre une liste correspondant à l'expression en notation polonaise inversée"""
|
|
|
|
Pi = pile()
|
|
ope = ["+","-","*","**","/"]
|
|
|
|
for valeur in lst :
|
|
if valeur or ope :
|
|
Pi.empiler(Expression(valeur,Pi.depiler(),Pi.depiler()))
|
|
else:
|
|
Pi.empiler(Expression(int(valeur),None,None))
|
|
return Pi.sommet()
|
|
|
|
|
|
|
|
|
|
|
|
|