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