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.
128 lines
3.9 KiB
128 lines
3.9 KiB
# Il ne faut pas changer l'attribut valeur quand tu évalues une expression :
|
|
# tu mélanges la valeur de la racine et la valeur de l'expression.
|
|
# if self.valeur != '+' and ... très lourd. À remplacer par if self.valeur not in '+*/-^'
|
|
# la méthode __str__ est appelée quand on écrit str(expression), et renvoie une
|
|
# chaine de caractères. Écrire str(self.gauche.__str__()) est donc redondant :
|
|
# il suffit d'écrire str(self.gauche).
|
|
# Expr = Pile_chaine() : évite les majuscules sur les noms de variables, et nom
|
|
# très mal choisi pour une pile !!
|
|
# Dans npi2tree :
|
|
# tu fais une erreur dans l'ordre des opérations : 2 3 - devrait donner -1, pas 1
|
|
# il faudrait aussi gérer les erreurs (par exemple 2 3 5 +)
|
|
|
|
# Note : 9 / 10
|
|
|
|
import tkinter as tk
|
|
from Pile import Pile_chaine
|
|
import random
|
|
|
|
class Expression:
|
|
"""Implémentation d'une expression mathématique dans un arbre binaire"""
|
|
def __init__(self, valeur, gauche, droit):
|
|
"""Crée un arbre binaire vide"""
|
|
self.valeur = valeur
|
|
self.gauche = gauche
|
|
self.droit = droit
|
|
|
|
def evalue(self):
|
|
"""Renvoie le résultat de l'expression mathématique d'un arbre binaire"""
|
|
if self.valeur == '+':
|
|
self.valeur = self.gauche.evalue() + self.droit.evalue()
|
|
elif self.valeur == '*':
|
|
self.valeur = self.gauche.evalue() * self.droit.evalue()
|
|
elif self.valeur == '/':
|
|
self.valeur = self.gauche.evalue() / self.droit.evalue()
|
|
elif self.valeur == '-':
|
|
self.valeur = self.gauche.evalue() - self.droit.evalue()
|
|
elif self.valeur == '^':
|
|
self.valeur = self.gauche.evalue() ** self.droit.evalue()
|
|
return self.valeur
|
|
|
|
def __str__(self):
|
|
"""Renvoie l'expression mathématique d'un arbre binaire"""
|
|
if self.valeur != '+' and self.valeur != '*' and self.valeur != '/' and self.valeur != '-' and self.valeur != '^':
|
|
return self.valeur
|
|
else:
|
|
return "(" + str(self.gauche.__str__()) + str(self.valeur) + str(self.droit.__str__()) + ")"
|
|
|
|
|
|
|
|
def npi2tree(ch):
|
|
"""Renvoie un arbre binaire contenant une expression mathématique
|
|
via une expression en notation polonaise inversée"""
|
|
ch = ch.split()
|
|
Expr = Pile_chaine()
|
|
for elmt in ch:
|
|
if elmt == '*' or elmt == '+' or elmt == '/' or elmt == '-' or elmt == '^':
|
|
exp = Expression(elmt, Expr.depiler(), Expr.depiler())
|
|
Expr.empiler(exp)
|
|
else:
|
|
Expr.empiler(Expression(int(elmt), None, None))
|
|
return Expr.sommet()
|
|
|
|
|
|
|
|
|
|
def calculer():
|
|
"""Affiche l'expression ainsi que son résultat dans l'interface Tkinter"""
|
|
déception = ["Peut mieux faire.",
|
|
"Va t'entraîner, t'es nul...",
|
|
"Ah nan, tu pues vraiment.",
|
|
"Skill issue.",
|
|
"Je souhaite que tu arrêtes tout.",
|
|
"Il a eu 0/20",
|
|
"Apprends à lire.",
|
|
"Arrête de déconner.",
|
|
"Abandonne au pire.",
|
|
"42",
|
|
"Va faire un tour dehors."
|
|
]
|
|
expression = entry.get()
|
|
try:
|
|
resultat = npi2tree(expression).evalue()
|
|
result_label.config(text="Résultat: " + str(npi2tree(expression)) + " = " + str(resultat))
|
|
except:
|
|
result_label.config(text=random.choice(déception))
|
|
|
|
root = tk.Tk()
|
|
root.title("Calculatrice rudimentaire")
|
|
|
|
message_label = tk.Label(root, text="Le calcul doit être écrit en notation polonaise inversée")
|
|
message_label.pack()
|
|
|
|
entry = tk.Entry(root, width=30)
|
|
entry.pack(pady=10)
|
|
|
|
evaluate_button = tk.Button(root, text="Calculer", command=calculer)
|
|
evaluate_button.pack()
|
|
|
|
result_label = tk.Label(root, text="")
|
|
result_label.pack(pady=10)
|
|
|
|
root.mainloop()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|