1 changed files with 87 additions and 0 deletions
@ -0,0 +1,87 @@ |
|||
# BELLYNCK Manon |
|||
# GUILLAUMIN-TORRES Ambre |
|||
# COVIN Clara |
|||
from Pile import Pile_lst as Pile |
|||
|
|||
class Expression: |
|||
"""représente une expression arithmétique sous forme d'un arbre""" |
|||
def __init__ (self, valeur_racine, fils_gauche, fils_droit): |
|||
self.val_racine = valeur_racine |
|||
self.gauche = fils_gauche |
|||
self.droit = fils_droit |
|||
|
|||
def evalue (self) : |
|||
""" Permet de renvoyer la valeur de l’expression""" |
|||
if self.gauche == None and self.droit == None : |
|||
return self.val_racine |
|||
|
|||
if self.gauche != None: #on ne met pas elif car les cas sont indépendants" |
|||
gauche_val = self.gauche.evalue() |
|||
else: |
|||
gauche_val = 0 |
|||
|
|||
if self.droit != None: |
|||
droite_val = self.droit.evalue() |
|||
else: |
|||
droite_val = 0 |
|||
|
|||
if self.val_racine == '+': |
|||
return gauche_val + droite_val |
|||
elif self.val_racine == '-': |
|||
return gauche_val - droite_val |
|||
elif self.val_racine == '*': |
|||
return gauche_val * droite_val |
|||
elif self.val_racine == '/': |
|||
return gauche_val / droite_val |
|||
else : |
|||
raise ValueError ("Cette commande ne peut pas être effectuer") |
|||
|
|||
def __str__(self): |
|||
"""Permet d'afficher une expression en ligne, représenter par un arbre""" |
|||
result = "" |
|||
if self.droit: |
|||
result = result + str(self.droit) |
|||
result = result + str(self.val_racine) + "\n" #le "/n" c'est pour avoir une nouvelle ligne de l'arbre |
|||
if self.gauche: |
|||
result += str(self.gauche) |
|||
return result |
|||
|
|||
def npi2tree(lst): |
|||
"""Convertit une liste représentant une expression en notation polonaise inversée en un arbre d'expression.""" |
|||
pille = Pile () |
|||
for element in lst: |
|||
# Si c'est un opérateur (+, -, * ou /), on crée un nœud opérateur |
|||
if element in ('+', '-', '*', '/'): |
|||
droit = pille.depiler() |
|||
gauche = pille.depiler() |
|||
pille.empiler(Expression(element, gauche, droit)) # Créer un nouvel arbre et empiler |
|||
else: |
|||
# Sinon, ça veut dire que c'est un nombre donc on le convertit et on l'empile. |
|||
pille.empiler(Expression(int(element), None, None)) |
|||
|
|||
return pille.depiler() # Retourne l'arbre complet |
|||
|
|||
|
|||
|
|||
|
|||
#test: |
|||
|
|||
exp = Expression(5,None,None) |
|||
assert exp.evalue() == 5 |
|||
|
|||
exp = Expression('+', Expression(8,None,None), Expression(3,None,None))#ça marche comme ça |
|||
assert exp.evalue() == 11 |
|||
|
|||
#exp = Expression('+', 8, 3)#mais ça marche pas comme ça, je sais pas trop comment régler ça |
|||
#assert exp.evalue() == 11 |
|||
|
|||
exp = Expression('*', Expression(8,None,None), Expression(3,None,None))#ça marche comme ça |
|||
assert exp.evalue() == 24 |
|||
|
|||
exp = Expression('-', Expression(45,None,None), Expression(3,None,None))#ça marche comme ça |
|||
assert exp.evalue() == 42 |
|||
|
|||
liste_npi = ["6", "4", "3", "+", "*"] # Correspond à 6 * (4 + 3) |
|||
arbre = Expression.npi2tree(liste_npi) # Convertit la liste en un arbre |
|||
|
|||
print(arbre.evalue()) # Affiche : 42 |
Loading…
Reference in new issue