From c60ec5f4281711890e76c7c628f8bedbddde83bb Mon Sep 17 00:00:00 2001 From: "sam.hadow" Date: Thu, 25 May 2023 00:39:10 +0200 Subject: [PATCH] Upload files to 'huffman_py' --- huffman_py/Arbre.py | 102 ++++++++++++++++++++++++++++++++++++++++++ huffman_py/Sommets.py | 77 +++++++++++++++++++++++++++++++ huffman_py/main.py | 31 +++++++++++++ 3 files changed, 210 insertions(+) create mode 100644 huffman_py/Arbre.py create mode 100644 huffman_py/Sommets.py create mode 100644 huffman_py/main.py diff --git a/huffman_py/Arbre.py b/huffman_py/Arbre.py new file mode 100644 index 0000000..2372e0d --- /dev/null +++ b/huffman_py/Arbre.py @@ -0,0 +1,102 @@ +# +# Sam Hadow - Huffman-py +# Copyright (C) 2023 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# -*- encoding: utf-8 -*- +from huffman_py.Sommets import * + +class Arbre(object): + def __init__(self, racine = None): + # racine de l'arbre (un objet Sommet) + self.racine = racine + + # les sommets dans l'arbre (une liste d'objets Sommet) + self.sommets = [] + self.gen_arbre() + + self.set_id() + + + # getters et setters des attributs avec _attribut pour stocker l'attribut dans un espace non public + # on utilisera obligatoirement ces méthodes pour manipuler les attributs + + def get_racine(self): + return self.__racine + def set_racine(self, valeur): + self.__racine = valeur + racine = property(fget=get_racine, fset=set_racine, doc="racine de l'arbre") + + def get_sommets(self): + return self.__sommets + def set_sommets(self, valeur): + self.__sommets = valeur + sommets = property(fget=get_sommets, fset=set_sommets, doc="liste des sommets dans l'arbre") + + def gen_arbre(self): + # genère la liste des sommets d'un arbre à partir de la racine de celui ci + L = list() + L.append(self.racine) + while len(L) > 0: + traitement = L.pop(0) + self.sommets.append(traitement) + if traitement.left: + L.append(traitement.left) + if traitement.right: + L.append(traitement.right) + + def set_id(self): + # attribue des identifiants aux sommets d'un arbre + for i,elem in enumerate(self.sommets): + elem.identifiant = i + + def __isub__(self, noeud): + # suppression d'un sommet en surchargeant un opérateur + if self.recherche(noeud) != None: + self.sommets.remove(noeud) + # on supprime également les fils + if noeud.right != None: + self.__isub__(noeud.right) + if noeud.left != None: + self.__isub__(noeud.left) + return self + + def __iadd__(self, arbre2): + # fusion d'arbres + # on crée une nouvelle racined + occurrence = self.racine.occurrence + ancienne_racine = self.racine + if occurrence > arbre2.racine.occurrence: + self.racine = Sommets(occurrence, '', left = arbre2.racine, right = ancienne_racine) + else: + self.racine = Sommets(occurrence, '', left = ancienne_racine, right = arbre2.racine) + + # on ajoute la nouvelle racine à notre liste de sommets + self.sommets.append(self.racine) + + # on ajoute les sommets de arbre2 + self.sommets += arbre2.sommets + + # on crée les id + self.set_id() + + return self + + def recherche(self, noeud): + for sommet in self.sommets: + if sommet == noeud: + return sommet + return None diff --git a/huffman_py/Sommets.py b/huffman_py/Sommets.py new file mode 100644 index 0000000..58843dd --- /dev/null +++ b/huffman_py/Sommets.py @@ -0,0 +1,77 @@ +# +# Sam Hadow - Huffman-py +# Copyright (C) 2023 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +class Sommets(object): + def __init__(self, occurrence, lettres, left = None, right = None): + # nombre d'occurence de la lettre + self.occurrence = occurrence + + # la lettre + self.lettres = lettres + + # fils gauche + self.left = left + + # fils droit + self.right = right + + # direction par rapport au père (0 pour gauche, 1 pour droite) + self.code = '' + + # ID du sommet (unique dans un arbre) + self.identifiant = None + + + # getters et setters des attributs avec _attribut pour stocker l'attribut dans un espace non public + # on utilisera obligatoirement ces méthodes pour manipuler les attributs + + def get_occurence(self): + return self.__occurence + def set_occurence(self, valeur): + self.__occurence = valeur + occurence = property(fget=get_occurence, fset=set_occurence, doc="Nombre d'occurence de la lettre") + + def get_lettres(self): + return self.__lettres + def set_lettres(self, valeur): + self.__lettres = valeur + lettres = property(fget=get_lettres, fset=set_lettres, doc="Lettre correspondante") + + def get_left(self): + return self.__left + def set_left(self, valeur): + self.__left = valeur + left = property(fget=get_left, fset=set_left, doc="fils gauche") + + def get_right(self): + return self.__right + def set_right(self, valeur): + self.__right = valeur + right = property(fget=get_right, fset=set_right, doc="fils droit") + + def get_code(self): + return self.__code + def set_code(self, valeur): + self.__code = valeur + code = property(fget=get_code, fset=set_code, doc="orientation dans l'arbre binaire par rapport au père, 0 pour gauche, 1 pour droite") + + def get_id(self): + return self.__identifiant + def set_id(self, valeur): + self.__identifiant = valeur + identifiant = property(fget=get_id, fset=set_id, doc="identifiant d'un sommet de l'arbre, ces id sont tous différents dans un même arbre") diff --git a/huffman_py/main.py b/huffman_py/main.py new file mode 100644 index 0000000..4ddc48f --- /dev/null +++ b/huffman_py/main.py @@ -0,0 +1,31 @@ +# +# Sam Hadow - Huffman-py +# Copyright (C) 2023 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +from huffman_py.gui.Ui_MainWindow import * +import sys + +def main(): + app = QtWidgets.QApplication(sys.argv) + MainWindow = QtWidgets.QMainWindow() + ui = Ui_MainWindow() + ui.setupUi(MainWindow) + MainWindow.show() + sys.exit(app.exec_()) + +if __name__ == '__main__': + main()