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.

74 lines
2.8 KiB

2 years ago
"""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