"""Fichier de classe pour les expressions""" import math class Expression: """manipule les expression sous forme d'arbre""" def __init__(self, val, fils_gauche=None, fils_droit=None) -> None: self.val = val self.fils_gauche = fils_gauche self.fils_droit = fils_droit def __str__(self) -> str: """renvoie l'expression sous forme infixé""" if self.est_feuille(): return str(self.val) return '('+self.fils_gauche.__str__()+str(self.val)+self.fils_droit.__str__()+')' def print_tree(self, level=0): """ Affiche le noeud joliment""" if self.fils_gauche is not None: self.fils_gauche.print_tree(level + 1) print(' ' * 4 * level + '-> ' + str(self.val)) if self.fils_droit is not None: self.fils_droit.print_tree(level + 1) def est_feuille(self) -> bool: """ Renvoie true si le noeud est une feuille""" if self.fils_droit is None and self.fils_gauche is None: return True return False def evalue(self, x=0) -> float: """ Renvoie le résultat de l'expression""" try: if self.est_feuille(): if self.val == 'x': return x return float(self.val) elif self.val == '+': return self.fils_gauche.evalue(x) + self.fils_droit.evalue(x) elif self.val == '*': return self.fils_gauche.evalue(x) * self.fils_droit.evalue(x) elif self.val == '/': return self.fils_gauche.evalue(x) / self.fils_droit.evalue(x) elif self.val == '^': return self.fils_gauche.evalue(x) ** self.fils_droit.evalue(x) elif self.val == '-': return self.fils_gauche.evalue(x) - self.fils_droit.evalue(x) elif self.val == 'ln': return math.log(self.fils_gauche.evalue(x)) elif self.val == '√': return math.sqrt(self.fils_gauche.evalue(x)) elif self.val == "cos": return math.cos(self.fils_gauche.evalue(x)) elif self.val == "sin": return math.sin(self.fils_gauche.evalue(x)) elif self.val == "tan": return math.tan(self.fils_gauche.evalue(x)) except ZeroDivisionError: raise ZeroDivisionError def valeurs_de_fonction(self, start, end): """ Calcul les valeurs entre start et end""" result = [] pas = (end - start) / 1000 while start <= end: try: result.append((start, self.evalue(start))) except: pass start += pas return result