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.

137 lines
5.7 KiB

# Évite les import * : il y a de gros risques de conflits !
# Essaye de respecter le maximum de 80 colonnes sur ton code.
# 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).
# 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.5 / 10
from Pile import Pile_lst
from math import *
from tkinter import *
from tkinter.messagebox import *
class Expression:
def __init__(self, valeur, gauche, droite):
self.valeur = valeur
self.gauche = gauche
self.droite = droite
def evalue(self):
"""Renvoie la valeur de l'expression"""
if self.valeur == '+':
return self.gauche.evalue() + self.droite.evalue()
elif self.valeur == '*':
return self.gauche.evalue() * self.droite.evalue()
elif self.valeur == '-':
return self.gauche.evalue() - self.droite.evalue()
elif self.valeur == '/':
return self.gauche.evalue() / self.droite.evalue()
elif self.valeur == '//':
return self.gauche.evalue() // self.droite.evalue()
elif self.valeur == '%':
return self.gauche.evalue() % self.droite.evalue()
elif self.valeur == '^':
return self.gauche.evalue() ** self.droite.evalue()
elif self.valeur == 'sqrt':
return sqrt(self.gauche.evalue())
elif self.valeur == 'cos':
return cos(self.gauche.evalue())
elif self.valeur == 'sin':
return sin(self.gauche.evalue())
elif self.valeur == 'tan':
return tan(self.gauche.evalue())
else:
return self.valeur
def __str__(self):
if self.valeur != '+' and self.valeur != '*' and self.valeur != '-' and self.valeur != '/' and self.valeur != '//' and self.valeur != '%' and self.valeur != '^' and self.valeur != 'sqrt' and self.valeur != 'cos' and self.valeur != 'sin' and self.valeur != 'tan':
return self.valeur
elif self.valeur == '+' or self.valeur == '*' or self.valeur == '-' or self.valeur == '/' or self.valeur == '//' or self.valeur =='%' or self.valeur == '^':
return "(" + str(self.gauche.__str__()) + str(self.valeur) + str(self.droite.__str__()) + ")"
elif self.valeur =='sqrt' or self.valeur == 'cos' or self.valeur == 'sin' or self.valeur == 'tan':
return str(self.valeur) + "(" + str(self.gauche.__str__()) + ")"
def npi2tree(exp):
"""Prends en paramètre une ... correspondant à l'expression en notation polonaise inversée et renvoie l'arbre correspondant"""
pile_npi = Pile_lst()
lst_npi = exp.split()
for element in lst_npi:
if element == '+' or element == '*' or element == '-' or element == '/' or element == '//' or element == '%' or element == '^':
exp_npi = Expression(element, pile_npi.depiler(), pile_npi.depiler())
pile_npi.empiler(exp_npi)
elif element == 'sqrt' or element == 'cos' or element == 'sin' or element == 'tan':
exp_npi = Expression(element, pile_npi.depiler(), None)
pile_npi.empiler(exp_npi)
else:
exp_feuille = Expression(float(element), None, None)
pile_npi.empiler(exp_feuille)
return pile_npi.sommet()
#-------------------------------------------
#Tkinter
#-------------------------------------------
fenetre = Tk()
def resultat():
expr = zonetexte.get()
res = npi2tree(expr).evalue()
texte2.configure(text=res)
affichage = npi2tree(expr)
texte4.configure(text=affichage)
def legende():
fenetre = Tk()
fenetre.title('Légende')
cadre1 = LabelFrame(fenetre, text="Opérateur à 2 chiffres", padx=20, pady=20)
cadre1.pack(fill="both", expand="yes")
cadre2 = LabelFrame(fenetre, text="Opérateur à 1 chiffres", padx=20, pady=20)
cadre2.pack(fill="both", expand="yes")
texteLeg1 = Label(cadre1, text="Pour faire une addition, taper : << + >>").pack()
texteLeg2 = Label(cadre1, text="Pour faire une soustraction, taper : << - >>").pack()
texteLeg3 = Label(cadre1, text="Pour faire une multiplication, taper : << * >>").pack()
texteLeg4 = Label(cadre1, text="Pour faire une division, taper : << / >>").pack()
texteLeg5 = Label(cadre1, text="Pour faire une division entière, taper : << // >>").pack()
texteLeg6 = Label(cadre1, text="Pour calculer le modulo, taper : << % >>").pack()
texteLeg7 = Label(cadre1, text="Pour calculer 'a' puissance 'b', taper : << ^ >>").pack()
texteLeg8 = Label(cadre2, text="Pour calculer la racine carré d'une valeur, taper: << sqrt >>").pack()
texteLeg9 = Label(cadre2, text="Pour calculer le cosinus d'une valeur, taper: << cos >>").pack()
texteLeg10 = Label(cadre2, text="Pour calculer le sinus d'une valeur, taper: << sin >>").pack()
texteLeg11 = Label(cadre2, text="Pour calculer la tangente d'une valeur, taper: << tan >>").pack()
zonetexte = Entry(fenetre, width=30)
zonetexte.pack()
texte1 = Label(fenetre, text="Résultat:")
texte1.pack()
texte2 = Label(fenetre, text="???")
texte2.pack()
texte3 = Label(fenetre, text="Expression:")
texte3.pack()
texte4 = Label(fenetre, text="???")
texte4.pack()
enregistrer=Button(fenetre, text="Résultat", command=resultat)
enregistrer.pack()
menubar = Menu(fenetre)
menu1 = Menu(menubar, tearoff=0)
menu1.add_command(label="Légende", command=legende)
menubar.add_cascade(label="Option", menu=menu1)
fenetre.config(menu=menubar)