Renommages pour consignes & début implémentation buildTree

This commit is contained in:
Mattéo Delabre 2016-10-06 18:43:57 +02:00
parent 6a109dd796
commit 9a48ee6a5e
11 changed files with 104 additions and 41 deletions

View File

@ -3,11 +3,11 @@ FLAGS=-Wall -std=c99
SRC=src
PROG=compress
all: $(SRC)/main.o $(SRC)/freq.o
all: $(SRC)/main.o $(SRC)/huf.o
$(CC) $^ $(FLAGS) -o $(PROG)
%.o: %.cpp
$(CC) $(FLAGS) -c $^
camille:
rm -f $(PROG) *.o *.gch
rm -f $(PROG) **/*.o **/*.gch

BIN
compress Executable file

Binary file not shown.

28
include/huf.h Normal file
View File

@ -0,0 +1,28 @@
#ifndef __FREQ_H__
#define __FREQ_H__
typedef struct Vertex Vertex;
struct Vertex {
// le double `freq` indique la fréquence d'apparition de la lettre
// du sommet dans le corpus, ou bien la somme des fréquences de ses fils
double frequency;
// le caractère `value` est le caractère du corpus que ce sommet
// représente (caractère ASCII 0 - 255)
char value;
// pointe vers le sommet parent à celui-ci (ou bien vers NULL s'il n'a
// pas de parent affecté, comme c'est le cas pour les sommets non-traités
// et pour la racine)
Vertex* parent;
};
// calcule un tableau des fréquences des caractères dans le corpus,
// indexé par la valeur numérique ASCII de chaque caractère
double* computeFrequencies(const char* filepath);
// déduit du tableau de fréquences l'arbre de Huffman, représenté
// par une liste de sommets chaînés
Vertex* buildTree(double* frequencies);
#endif

9
main.c
View File

@ -1,9 +0,0 @@
#include "freq.h"
#include <stdio.h>
int main(int argc, char** argv) {
if (argc != 2) {
printf("Usage : compress <fichier>\n")
printf("Paramètre fichier manquant.\n");
}
}

View File

@ -1,29 +0,0 @@
#include "freq.h"
#include <stdlib.h>
#include <stdio.h>
double* computeFreq(const char* filepath) {
double* freq = (double*) malloc(256 * sizeof(double));
int totalChars = 0;
// initialisation du tableau à 0
for (int i = 0; i < 256; i++) {
freq[i] = 0;
}
// parcours du fichier et comptage des caractères
FILE* file = fopen(filepath, "r");
char current;
while ((current = fgetc(file)) != EOF) {
freq[(size_t) current]++;
totalChars++;
}
// conversion des effectifs en fréquences
for (int i = 0; i < 256; i++) {
freq[i] /= totalChars;
}
return freq;
}

View File

@ -1 +0,0 @@
double* computeFreq(const char* filepath);

Binary file not shown.

50
src/huf.c Normal file
View File

@ -0,0 +1,50 @@
#include "../include/huf.h"
#include <stdlib.h>
#include <stdio.h>
double* computeFrequencies(const char* filepath) {
double* frequencies = (double*) malloc(256 * sizeof(double));
int totalChars = 0;
// initialisation du tableau à 0
for (int i = 0; i < 256; i++) {
frequencies[i] = 0;
}
// parcours du fichier et comptage des caractères
FILE* file = fopen(filepath, "r");
char current;
while ((current = fgetc(file)) != EOF) {
frequencies[(size_t) current]++;
totalChars++;
}
// conversion des effectifs en fréquences
for (int i = 0; i < 256; i++) {
frequencies[i] /= totalChars;
}
return frequencies;
}
Vertex* buildTree(double* frequencies) {
int vertexCount = 0;
// on compte le nombre de sommets à allouer
// (uniquement les caractères qui apparaissent au moins une fois)
for (int i = 0; i < 256; i++) {
if (frequencies[i] > 0) {
vertexCount++;
}
}
// on alloue la place pour 2n + 1 sommets (nombre total
// de sommets dans l'arbre binaire)
Vertex* tree = (Vertex*) malloc((2 * vertexCount - 1) * sizeof(Vertex));
// (à faire: algo pour remplir l'arbre)
// (trier le tableau des fréquences ?)
return tree;
}

BIN
src/huf.o Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
#include "../include/huf.h"
#include <stdio.h>
int main(int argc, const char** argv) {
if (argc != 2) {
printf("Usage : compress <fichier>\n");
printf("Paramètre fichier manquant.\n");
return 1;
}
double* frequencies = computeFrequencies(argv[1]);
double sum = 0;
for (int i = 0; i < 256; i++) {
if (frequencies[i] != 0) {
sum += frequencies[i];
printf("%c (%d) : %f\n", i, i, frequencies[i]);
}
}
printf("Total : %f\n", sum);
return 0;
}

Binary file not shown.