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.

58 lines
2.1 KiB

from Pile import Pile_chaine as Pile
from math import *
class Expression:
def __init__(self, racine, gauche, droit):
"""initialisation d'un objet 'Expression'"""
self.racine = racine
self.gauche = gauche
self.droit = droit
def evalue(self):
"""renvoie la valeur de l'expression
si 1 seul argument alors on prend le fils gauche"""
#fonction unaires
if self.racine == "sin":
return sin(self.gauche.evalue())
if self.racine == "cos":
return cos(self.gauche.evalue())
if self.racine == "tan":
return tan(self.gauche.evalue())
#fonctions binaires
if self.racine == "+":
return self.gauche.evalue() + self.droit.evalue()
if self.racine == "-":
return self.gauche.evalue() - self.droit.evalue()
if self.racine == "*":
return self.gauche.evalue() * self.droit.evalue()
if self.racine == "/":
return self.gauche.evalue() / self.droit.evalue()
if self.racine == "^":
return self.gauche.evalue() ** self.droit.evalue()
if "." in self.racine:
return float(self.racine)
return int(self.racine)
def __str__(self):
"""affiche l'expression"""
#temporaire
if self.racine in ["+", "*", "-", "/", "^"]:
return "(" + str(self.gauche) + self.racine + str(self.droit) + ")"
if self.racine in ["sin","cos","tan"]:
return self.racine + "(" + str(self.gauche) + ")"
return str(self.racine)
def npi2tree(liste_en_npi):
"""conversion d'une liste en NPI en un arbre"""
pile_expr = Pile()
for element in liste_en_npi:
if element in ["+", "*","-","/", "^"]:
pile_expr.empiler(Expression(element, pile_expr.depiler(),pile_expr.depiler()))
elif element in ["sin","cos","tan"]:
pile_expr.empiler(Expression(element, pile_expr.depiler(),None))
else:
pile_expr.empiler(Expression(element, None, None))
return pile_expr.sommet()