|
@ -3,6 +3,8 @@ from tkinter import messagebox |
|
|
from Pile import Pile_chaine as Pile |
|
|
from Pile import Pile_chaine as Pile |
|
|
from math import * |
|
|
from math import * |
|
|
from expression import * |
|
|
from expression import * |
|
|
|
|
|
from infixe import infixe2npi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ValeurSaisie: |
|
|
class ValeurSaisie: |
|
|
"""classe d'une valeur saise par l'utilisateur""" |
|
|
"""classe d'une valeur saise par l'utilisateur""" |
|
@ -60,13 +62,13 @@ class Interface(tk.Frame): |
|
|
|
|
|
|
|
|
fonctions = tk.LabelFrame(commandes, text="fonctions", padx=5, pady=5) |
|
|
fonctions = tk.LabelFrame(commandes, text="fonctions", padx=5, pady=5) |
|
|
fonctions.pack(fill="both") |
|
|
fonctions.pack(fill="both") |
|
|
btn_sinus = tk.Button(fonctions, text='sin', command=lambda : self.evaluer("sin",1)) |
|
|
btn_sinus = tk.Button(fonctions, text='sin', command=lambda : self.evaluer_stack("sin",1)) |
|
|
btn_sinus.pack(side="left") |
|
|
btn_sinus.pack(side="left") |
|
|
btn_sinus = tk.Button(fonctions, text='cos', command=lambda : self.evaluer("cos",1)) |
|
|
btn_sinus = tk.Button(fonctions, text='cos', command=lambda : self.evaluer_stack("cos",1)) |
|
|
btn_sinus.pack(side="left") |
|
|
btn_sinus.pack(side="left") |
|
|
btn_sinus = tk.Button(fonctions, text='tan', command=lambda : self.evaluer("tan",1)) |
|
|
btn_sinus = tk.Button(fonctions, text='tan', command=lambda : self.evaluer_stack("tan",1)) |
|
|
btn_sinus.pack(side="left") |
|
|
btn_sinus.pack(side="left") |
|
|
btn_pow = tk.Button(fonctions, text='^', command=lambda : self.evaluer("^",2)) |
|
|
btn_pow = tk.Button(fonctions, text='^', command=lambda : self.evaluer_stack("^",2)) |
|
|
btn_pow.pack(side="right") |
|
|
btn_pow.pack(side="right") |
|
|
|
|
|
|
|
|
def create_menu_bar(self): |
|
|
def create_menu_bar(self): |
|
@ -109,18 +111,45 @@ class Interface(tk.Frame): |
|
|
self.effacer_tt() |
|
|
self.effacer_tt() |
|
|
self.saisie_expression.delete(0 ,'end') |
|
|
self.saisie_expression.delete(0 ,'end') |
|
|
|
|
|
|
|
|
def do_something(self): |
|
|
|
|
|
pass |
|
|
|
|
|
def aide(self): |
|
|
def aide(self): |
|
|
"""affiche l'aide""" |
|
|
"""affiche l'aide""" |
|
|
messagebox.showinfo("Aide", "...") |
|
|
messagebox.showinfo("Aide", "...") |
|
|
def about(self): |
|
|
def about(self): |
|
|
"""à propos de cette application""" |
|
|
"""à propos de cette application""" |
|
|
messagebox.showinfo("À propos", "Ceci est une calculatrice.") |
|
|
messagebox.showinfo("À propos", "Ceci est une calculatrice.") |
|
|
|
|
|
def entrer(self): |
|
|
|
|
|
"""si dans mode interactif alors ajoute nv terme |
|
|
|
|
|
si dans autre mode alors evalue l'expression""" |
|
|
|
|
|
if self.etat_affichage == "post-int": |
|
|
|
|
|
self.entrer_terme_dans_stack() |
|
|
|
|
|
if len(self.saisie_expression.get()) > 0: |
|
|
|
|
|
self.evaluer_expr() |
|
|
|
|
|
|
|
|
def evaluer(self, op, nb_arg): |
|
|
def entrer_terme_dans_stack(self): |
|
|
"""affiche une erreur s'il n'y a pas assez d'arguments ; |
|
|
"""si nombre : ajoute une nouvelle valeur dans le stack |
|
|
application de l'operation aux nb_arg dernières valeurs du stack ; |
|
|
ajoute un label avec cette valeur |
|
|
|
|
|
si fonction : on l'évalue""" |
|
|
|
|
|
valeur_a_ajouter = self.saisie_expression.get().replace(" ", "") |
|
|
|
|
|
if valeur_a_ajouter != "": |
|
|
|
|
|
if "." in valeur_a_ajouter: |
|
|
|
|
|
valeur_a_ajouter = float(valeur_a_ajouter) |
|
|
|
|
|
self.stack.empiler(ValeurSaisie(valeur_a_ajouter, self.frame_stack)) |
|
|
|
|
|
elif valeur_a_ajouter in ["sin","cos","tan","!"]: self.evaluer_stack(valeur_a_ajouter,1) |
|
|
|
|
|
elif valeur_a_ajouter in ["+","-","/","*","^"]: self.evaluer_stack(valeur_a_ajouter,2) |
|
|
|
|
|
elif valeur_a_ajouter in ["moy3"]: self.evaluer_stack(valeur_a_ajouter,3) |
|
|
|
|
|
elif valeur_a_ajouter in ["somme","produit"]: self.evaluer_stack(valeur_a_ajouter,-1) |
|
|
|
|
|
elif valeur_a_ajouter == "pi": self.stack.empiler(ValeurSaisie(pi, self.frame_stack)) |
|
|
|
|
|
else: |
|
|
|
|
|
try: |
|
|
|
|
|
valeur_a_ajouter = int(valeur_a_ajouter) |
|
|
|
|
|
self.stack.empiler(ValeurSaisie(valeur_a_ajouter, self.frame_stack)) |
|
|
|
|
|
except ValueError: |
|
|
|
|
|
messagebox.showerror("Saisie invalide", "Vous n'avez pas entré un nombre, ou la fonction est inconnue") |
|
|
|
|
|
|
|
|
|
|
|
self.saisie_expression.delete(0 ,'end') |
|
|
|
|
|
|
|
|
|
|
|
def evaluer_stack(self, op, nb_arg): |
|
|
|
|
|
"""application de l'operation aux nb_arg dernières valeurs du stack ; |
|
|
si nb_arg == -1 alors toutes les valeurs du stack sont utilisées""" |
|
|
si nb_arg == -1 alors toutes les valeurs du stack sont utilisées""" |
|
|
if nb_arg == -1: |
|
|
if nb_arg == -1: |
|
|
if self.stack.est_vide(): |
|
|
if self.stack.est_vide(): |
|
@ -149,99 +178,57 @@ class Interface(tk.Frame): |
|
|
if nb_arg == 1: |
|
|
if nb_arg == 1: |
|
|
val = self.stack.depiler().valeur |
|
|
val = self.stack.depiler().valeur |
|
|
|
|
|
|
|
|
if op == "sin": |
|
|
if op == "sin": res = sin(val) |
|
|
res = sin(val) |
|
|
if op == "cos": res = cos(val) |
|
|
if op == "cos": |
|
|
if op == "tan": res = tan(val) |
|
|
res = cos(val) |
|
|
if op == "sqrt": res = sqrt(val) |
|
|
if op == "tan": |
|
|
if op == "!": res = factorial(val) |
|
|
res = tan(val) |
|
|
|
|
|
if op == "!": |
|
|
|
|
|
res = factorial(val) |
|
|
|
|
|
|
|
|
|
|
|
elif nb_arg == 2: |
|
|
elif nb_arg == 2: |
|
|
droite = self.stack.depiler().valeur |
|
|
droite = self.stack.depiler().valeur |
|
|
gauche = self.stack.depiler().valeur |
|
|
gauche = self.stack.depiler().valeur |
|
|
|
|
|
|
|
|
if op == "+": |
|
|
if op == "+": res = gauche + droite |
|
|
res = gauche + droite |
|
|
if op == "-": res = gauche - droite |
|
|
if op == "-": |
|
|
if op == "*": res = gauche * droite |
|
|
res = gauche - droite |
|
|
if op == "/": res = gauche / droite |
|
|
if op == "*": |
|
|
if op == "^": res = gauche ** droite |
|
|
res = gauche * droite |
|
|
|
|
|
if op == "/": |
|
|
|
|
|
res = gauche / droite |
|
|
|
|
|
if op == "^": |
|
|
|
|
|
res = gauche ** droite |
|
|
|
|
|
|
|
|
|
|
|
elif nb_arg == 3: |
|
|
elif nb_arg == 3: |
|
|
terme3 = self.stack.depiler().valeur |
|
|
terme3 = self.stack.depiler().valeur |
|
|
terme2 = self.stack.depiler().valeur |
|
|
terme2 = self.stack.depiler().valeur |
|
|
terme1 = self.stack.depiler().valeur |
|
|
terme1 = self.stack.depiler().valeur |
|
|
|
|
|
|
|
|
if op == "moy3": |
|
|
if op == "moy3": res = (terme1 + terme2 + terme3)/3 |
|
|
res = (terme1 + terme2 + terme3)/3 |
|
|
|
|
|
|
|
|
|
|
|
self.stack.empiler(ValeurSaisie(res, self.frame_stack)) |
|
|
self.stack.empiler(ValeurSaisie(res, self.frame_stack)) |
|
|
|
|
|
|
|
|
def entrer(self): |
|
|
def evaluer_expr(self): |
|
|
"""si dans mode npi: si dans interactif alors ajoute nv terme |
|
|
|
|
|
si dans expression alors evalue l'expression""" |
|
|
|
|
|
#completer les différents cas pour les autres notations |
|
|
|
|
|
if self.etat_affichage == "post-int": |
|
|
|
|
|
self.entrer_terme_dans_stack() |
|
|
|
|
|
if self.etat_affichage == "post-expr": |
|
|
|
|
|
self.evaluer_prepostfixe() |
|
|
|
|
|
if self.etat_affichage == "pre": |
|
|
|
|
|
self.evaluer_prepostfixe() |
|
|
|
|
|
def evaluer_prepostfixe(self): |
|
|
|
|
|
"""evalue la chaine de caractère dans le champ de saisie |
|
|
"""evalue la chaine de caractère dans le champ de saisie |
|
|
comme une expression en notation polonaise ou npi selon l'affichage""" |
|
|
selon l'affichage / la notation choisie (prefixe/infixe/postfixe)""" |
|
|
#simplifier les conditions (plus tard) - ça m'a l'air pas mal |
|
|
|
|
|
lst_expr = self.saisie_expression.get().split() |
|
|
lst_expr = self.saisie_expression.get().split() |
|
|
if self.etat_affichage == "pre": |
|
|
if self.etat_affichage == "pre": |
|
|
lst_expr = lst_expr.reverse() |
|
|
lst_expr.reverse() |
|
|
|
|
|
if self.etat_affichage == "inf": |
|
|
|
|
|
try: |
|
|
|
|
|
lst_expr = infixe2npi(lst_expr) |
|
|
|
|
|
except SyntaxError: |
|
|
|
|
|
messagebox.showerror("Erreur de syntaxe", "L'expression est mal parenthésée, ou vous avez oublié une espace") |
|
|
|
|
|
return |
|
|
try: |
|
|
try: |
|
|
arbre_expr = npi2tree(lst_expr) |
|
|
arbre_expr = npi2tree(lst_expr, self.etat_affichage) |
|
|
self.affichage_expression.config(text = str(arbre_expr) + "=" + str(arbre_expr.evalue())) |
|
|
self.affichage_expression.config(text = str(arbre_expr) + "=" + str(arbre_expr.evalue())) |
|
|
except IndexError: |
|
|
except IndexError: |
|
|
messagebox.showerror("Erreur","Erreur") |
|
|
messagebox.showerror("Erreur","Erreur de syntaxe") |
|
|
|
|
|
except ValueError: |
|
|
def entrer_terme_dans_stack(self): |
|
|
messagebox.showerror("Saisie invalide", "Vous n'avez pas entré un nombre, ou la fonction est inconnue") |
|
|
"""si nombre : ajoute une nouvelle valeur dans le stack |
|
|
|
|
|
ajoute un label avec cette valeur |
|
|
|
|
|
si fonction : appelle la fonction évaluer""" |
|
|
|
|
|
valeur_a_ajouter = self.saisie_expression.get().replace(" ", "") |
|
|
|
|
|
if valeur_a_ajouter != "": |
|
|
|
|
|
if "." in valeur_a_ajouter: |
|
|
|
|
|
valeur_a_ajouter = float(valeur_a_ajouter) |
|
|
|
|
|
self.stack.empiler(ValeurSaisie(valeur_a_ajouter, self.frame_stack)) |
|
|
|
|
|
elif valeur_a_ajouter in ["sin","cos","tan","!"]: |
|
|
|
|
|
self.evaluer(valeur_a_ajouter,1) |
|
|
|
|
|
elif valeur_a_ajouter in ["+","-","/","*","^"]: |
|
|
|
|
|
self.evaluer(valeur_a_ajouter,2) |
|
|
|
|
|
elif valeur_a_ajouter in ["moy3"]: |
|
|
|
|
|
self.evaluer(valeur_a_ajouter,3) |
|
|
|
|
|
elif valeur_a_ajouter in ["somme","produit"]: |
|
|
|
|
|
self.evaluer(valeur_a_ajouter,-1) |
|
|
|
|
|
elif valeur_a_ajouter == "pi": |
|
|
|
|
|
self.stack.empiler(ValeurSaisie(pi, self.frame_stack)) |
|
|
|
|
|
else: |
|
|
|
|
|
try: |
|
|
|
|
|
valeur_a_ajouter = int(valeur_a_ajouter) |
|
|
|
|
|
self.stack.empiler(ValeurSaisie(valeur_a_ajouter, self.frame_stack)) |
|
|
|
|
|
except ValueError: |
|
|
|
|
|
messagebox.showerror("Saisie invalide", "Vous n'avez pas entré un nombre, ou la fonction est inconnue") |
|
|
|
|
|
|
|
|
|
|
|
self.saisie_expression.delete(0 ,'end') |
|
|
|
|
|
|
|
|
|
|
|
def effacer_tt(self): |
|
|
def effacer_tt(self): |
|
|
"""supprime tout le contenu de la pile (et les labels associés)""" |
|
|
"""supprime tout le contenu de la pile (et les labels associés)""" |
|
|
while not self.stack.est_vide(): |
|
|
while not self.stack.est_vide(): |
|
|
self.stack.depiler() |
|
|
self.stack.depiler() |
|
|
self.frame_stack.config(height = 1) |
|
|
self.frame_stack.config(height = 1) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def effacer_dernier(self): |
|
|
def effacer_dernier(self): |
|
|
"""supprime la dernière valeur entrée (et le label associés)""" |
|
|
"""supprime la dernière valeur entrée (et le label associés)""" |
|
|
if not self.stack.est_vide(): |
|
|
if not self.stack.est_vide(): |
|
|