Restructuration de la sortie verbeuse
This commit is contained in:
parent
59b20e9321
commit
5fc433cf56
|
@ -2,6 +2,7 @@
|
||||||
#define __IN303_DISPLAY_H__
|
#define __IN303_DISPLAY_H__
|
||||||
|
|
||||||
#include "huftree.h"
|
#include "huftree.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Afficher sur la sortie standard l'arbre passé
|
* Afficher sur la sortie standard l'arbre passé
|
||||||
|
@ -9,4 +10,16 @@
|
||||||
*/
|
*/
|
||||||
void printTree(HufTree tree);
|
void printTree(HufTree tree);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Afficher sur la sortie standard le tableau associant les caractères
|
||||||
|
* à leur fréquence d'apparition passé en argument
|
||||||
|
*/
|
||||||
|
void printFrequenciesTable(double*, size_t);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Afficher sur la sortie standard le tableau associant les caractères
|
||||||
|
* à leur étiquette passé en argument
|
||||||
|
*/
|
||||||
|
void printLabelsTable(char**, size_t);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -42,42 +42,31 @@ double* _createFrequencies(const char *filepath) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void compress(const char *filepath) {
|
void compress(const char *filepath) {
|
||||||
|
printVerbose("Calcul des fréquences d'apparition de chaque caractère\n");
|
||||||
double *frequencies = _createFrequencies(filepath);
|
double *frequencies = _createFrequencies(filepath);
|
||||||
|
|
||||||
if (IS_VERBOSE) {
|
if (isVerbose()) {
|
||||||
printf("--- 1 : CALCUL DES FRÉQUENCES ---\n\n");
|
printFrequenciesTable(frequencies, NUM_CHARS);
|
||||||
double sum = 0;
|
|
||||||
|
|
||||||
for (size_t i = 0; i < NUM_CHARS; i++) {
|
|
||||||
if (frequencies[i] != 0) {
|
|
||||||
sum += frequencies[i];
|
|
||||||
printf("%1c (%3d) : %4f\n", (int) i, (int) i, frequencies[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("Total : %f\n\n", sum);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printVerbose("\nConstruction de l'arbre de Huffman\n");
|
||||||
HufTree tree = createTree(frequencies);
|
HufTree tree = createTree(frequencies);
|
||||||
|
|
||||||
if (IS_VERBOSE) {
|
free(frequencies);
|
||||||
printf("--- 2 : CONSTRUCTION DE L'ARBRE ---\n\n");
|
frequencies = NULL;
|
||||||
printf("Arbre à %zu sommets\n\n", tree.size);
|
|
||||||
|
if (isVerbose()) {
|
||||||
printTree(tree);
|
printTree(tree);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printVerbose("\nÉtiquetage des feuilles de l'arbre\n");
|
||||||
char** labels = createTreeLabels(tree);
|
char** labels = createTreeLabels(tree);
|
||||||
|
|
||||||
if (IS_VERBOSE) {
|
freeTree(tree);
|
||||||
printf("\n\n--- 3 : ATTRIBUTION DES CODES ---\n\n");
|
|
||||||
for (size_t i = 0; i < NUM_CHARS; i++) {
|
if (isVerbose()) {
|
||||||
if (labels[i] != NULL) {
|
printLabelsTable(labels, NUM_CHARS);
|
||||||
printf("%1c (%3d) : %s\n", (int) i, (int) i, labels[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
free(frequencies);
|
|
||||||
freeTree(tree);
|
|
||||||
freeTreeLabels(labels);
|
freeTreeLabels(labels);
|
||||||
}
|
}
|
||||||
|
|
125
src/display.c
125
src/display.c
|
@ -1,48 +1,115 @@
|
||||||
#include "../include/display.h"
|
#include "../include/display.h"
|
||||||
#include "../include/common.h"
|
#include "../include/common.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <locale.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Détermine la profondeur de l'arbre binaire
|
||||||
|
* à partir du sommet donné
|
||||||
|
*/
|
||||||
|
static int _maxDepth(HufVertex);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Affiche l'arborescence à partir du sommet donné,
|
* Affiche l'arborescence à partir du sommet donné,
|
||||||
* indenté sur le niveau donné
|
* indenté sur le niveau donné
|
||||||
*/
|
*/
|
||||||
static void _printVertex(HufVertex, int level, int is_first);
|
static void _printVertex(HufVertex, wchar_t*, int);
|
||||||
|
|
||||||
void _printVertex(HufVertex vert, int level, int is_first) {
|
/**
|
||||||
// affichage des n espaces d'indentation
|
* Transforme le caractère donné en espace s'il est
|
||||||
for (int i = 0; i < level; i++) {
|
* non-imprimable, ou le laisse tel quel sinon
|
||||||
if (i < level - 1) {
|
*/
|
||||||
printf("│ ");
|
static char _safeChar(char input);
|
||||||
} else {
|
|
||||||
printf("├───");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
void _printVertex(HufVertex vert, wchar_t *buffer, int length) {
|
||||||
if (vert.child_l != NULL && vert.child_r != NULL) {
|
if (vert.child_l != NULL && vert.child_r != NULL) {
|
||||||
// affichage d'un noeud contenant des enfants
|
// Affichage d'un sommet avec enfants, on montre
|
||||||
// un tel noeud n'a pas de nom, on utilise un caractère
|
// la probabilité somme des enfants
|
||||||
// selon sa position
|
printf("■\n", vert.frequency);
|
||||||
const char *name;
|
|
||||||
|
|
||||||
if (level == 0) {
|
// Affichage du fils gauche. Augmentation du préfixe
|
||||||
name = "▅";
|
// pour l'affichage des enfants du fils gauche
|
||||||
} else {
|
buffer[length] = '\0';
|
||||||
if (is_first) {
|
printf("%ls├── ", buffer);
|
||||||
name = "┬";
|
|
||||||
} else {
|
|
||||||
name = "┼";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("%s (%4f)\n", name, vert.frequency);
|
buffer[length] = L'│';
|
||||||
_printVertex(*vert.child_l, level + 1, TRUE);
|
buffer[length + 1] = ' ';
|
||||||
_printVertex(*vert.child_r, level + 1, FALSE);
|
buffer[length + 2] = ' ';
|
||||||
|
buffer[length + 3] = ' ';
|
||||||
|
buffer[length + 4] = '\0';
|
||||||
|
_printVertex(*vert.child_l, buffer, length + 4);
|
||||||
|
|
||||||
|
// Affichage du fils droite. Augmentation du préfixe
|
||||||
|
// pour l'affichage des enfants du fils droit
|
||||||
|
buffer[length] = '\0';
|
||||||
|
printf("%ls└── ", buffer);
|
||||||
|
|
||||||
|
buffer[length] = ' ';
|
||||||
|
_printVertex(*vert.child_r, buffer, length + 4);
|
||||||
} else {
|
} else {
|
||||||
// c'est une feuille, affichage du sommet
|
// Affichage d'une feuille de l'arbre, correspondant
|
||||||
printf("%c (%4f)\n", vert.character, vert.frequency);
|
// à un caractère du corpus
|
||||||
|
printf("%c\n", vert.character, vert.frequency);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int _maxDepth(HufVertex vert) {
|
||||||
|
if (vert.child_l != NULL && vert.child_r != NULL) {
|
||||||
|
int left = _maxDepth(*vert.child_l);
|
||||||
|
int right = _maxDepth(*vert.child_r);
|
||||||
|
|
||||||
|
return (left > right ? left : right) + 1;
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void printTree(HufTree tree) {
|
void printTree(HufTree tree) {
|
||||||
_printVertex(*tree.root, 0, TRUE);
|
// Allocation d'un tampon suffisamment grand pour contenir
|
||||||
|
// les indentations des sommets les plus profonds de l'arbre
|
||||||
|
wchar_t *buffer = malloc(_maxDepth(*tree.root) * 4 * sizeof(*buffer));
|
||||||
|
_printVertex(*tree.root, buffer, 0);
|
||||||
|
free(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
char _safeChar(char input) {
|
||||||
|
if (input < 32 || input == 127) {
|
||||||
|
return ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
return input;
|
||||||
|
}
|
||||||
|
|
||||||
|
void printFrequenciesTable(double* table, size_t size) {
|
||||||
|
printf("╭─┬───┬─────────╮\n");
|
||||||
|
printf("│C│num│fréquence│\n");
|
||||||
|
printf("├─┼───┼─────────┤\n");
|
||||||
|
|
||||||
|
double sum = 0;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < size; i++) {
|
||||||
|
if (table[i] != 0) {
|
||||||
|
printf("│%c│%3d│%9lf│\n", _safeChar(i), (int) i, table[i]);
|
||||||
|
sum += table[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("├─┴───┼─────────┤\n");
|
||||||
|
printf("│Total│%9lf│\n", sum);
|
||||||
|
printf("╰─────┴─────────╯\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void printLabelsTable(char** table, size_t size) {
|
||||||
|
printf("╭─┬───┬────────────────╮\n");
|
||||||
|
printf("│C│num│ étiquette│\n");
|
||||||
|
printf("├─┼───┼────────────────┤\n");
|
||||||
|
|
||||||
|
for (size_t i = 0; i < size; i++) {
|
||||||
|
if (table[i] != 0) {
|
||||||
|
printf("│%c│%3d│%16s│\n", _safeChar(i), (int) i, table[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("╰─┴───┴────────────────╯\n");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue