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.
91 lines
3.2 KiB
91 lines
3.2 KiB
# 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
|
|
|
|
#Les opérations possibles : addition, soustraction, mutliplication, division, puissance.
|
|
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
|
|
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."""
|
|
pile = Pile ()
|
|
for element in lst:
|
|
# Si c'est un opérateur (+, -, * ou /), on crée un nœud opérateur
|
|
if element in ('+', '-', '*', '/','^'):
|
|
droit = pile.depiler()
|
|
gauche = pile.depiler()
|
|
pile.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.
|
|
pile.empiler(Expression(int(element), None, None))
|
|
|
|
return pile.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
|
|
|
|
lst = ["6", "4", "3", "+", "*"] # Correspond à 6 * (4 + 3)
|
|
arbre = npi2tree(lst) # Convertit la liste en un arbre
|
|
|
|
print(arbre.evalue()) # Affiche : 42
|