commit e7a9b1a7cf07fa47676b053adf0da9ed5ebb3749 Author: Klafyvel Date: Sun Apr 1 14:34:28 2018 +0200 Ajoutd es fichiers diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..134ea95 --- /dev/null +++ b/.gitignore @@ -0,0 +1,233 @@ + +# Created by https://www.gitignore.io/api/latex + +### LaTeX ### +## Core latex/pdflatex auxiliary files: +*.aux +*.lof +*.log +*.lot +*.fls +*.out +*.toc +*.fmt +*.fot +*.cb +*.cb2 + +## Intermediate documents: +*.dvi +*.xdv +*-converted-to.* +# these rules might exclude image files for figures etc. +# *.ps +# *.eps +# *.pdf + +## Generated if empty string is given at "Please type another file name for output:" +.pdf + +## Bibliography auxiliary files (bibtex/biblatex/biber): +*.bbl +*.bcf +*.blg +*-blx.aux +*-blx.bib +*.run.xml + +## Build tool auxiliary files: +*.fdb_latexmk +*.synctex +*.synctex(busy) +*.synctex.gz +*.synctex.gz(busy) +*.pdfsync +*Notes.bib + +## Auxiliary and intermediate files from other packages: +# algorithms +*.alg +*.loa + +# achemso +acs-*.bib + +# amsthm +*.thm + +# beamer +*.nav +*.pre +*.snm +*.vrb + +# changes +*.soc + +# cprotect +*.cpt + +# elsarticle (documentclass of Elsevier journals) +*.spl + +# endnotes +*.ent + +# fixme +*.lox + +# feynmf/feynmp +*.mf +*.mp +*.t[1-9] +*.t[1-9][0-9] +*.tfm + +#(r)(e)ledmac/(r)(e)ledpar +*.end +*.?end +*.[1-9] +*.[1-9][0-9] +*.[1-9][0-9][0-9] +*.[1-9]R +*.[1-9][0-9]R +*.[1-9][0-9][0-9]R +*.eledsec[1-9] +*.eledsec[1-9]R +*.eledsec[1-9][0-9] +*.eledsec[1-9][0-9]R +*.eledsec[1-9][0-9][0-9] +*.eledsec[1-9][0-9][0-9]R + +# glossaries +*.acn +*.acr +*.glg +*.glo +*.gls +*.glsdefs + +# gnuplottex +*-gnuplottex-* + +# gregoriotex +*.gaux +*.gtex + +# hyperref +*.brf + +# knitr +*-concordance.tex +# TODO Comment the next line if you want to keep your tikz graphics files +*.tikz +*-tikzDictionary + +# listings +*.lol + +# makeidx +*.idx +*.ilg +*.ind +*.ist + +# minitoc +*.maf +*.mlf +*.mlt +*.mtc[0-9]* +*.slf[0-9]* +*.slt[0-9]* +*.stc[0-9]* + +# minted +_minted* +*.pyg + +# morewrites +*.mw + +# nomencl +*.nlo + +# pax +*.pax + +# pdfpcnotes +*.pdfpc + +# sagetex +*.sagetex.sage +*.sagetex.py +*.sagetex.scmd + +# scrwfile +*.wrt + +# sympy +*.sout +*.sympy +sympy-plots-for-*.tex/ + +# pdfcomment +*.upa +*.upb + +# pythontex +*.pytxcode +pythontex-files-*/ + +# thmtools +*.loe + +# TikZ & PGF +*.dpth +*.md5 +*.auxlock + +# todonotes +*.tdo + +# easy-todo +*.lod + +# xindy +*.xdy + +# xypic precompiled matrices +*.xyc + +# endfloat +*.ttt +*.fff + +# Latexian +TSWLatexianTemp* + +## Editors: +# WinEdt +*.bak +*.sav + +# Texpad +.texpadtmp + +# Kile +*.backup + +# KBibTeX +*~[0-9]* + +# auto folder when using emacs and auctex +/auto/* + +# expex forward references with \gathertags +*-tags.tex + +### LaTeX Patch ### +# glossaries +*.glstex + + +# End of https://www.gitignore.io/api/latex diff --git a/CSLogo.png b/CSLogo.png new file mode 100644 index 0000000..6ae5a97 Binary files /dev/null and b/CSLogo.png differ diff --git a/MyPack2.sty b/MyPack2.sty new file mode 100644 index 0000000..bd13b4e --- /dev/null +++ b/MyPack2.sty @@ -0,0 +1,169 @@ +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{MyPack2} + +%%%%%%%% INCLUSIONS GÉNÉRALES %%%%%%%%% +\RequirePackage{babel} +%\RequirePackage{titlesec} +\RequirePackage{color} +%\RequirePackage[a4paper]{geometry} +\RequirePackage[font=small,format=plain,labelfont=bf,up, + textfont=normal,up, + justification=justified, + singlelinecheck=false]{caption} +\RequirePackage[justification=centering]{caption} +\RequirePackage{xcolor} % Required for specifying custom colours +\definecolor{grey}{rgb}{0.9,0.9,0.9} % Colour of the box surrounding the title +\RequirePackage[utf8]{inputenc} % Required for inputting international characters + +\RequirePackage[T1]{fontenc} +% \RequirePackage[sfdefault]{ClearSans} % Use the Clear Sans font (sans serif) +\RequirePackage{placeins} +\RequirePackage{listings} +\RequirePackage{graphicx} +\RequirePackage{amsfonts} + + +\definecolor{defaultColor}{RGB}{0,100,143} +\definecolor{bleu}{RGB}{0,100,143} +\definecolor{gris}{RGB}{130,130,140} +\definecolor{grisBleu}{RGB}{65,115,141} + + + +%%%%%%%% MATH %%%%%%%%% +\RequirePackage{stmaryrd} +\newcommand*\intervalleEntier[2]{\intervalle{\llbracket}{#1}{#2}{\rrbracket}} +\newcommand*\intervalle[4]{\left#1 #2 \, ; #3 \right#4} +\newcommand*\intervalleOO[2]{\intervalle{]}{#1}{#2}{[}} +\newcommand*\intervalleFF[2]{\intervalle{[}{#1}{#2}{]}} +\newcommand*\intervalleOF[2]{\intervalle{]}{#1}{#2}{]}} +\newcommand*\intervalleFO[2]{\intervalle{[}{#1}{#2}{[}} + +\let\ensembleNombre\mathbb +\newcommand*\N{\ensembleNombre{N}} +\newcommand*\Z{\ensembleNombre{Z}} +\newcommand*\Q{\ensembleNombre{Q}} +\newcommand*\R{\ensembleNombre{R}} +\newcommand*\C{\ensembleNombre{C}} + +\newcommand*\enstq[2]{\left\{#1,\; #2\right\}} + +%\newcommand*\int[1]{\left\lfloor #1\right\rfloor} +%\newcommand*\norme[1]{\left\lVert#1\right\rVert} +%\newcommand*\abs[1]{\left\lvert#1\right\rvert} + +\let\vecteur\overrightarrow + +\newcommand*\Sys[1]{\left\{ \begin{aligned} #1 \end{aligned} \right. \kern-\nulldelimiterspace} + +\newcommand*\application[5]{ + #1 \colon + \begin{alignedat}{2}  &\to \\ +  &\mapsto  + \end{alignedat} +} +\newcommand*\applicationSigne[3]{ + #1 \colon #2 \to #3 +} + +\newtheorem{defi}{Définition}[section] +\newtheorem{theo}{Théorème}[section] +\newtheorem{prop}{Proposition}[section] +\newtheorem{ex}{Exemple}[section] + + +%%%%%%%% SECTIONNEMENT %%%%%%%%% + +%\renewcommand{\thesection}{\Roman{section}} +%\renewcommand{\thesubsection}{\arabic{subsection}} + +%\renewcommand{\@seccntformat}[1]{ +% \llap{ +% \textcolor{defaultColor}{\csname the#1\endcsname} +% \hspace{1em} +% } +%} +%\renewcommand{\section}{ +% \@startsection{section}{1}{0pt} +% {0pt} +% {0pt} +% {\normalfont\large\bfseries\llap} +%} + + +\newcommand*\emptyPage{\newpage\null\thispagestyle{empty}\addtocounter{page}{-1}\newpage} + +%%%%%%%% INTIALISATION DE LA PAGE %%%%%%%%% +\RequirePackage{fancyhdr} +\newcommand\initPage[3]{ + \pagestyle{fancy} + \fancyhead{#1} + \lhead{#2} + \rhead{#3} + \rfoot{} + \lfoot{\includegraphics[scale=0.2]{CSLogo}} + + %\titleformat*{\section}{\Large\bfseries\color{bleu}\Roman{section}} + %\titleformat*{\subsection}{\large\bfseries\color{grisBleu}} + %\titleformat*{\subsubsection}{\bfseries\color{gris}} + %\titlespacing*{\section}{-3em}{*1}{*1} + %\titlespacing*{\subsection}{-2em}{*1}{*1} + %\titlespacing*{\subsubsection}{-1em}{*1}{*1} + +} + +%%%%%%%% TITRE %%%%%%%%M +\renewcommand{\maketitle}{ +\begin{titlepage} % Suppresses displaying the page number on the title page and the subsequent page counts as page 1 + %------------------------------------------------ + % Grey title box + %------------------------------------------------ + \topskip0pt + \vspace*{5cm} + \colorbox{grey}{ + \parbox[t]{0.93\textwidth}{ % Outer full width box + \parbox[t]{0.91\textwidth}{ % Inner box for inner right text margin + \raggedleft % Right align the text + \fontsize{72pt}{80pt}\selectfont % Title font size, the first argument is the font size and the second is the line spacing, adjust depending on title length + \vspace{1cm} % Space between the start of the title and the top of the grey box + + \@title + + \vspace{1cm} % Space between the end of the title and the bottom of the grey box + } + } + } + + \vfill % Space between the title box and author information + + %------------------------------------------------ + % Author name and information + %------------------------------------------------ + + \parbox[t]{0.93\textwidth}{ % Box to inset this section slightly + \raggedleft % Right align the text + \large % Increase the font size + {\Large \@author}\\[4pt] % Extra space after name + + \hfill\rule{0.2\linewidth}{1pt}\\% Horizontal line, first argument width, second thickness + \@date + } + +\end{titlepage} + +\emptyPage +} + + + +%%%%%%%% FIN DU DOCUMENT %%%%%%%%% + +\newcommand{\roadMap}{ + \clearpage + \listoffigures + \clearpage + \listoftables +} + +% Fin du package +\endinput diff --git a/complementaire.pdf b/complementaire.pdf new file mode 100644 index 0000000..472d1e6 Binary files /dev/null and b/complementaire.pdf differ diff --git a/complementaire.tex b/complementaire.tex new file mode 100644 index 0000000..c040e9a --- /dev/null +++ b/complementaire.tex @@ -0,0 +1,53 @@ +\include{macroTL} +\title{Génie logiciel \\ -- \\TD4 - Questions complémentaires} +\author{\bsc{Pietri} Yoann (A11)\\\bsc{Levy--Falk} Hugo (A11)} +\date{Mars 2018} +\usepackage{mathrsfs} +\usepackage{MyPack2} +\usepackage{pdftexcmds} +\usepackage{minted} +\begin{document} + \maketitle + \initPage{TL de Génie Logiciel}{\today}{\bsc{Pietri} Yoann, \bsc{Levy--Falk} Hugo} + \tableofcontents + \newpage + \section{lecture dans un fichier et transformation d'une chaîne de caractères} + Classe \mintinline{java}{Utilitaire} : + \inputminted{java}{questioncomplementaire/Utilitaire.java} + + \section{Codage complet des classes Morse et Cesar} + + \subsection{Classe \mintinline{java}{Cesar}} + \inputminted{java}{questioncomplementaire/Cesar.java} + + \subsection{Classe \mintinline{java}{Morse}} + \inputminted{java}{questioncomplementaire/Morse.java} + + + \section{Mesure des temps d'exécution} + + Classe \mintinline{java}{Comparateur} : + \inputminted{java}{questioncomplementaire/Comparateur.java} + + \section{Utilisation d'un patron pour ajouter un algorithme existant} + + Classe \mintinline{java}{CodageAClef} : + \inputminted{java}{questioncomplementaire/CodageAClef.java} + + \section{Codage d'Huffman} + + Classe \mintinline{java}{Huffman} : + \inputminted{java}{questioncomplementaire/Huffman.java} + + \section{Documentation} + \subsection{Classe \mintinline{java}{Noeud}} + \inputminted{java}{questioncomplementaire/Noeud.java} + \subsection{Classe \mintinline{java}{Arbre}} + \inputminted{java}{questioncomplementaire/Noeud.java} + \subsection{Classe \mintinline{java}{HuffmanCode}} + \inputminted{java}{questioncomplementaire/Noeud.java} + + \section{Sauvegarde des résultats} + Voir la classe \mintinline{java}{Comparateur} dans la section "Mesure des temps d'exécution". + +\end{document} \ No newline at end of file diff --git a/compteRendu.pdf b/compteRendu.pdf new file mode 100644 index 0000000..1a47dfe Binary files /dev/null and b/compteRendu.pdf differ diff --git a/compteRendu.tex b/compteRendu.tex new file mode 100644 index 0000000..4c99403 --- /dev/null +++ b/compteRendu.tex @@ -0,0 +1,60 @@ +\include{macroTL} +\title{Génie logiciel \\ -- \\TD4} +\author{\bsc{Pietri} Yoann (A11)\\\bsc{Levy--Falk} Hugo (A11)} +\date{Mars 2018} +\usepackage{mathrsfs} +\usepackage{MyPack2} +\usepackage{pdftexcmds} +\usepackage{minted} +\begin{document} + \maketitle + \initPage{TL de Génie Logiciel}{\today}{\bsc{Pietri} Yoann, \bsc{Levy--Falk} Hugo} + \tableofcontents + \newpage + \section{Lecture d'une chaîne de caractères dans un fichier} + Le mot clé \mintinline{java}{static} permet d'appeler la méthode \mintinline{java}{lireTexte} sans avoir besoin d'instancier d'objet de la classe \mintinline{java}{Utilitaire}. + + Code source de la classe Comparateur : + + \inputminted{java}{td4/question1/comparateur.java} + + \section{Implémentation de l'architecture logicielle} + + \subsection{Code source de la classe \mintinline{java}{Comparateur}} + \inputminted{java}{td4/question2/Comparateur.java} + + \subsection{Code source de la classe \mintinline{java}{AlgoCodage}} + \inputminted{java}{td4/question2/AlgoCodage.java} + + \subsection{Code source de la classe \mintinline{java}{Cesar}} + \inputminted{java}{td4/question2/Cesar.java} + + \section{Utilisation d'un patron pour ajouter un algorithme existant} + Les classe \mintinline{java}{EncodeurAClef} ne possède pas les méthodes \mintinline{java}{encode} et \mintinline{java}{décode}, mais possède des méthodes \mintinline{java}{chiffre} et \mintinline{java}{déchiffre}. De plus il n'hérite pas de \mintinline{java}{AlgoCodage}. La solution est d'utiliser le patron adaptateur. + + La figure \ref{fig:rationalrose} montre le diagramme \bsc{UML} de l'application. + + \begin{figure}[h!] + \centering + \includegraphics[width=0.7\linewidth]{td4/question3/rational_rose} + \caption{Diagramme UML} + \label{fig:rationalrose} + \end{figure} + + Le code à ajouter dans la classe comparateur est alors: + \begin{minted}{java} + algoAComparer.add(new AdapteEncodeurAClef("mon secret")); + algoAComparer.add(new AdapteEncodeurAClef("")); + \end{minted} + + \section{Tests unitaires pour codage d'Huffman} + Code source de la classe \mintinline{java}{ArbreTest} : + \inputminted{java}{td4/question4/ArbreTest.java} + + \section{Documentation} + Code source de la classe Feuille : + \inputminted{java}{td4/question5/Feuille.java} + + \clearpage + \listoffigures +\end{document} \ No newline at end of file diff --git a/macroTL.tex b/macroTL.tex new file mode 100644 index 0000000..0df0bc2 --- /dev/null +++ b/macroTL.tex @@ -0,0 +1,40 @@ +%%% Macro TL +%% Documentclass +\documentclass[a4paper,titlepage]{article} + +%% Packages + +% Caractères et encodage +\usepackage[utf8]{inputenc} +\usepackage[francais]{babel} +\usepackage{amsmath,amsfonts,amssymb} + +% Tikz +\usepackage{tikz} +%\usepackage{tkz-tab} + +% Pour les circuits électriques +%\usepackage{cir­cuitikz} + +% Pour les figures +\usepackage{float} + +% Pour les tableaux +\usepackage{tabularx} + +% Pour les unités +\usepackage{siunitx} + +% Geometrie +\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry} + +% Pour le code +\usepackage{moreverb} + +% Pour les couleurs +\usepackage{colortbl} + +%% Commandes utiles +\usepackage{fancyhdr} +\pagestyle{fancy} + diff --git a/questioncomplementaire/AlgoCodage.java b/questioncomplementaire/AlgoCodage.java new file mode 100644 index 0000000..7faf04f --- /dev/null +++ b/questioncomplementaire/AlgoCodage.java @@ -0,0 +1,19 @@ +package questioncomplementaire; + +public abstract class AlgoCodage { + + protected String nom; + + public abstract String encode(String s); + + public abstract String decode(String s); + + public String getNom() { + return nom; + } + + @Override + public abstract String toString(); + + +} diff --git a/questioncomplementaire/Arbre.java b/questioncomplementaire/Arbre.java new file mode 100644 index 0000000..8e5acc3 --- /dev/null +++ b/questioncomplementaire/Arbre.java @@ -0,0 +1,82 @@ +package questioncomplementaire; + +import java.util.ArrayList; +import java.util.PriorityQueue; + +public abstract class Arbre implements Comparable { + final int frequence; + + /** + * @param frequence fréquence cumulée des feuilles de l'arbre + */ + public Arbre(int frequence) { + this.frequence = frequence; + } + + /** + * @param s chaîne encodée dans l'arbre + * @return un arbre des fréquences d'occurence des lettres de la chaîne + */ + public static Arbre buildTree(String s) { + // tableau de fréquence des caractères + // indexé par le code du caractère + // pour simplifier on fait l'hypothèse qu'aucun code n'est supérieur à 256 + int[] frequenceCaracteres = new int[256]; + + // parcourt la chaine génératrice et compte la fréquence de chaque caractère + for (char c : s.toCharArray()) + frequenceCaracteres[c]++; + + // liste des éléments + PriorityQueue lesElements = new PriorityQueue(); + + // au départ on a un ensemble d'arbres réduits chacun à feuille, une pour chaque caractère de la chaine génératrice, non reliés + //for (int i = 0; i < frequenceCaracteres.length; i++) + for (int i = 0; i < frequenceCaracteres.length ; i++) + if (frequenceCaracteres[i] > 0) + lesElements.offer(new Feuille(frequenceCaracteres[i], (char) i)); + + // on assemble les arbres petit à petit + // on arrête d'itérer lorsqu'il n'y a plus d'une seule racine + while (lesElements.size() > 1) { + // sélectionne les 2 arbres avec la fréquence la plus basse et les retire de la liste + Arbre a = lesElements.poll(); + Arbre b = lesElements.poll(); + // assemble les 2 arbres retirés et place le nouvel arbre en queue + lesElements.offer(new Noeud(a, b)); + } + return lesElements.poll(); + } + + // établit une relation d'ordre sur les arbres + public int compareTo(Arbre tree) { + return frequence - tree.frequence; + } + + /** + * @param prefixe chaîne constituant le préfixe des codes + * @return la liste des codes de Huffman pour chacune des feuilles de l'arbre + */ + public ArrayList collectCodes(StringBuffer prefixe) { + ArrayList lesCodes = new ArrayList(); + + if (this instanceof Feuille) { + Feuille leaf = (Feuille) this; + lesCodes.add(new HuffmanCode(leaf.lettre, prefixe.toString())); + + } else if (this instanceof Noeud) { + Noeud node = (Noeud) this; + + // traverse le fils gauche + prefixe.append('0'); + lesCodes.addAll(node.filsGauche.collectCodes(prefixe)); + prefixe.deleteCharAt(prefixe.length() - 1); + + // traverse le fils droit + prefixe.append('1'); + lesCodes.addAll(node.filsDroit.collectCodes(prefixe)); + prefixe.deleteCharAt(prefixe.length() - 1); + } + return lesCodes; + } +} diff --git a/questioncomplementaire/Cesar.java b/questioncomplementaire/Cesar.java new file mode 100644 index 0000000..5d7198b --- /dev/null +++ b/questioncomplementaire/Cesar.java @@ -0,0 +1,38 @@ +package questioncomplementaire; + +public class Cesar extends AlgoCodage{ + private int decalage; + private String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + public Cesar(int decalage){ + this.nom = "César"; + this.decalage = decalage; + } + + @Override + public String toString() { + return "codage de César (décalage=" + decalage + ")"; + } + + @Override + public String encode(String s) { + String encode = ""; + for(int i=0;i algoAComparer = new ArrayList(); + algoAComparer.add(new Cesar(3)); + algoAComparer.add(new Morse()); + algoAComparer.add(new Cesar(10)); + algoAComparer.add(new CodageAClef("mon secret")); + algoAComparer.add(new CodageAClef("")); + algoAComparer.add(new Huffman(texteClair)); + + String encodee = ""; + for (AlgoCodage algo : algoAComparer) { + out.println("algorithme : " + algo.toString()); + long avant = System.currentTimeMillis(); + encodee = algo.encode(texteClair); + long apres = System.currentTimeMillis(); + long duree = apres - avant; + out.println("\tencodage : " + + "\t durée : " + + duree + + "\t résultat : " + + encodee.substring(0, Math.min(50, encodee.length()))); + avant = System.currentTimeMillis(); + String decodee = algo.decode(encodee); + apres = System.currentTimeMillis(); + duree = apres - avant; + out.println("\tdécodage : " + + "\t durée : " + + duree + + "\t résultat : " + + decodee.substring(0, Math.min(50, decodee.length()))); + } + out.close(); + } +} diff --git a/questioncomplementaire/Feuille.java b/questioncomplementaire/Feuille.java new file mode 100644 index 0000000..1beaf91 --- /dev/null +++ b/questioncomplementaire/Feuille.java @@ -0,0 +1,37 @@ +package questioncomplementaire; + +/** + * @author galtier + * + * Cette classe représente une feuille d'un arbre de Huffman. + * + */ + +public class Feuille extends Arbre { + final char lettre; + + /** + * @param frequence nombre d'occurences de cette lettre dans le générateur + * @param lettre caractère dont on compte le nombre d'occurences + */ + public Feuille(int frequence, char lettre) { + super(frequence); + this.lettre = lettre; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Feuille other = (Feuille) obj; + if ((lettre != other.lettre) || (this.frequence != other.frequence)) + return false; + return true; + } + + +} \ No newline at end of file diff --git a/questioncomplementaire/Huffman.java b/questioncomplementaire/Huffman.java new file mode 100644 index 0000000..cd6d6d4 --- /dev/null +++ b/questioncomplementaire/Huffman.java @@ -0,0 +1,54 @@ +package questioncomplementaire; + +import java.util.ArrayList; + +public class Huffman extends AlgoCodage { + private String generatrice; + private ArrayList codes; + private Arbre arbre; + + public Huffman(String generatrice) { + this.generatrice = generatrice; + arbre = Arbre.buildTree(generatrice); + codes = arbre.collectCodes(new StringBuffer("")); + + } + + @Override + public String encode(String s) { + String encode = s; + for (HuffmanCode huffmanCode : codes) { + encode = encode.replaceAll( + String.valueOf(huffmanCode.lettre), huffmanCode.code); + } + return encode; + + } + + @Override + public String decode(String s) { + String decode = ""; + Arbre current = arbre; + for (int i=0; i decoder; + + public Morse(){ + this.nom = "Morse"; + alphabet = new String[] { + ".-", "-...", "-.-.", "-..", ".", "..-.", + "--.", "....", "..", ".---", "-.-", ".-..", + "--", "-.", "---", ".--.", "--.-", ".-.", + "...", "-", "..-", "...-", ".--", "-..-", + "-.--", "--.." + }; + decoder = new HashMap(); + int a = 65; + for (int i = 0; i < alphabet.length; i++) { + decoder.put(alphabet[i], String.valueOf((char)(a+i))); + } + } + + @Override + public String toString() { + return "Morse"; + } + + @Override + public String encode(String s) { + String encode = ""; + int a = 65; // Code ASCII de A + for (int i = 0; i < s.length(); i++) { + encode += alphabet[(int)s.charAt(i)-a] + "/"; + } + return encode; + } + + @Override + public String decode(String s) { + String decode = ""; + int a = 65; // Code ASCII de A + String[] lettres = s.split("/"); + for (int i = 0; i < lettres.length; i++) { + decode += decoder.get(lettres[i]); + } + return decode; + } +} diff --git a/questioncomplementaire/Noeud.java b/questioncomplementaire/Noeud.java new file mode 100644 index 0000000..68ee6c5 --- /dev/null +++ b/questioncomplementaire/Noeud.java @@ -0,0 +1,22 @@ +package questioncomplementaire; + +/** + * @author galtier + * + * Cette classe représente un noeud d'un arbre de Huffman. + * + */ +public class Noeud extends Arbre { + final Arbre filsGauche, filsDroit; + + /** + * + * @param filsGauche fils gauche du noeud + * @param filsDroit fils droit du noeud + */ + public Noeud(Arbre filsGauche, Arbre filsDroit) { + super(filsGauche.frequence + filsDroit.frequence); + this.filsGauche = filsGauche; + this.filsDroit = filsDroit; + } +} \ No newline at end of file diff --git a/questioncomplementaire/Utilitaire.java b/questioncomplementaire/Utilitaire.java new file mode 100644 index 0000000..eb367cb --- /dev/null +++ b/questioncomplementaire/Utilitaire.java @@ -0,0 +1,46 @@ +package questioncomplementaire; + +import java.io.BufferedReader; +import java.io.FileReader; + +/** + * @author galtier + * + */ +public class Utilitaire { + + /** + * Lit un fichier texte et place les caractères lus dans une chaîne de + * caractères. + * + * @param nomFichier + * le nom complet du fichier à lire + * @return une chaine de caractères contenant le texte lu dans le fichier. + * Si le fichier n'existe pas ou ne peut pas être lu, retourne null. + * + */ + public static String lireTexte(String nomFichier) { + try { + String texte = ""; + FileReader fr = new FileReader(nomFichier); + BufferedReader br = new BufferedReader(fr); + String ligne; + while ((ligne = br.readLine()) != null) + texte += ligne + "\n"; + return texte; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * Supprime tous les caractères qui ne sont pas des lettres + * et met les autres en majuscules. + * @param input La chaîne à traîter. + * @return La chaîne de caractères traîtée. + */ + public static String getLettres(String input) { + return input.replaceAll("[^a-zA-Z]*", "").toUpperCase(); + } +} diff --git a/td4/question1/comparateur.java b/td4/question1/comparateur.java new file mode 100644 index 0000000..ecab0f7 --- /dev/null +++ b/td4/question1/comparateur.java @@ -0,0 +1,10 @@ +package question1; + +public class Comparateur { + + public static void main(String[] args) { + String nomFichier = "texte2.txt"; + String txt = Utilitaire.lireTexte(nomFichier); + System.out.println(txt); + } +} diff --git a/td4/question2/AlgoCodage.java b/td4/question2/AlgoCodage.java new file mode 100644 index 0000000..0032d3e --- /dev/null +++ b/td4/question2/AlgoCodage.java @@ -0,0 +1,16 @@ +package question2; + +public abstract class AlgoCodage { + + protected String nom; + + public abstract String encode(String s); + + public abstract String decode(String s); + + public String getNom() { + return nom; + } + + +} diff --git a/td4/question2/Cesar.java b/td4/question2/Cesar.java new file mode 100644 index 0000000..f0bc37b --- /dev/null +++ b/td4/question2/Cesar.java @@ -0,0 +1,30 @@ +package question2; + +public class Cesar extends AlgoCodage{ + + private int decalage; + private String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + public Cesar(int decalage){ + this.nom = "César"; + this.decalage = decalage; + } + + @Override + public String encode(String s) { + String encode = ""; + for(int i=0;i algoAComparer = new ArrayList(); + algoAComparer.add(new Cesar(3)); + algoAComparer.add(new Morse()); + algoAComparer.add(new Cesar(10)); + + String encodee = ""; + for (AlgoCodage algo : algoAComparer) { + System.out.println("algorithme : " + algo.getNom()); + encodee = algo.encode(texteClair); + System.out.println("\tencodage : " + + "\t résultat : " + + encodee.substring(0, Math.min(50, encodee.length()))); + + String decodee = algo.decode(encodee); + System.out.println("\tdécodage : " + + "\t résultat : " + + decodee.substring(0, Math.min(50, decodee.length()))); + } + } +} diff --git a/td4/question2/Morse.java b/td4/question2/Morse.java new file mode 100644 index 0000000..b46dd55 --- /dev/null +++ b/td4/question2/Morse.java @@ -0,0 +1,19 @@ +package question2; + +public class Morse extends AlgoCodage{ + + public Morse(){ + this.nom = "Morse"; + } + + @Override + public String encode(String s) { + return "Fonctionnalité encodage de Morse pas encore implémentée"; + } + + @Override + public String decode(String s) { + return "Fonctionnalité décodage de Morse pas encore implémentée"; + } + +} diff --git a/td4/question3/rational_rose.png b/td4/question3/rational_rose.png new file mode 100644 index 0000000..a0511ef Binary files /dev/null and b/td4/question3/rational_rose.png differ diff --git a/td4/question4/ArbreTest.java b/td4/question4/ArbreTest.java new file mode 100644 index 0000000..cefeed7 --- /dev/null +++ b/td4/question4/ArbreTest.java @@ -0,0 +1,41 @@ +package question4; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +public class ArbreTest { + + Arbre arbre1; + Arbre arbre2; + + @Before + public void setup() throws Exception{ + arbre1 = Arbre.buildTree("a"); + + arbre2 = Arbre.buildTree("baob"); + } + + @Test + public void testBuildTree() { + assertEquals("La lettre n'est pas dans une feuille simple", + ((Feuille)arbre1).lettre, 'a'); + assertEquals("La fréquence est mauvaise dans une feuille simple", + ((Feuille)arbre1).frequence, 1 ); + + assertEquals(arbre2.frequence, 4 ); + Feuille feuilleB = (Feuille)((Noeud)arbre2).filsGauche; + assertEquals(feuilleB.frequence, 2); + assertEquals(feuilleB.lettre, 'b'); + Noeud noeudDroit = (Noeud)((Noeud)arbre2).filsDroit; + assertEquals(noeudDroit.frequence, 2); + Feuille feuilleA = (Feuille)noeudDroit.filsGauche; + assertEquals(feuilleA.lettre, 'a'); + assertEquals(feuilleA.frequence, 1); + Feuille feuilleO = (Feuille)noeudDroit.filsDroit; + assertEquals(feuilleO.lettre, 'o'); + assertEquals(feuilleO.frequence, 1); + } + +} diff --git a/td4/question5/Feuille.java b/td4/question5/Feuille.java new file mode 100644 index 0000000..23a80a9 --- /dev/null +++ b/td4/question5/Feuille.java @@ -0,0 +1,36 @@ +package question5; + +/** + * Cette classe représente une feuille d'un arbre de Huffman. + * @author galtier + * + */ +public class Feuille extends Arbre { + final char lettre; + + /** + * + * @param frequence nombre d'occurrences de cette lettre dans le générateur + * @param lettre caractère dont on compte le nombre d'occurences + */ + public Feuille(int frequence, char lettre) { + super(frequence); + this.lettre = lettre; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Feuille other = (Feuille) obj; + if ((lettre != other.lettre) || (this.frequence != other.frequence)) + return false; + return true; + } + + +} diff --git a/truc b/truc new file mode 100644 index 0000000..1014ffc --- /dev/null +++ b/truc @@ -0,0 +1,401 @@ + + + + + umbrello uml modeller http://umbrello.kde.org + 1.6.12 + UnicodeUTF8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +