diff --git a/Pile.py b/Pile.py new file mode 100644 index 0000000..3f198b5 --- /dev/null +++ b/Pile.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from listeChaine import ListeChaine + +class Pile_lst: + """Implémentation d'une pile par une liste.""" + def __init__(self): + """Crée une pile vide.""" + self.__pile = [] + + def est_vide(self): + """Indique si la pile est vide.""" + return self.__pile == [] + + def empiler(self, valeur): + """Empile la valeur.""" + self.__pile.append(valeur) + + def depiler(self): + """Dépile le sommet de la pile et le renvoie.""" + return self.__pile.pop() + + def taille(self): + """Renvoie la taille de la pile.""" + return len(self.__pile) + + def sommet(self): + """Renvoie le sommet de la pile (sans le dépiler).""" + return self.__pile[-1] + + def __str__(self): + s = "|" + for val in self.__pile: + s = str(val) + "->" + s + return s + + +class Pile_chaine: + """Implémentation d'une pile par une liste chaînée.""" + def __init__(self): + """Crée une pile vide.""" + self.__pile = ListeChaine() + self.__taille = 0 + + def est_vide(self): + """Indique si la pile est vide.""" + return self.__taille == 0 + + def empiler(self, valeur): + """Empile la valeur.""" + self.__pile.ajoute(valeur) + self.__taille += 1 + + def depiler(self): + """Dépile le sommet de la pile et le renvoie.""" + if self.est_vide(): + raise IndexError("Impossible de dépiler une pile vide.") + valeur = self.__pile.tete() + self.__pile = self.__pile.queue() + self.__taille -= 1 + return valeur + + def taille(self): + """Renvoie la taille de la pile.""" + return self.__taille + + def sommet(self): + """Renvoie le sommet de la pile (sans le dépiler).""" + if self.est_vide(): + raise IndexError("Une pile vide n'a pas de sommet.") + return self.__pile.tete() + + def __str__(self): + return str(self.__pile) + "->|" + + +if __name__ == "__main__": + p = Pile_lst() + print(p.est_vide()) + p.empiler('A') + p.empiler('B') + p.empiler('C') + print(p.est_vide()) + print(p.sommet()) + print(p) + print(p.taille()) + print(p.depiler()) + print(p.depiler()) + print(p.depiler()) + print(p.est_vide()) diff --git a/Stockfish mais pour les maths.py b/Stockfish mais pour les maths.py index ae10dd9..da632ec 100644 --- a/Stockfish mais pour les maths.py +++ b/Stockfish mais pour les maths.py @@ -9,7 +9,7 @@ class Expression: def evalue(self): dfs_post(self) - print(self.valeur) + return self.valeur def __str__(self): expstr = dfs_in(self, "") @@ -24,6 +24,12 @@ def dfs_post(a): a.valeur = a.gauche.valeur + a.droit.valeur if a.valeur == "*": a.valeur = a.gauche.valeur * a.droit.valeur + if a.valeur == "-": + a.valeur = a.gauche.valeur - a.droit.valeur + if a.valeur == "/": + a.valeur = a.gauche.valeur / a.droit.valeur + if a.valeur == "^": + a.valeur = a.gauche.valeur ** a.droit.valeur def dfs_in(a, expstr): if a == None: @@ -41,33 +47,61 @@ def npi2tree(exptext): exptext = exptext.split() expression = Pile_chaine() for element in exptext: - if element in ("+", "*"): - droit = expression.depiler() + if element in ("+ * - / ^".split()): gauche = expression.depiler() + droit = expression.depiler() expression.empiler(Expression(element, gauche, droit)) else: expression.empiler(Expression(int(element), None, None)) return expression.sommet() def insert(text): - pass + global txt, currentnumber + if text in ("+ * - / ^".split()): + txt = currentnumber + " " + txt + " " + text + currentnumber = "" + else: + currentnumber = currentnumber + text + lcdscreen.config(text = currentnumber + " " + txt) + +def cls(): + global txt, currentnumber + txt = "" + currentnumber = "" + lcdscreen.config(text = txt) + +def calc(): + global txt, currentnumber + txt = currentnumber + " " + txt + result = npi2tree(txt) + lcdscreen.config(text = (str(result), "=", result.evalue())) window = Tk() window.title("Stockfish mais pour les maths") window.geometry(f"300x400+50+50") canvas = Canvas(window, width = 300, height = 400, bg = "#abcdef") canvas.pack() -lcdscreen = Entry(window, width = 35) +lcdscreen = Label(window, width = 24) lcdscreen.place(x=5, y=5) touches = "0 1 2 3 4 5 6 7 8 9 + * - / ^".split() +txt = "" +currentnumber = "" + for touche in touches: button = Button(window, text = touche, command = lambda touche=touche: insert(touche), bg = "#fedcba") button.place(x=touches.index(touche) // 3 * 50 + 10, y = touches.index(touche) % 3 * 50 + 100) -exp = "6 4 3 + *" -exp = npi2tree(exp) +clsbutton = Button(window, text = "Reset Stockfish but for maths.py's current processus", command = cls, bg = "#abdcba", font=("Stockfish font, but it doesn't exist :(", 7)) +clsbutton.place(x=10, y=250) + +calcbutton = Button(window, text = "Finalize Stockfish processus", command = calc, bg = "#f42205") +calcbutton.place(x=10, y=290) + +logo = PhotoImage(file="stockfish mais pour les maths logo.png") +logo = logo.subsample(10) +canvas.create_image(200, 0, anchor=NW, image=logo) +canvas.pack() -print(exp) -exp.evalue() \ No newline at end of file +window.mainloop() \ No newline at end of file diff --git a/listeChaine.py b/listeChaine.py new file mode 100644 index 0000000..5c491ef --- /dev/null +++ b/listeChaine.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Tue Sep 22 20:44:35 2020 + +@author: manu +""" + + +class Maillon: + """Un maillon d'une liste chaînée.""" + def __init__(self, valeur, suivant): + self.valeur = valeur + self.suivant = suivant + + def __str__(self): + """Renvoie une chane de caractères représentant le maillon.""" + return str(self.valeur) + + +class ListeChaine: + """Une liste chaînée.""" + def __init__(self, tete=None): + """Crée une liste vide, ou une liste dont la tete (un maillon) + est donnée.""" + self.__tete = tete + + def est_vide(self): + """Indique si la liste est vide.""" + return self.__tete is None + + def tete(self): + """Renvoie la valeur du premier élément de la liste.""" + if self.est_vide(): + raise IndexError("La liste vide n'a pas de tête") + return self.__tete.valeur + + def queue(self): + """Renvoie la queue de la liste.""" + if self.est_vide(): + raise IndexError("La liste vide n'a pas de queue") + return ListeChaine(self.__tete.suivant) + + def ajoute(self, valeur): + """ajoute `valeur` en tête de la liste.""" + self.__tete = Maillon(valeur, self.__tete) + + def __str__(self): + """Renvoie une chaîne de caractères représentant la liste.""" + maillon = self.__tete + s = '' + while maillon is not None: + s = s + str(maillon.valeur) + maillon = maillon.suivant + if maillon is not None: + s += '->' + return s + + def __len__(self): + """Renvoie la longueur de la liste.""" + maillon = self.__tete + long = 0 + while maillon is not None: + long = long + 1 + maillon = maillon.suivant + return long + + def __getitem__(self, n): + """Renvoie l'élément d'indice n de la liste.""" + maillon = self.__tete + i = 0 + while i < n and maillon is not None: + i = i + 1 + maillon = maillon.suivant + if maillon is None or n < 0: + raise IndexError("Indice non valide") + return maillon.valeur + + def __add__(self, other): + """Renvoie la liste correspondant à la concaténation des 2 listes.""" + if self.est_vide(): + return other + v = self.tete() + q = self.queue() + return ListeChaine(Maillon(v, (q + other).__tete)) + + def reverse(self): + """Renvoie une liste correspondant à la liste renversée.""" + res = ListeChaine() + maillon = self.__tete + while maillon is not None: + res.ajoute(maillon.valeur) + maillon = maillon.suivant + return res + + +if __name__ == "__main__": + lst = ListeChaine() + print(lst.est_vide()) + lst.ajoute(306) + lst.ajoute(42) + lst.ajoute(205) + print(lst) + print(lst.est_vide()) + print(lst[0]) + print(lst[1]) + print(len(lst)) + lst2 = ListeChaine() + lst2.ajoute(18) + lst2.ajoute(45) + print(lst + lst2) diff --git a/stockfish mais pour les maths logo.png b/stockfish mais pour les maths logo.png new file mode 100644 index 0000000..09b1756 Binary files /dev/null and b/stockfish mais pour les maths logo.png differ