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.

114 lines
3.1 KiB

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