Renommages pour consignes & début implémentation buildTree
This commit is contained in:
		
							parent
							
								
									6a109dd796
								
							
						
					
					
						commit
						9a48ee6a5e
					
				
							
								
								
									
										4
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										4
									
								
								Makefile
								
								
								
								
							|  | @ -3,11 +3,11 @@ FLAGS=-Wall -std=c99 | ||||||
| SRC=src | SRC=src | ||||||
| PROG=compress | PROG=compress | ||||||
| 
 | 
 | ||||||
| all: $(SRC)/main.o $(SRC)/freq.o | all: $(SRC)/main.o $(SRC)/huf.o | ||||||
| 	$(CC) $^ $(FLAGS) -o $(PROG) | 	$(CC) $^ $(FLAGS) -o $(PROG) | ||||||
| 
 | 
 | ||||||
| %.o: %.cpp | %.o: %.cpp | ||||||
| 	$(CC) $(FLAGS) -c $^ | 	$(CC) $(FLAGS) -c $^ | ||||||
| 
 | 
 | ||||||
| camille: | camille: | ||||||
| 	rm -f $(PROG) *.o *.gch | 	rm -f $(PROG) **/*.o **/*.gch | ||||||
|  |  | ||||||
|  | @ -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
								
								
								
								
							
							
						
						
									
										9
									
								
								main.c
								
								
								
								
							|  | @ -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"); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
							
								
								
									
										29
									
								
								src/freq.c
								
								
								
								
							
							
						
						
									
										29
									
								
								src/freq.c
								
								
								
								
							|  | @ -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; |  | ||||||
| } |  | ||||||
|  | @ -1 +0,0 @@ | ||||||
| double* computeFreq(const char* filepath); |  | ||||||
							
								
								
									
										
											BIN
										
									
								
								src/freq.o
								
								
								
								
							
							
						
						
									
										
											BIN
										
									
								
								src/freq.o
								
								
								
								
							
										
											Binary file not shown.
										
									
								
							|  | @ -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; | ||||||
|  | } | ||||||
							
								
								
									
										24
									
								
								src/main.c
								
								
								
								
							
							
						
						
									
										24
									
								
								src/main.c
								
								
								
								
							|  | @ -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; | ||||||
|  | } | ||||||
							
								
								
									
										
											BIN
										
									
								
								src/main.o
								
								
								
								
							
							
						
						
									
										
											BIN
										
									
								
								src/main.o
								
								
								
								
							
										
											Binary file not shown.
										
									
								
							
		Loading…
	
		Reference in New Issue