|
|
|
"""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
|
|
|
|
|