Commit 1e4b8b9c3e5da1050b05ebab15fe5ca2dfd3a029

Authored by grouille
1 parent 674eb93a

Code complet commenté

Showing 4 changed files with 212 additions and 201 deletions   Show diff stats
@@ -10,8 +10,8 @@ int main(int argc, char *argv[]) @@ -10,8 +10,8 @@ int main(int argc, char *argv[])
10 { 10 {
11 init_pgrm(); 11 init_pgrm();
12 Node tree = NULL; 12 Node tree = NULL;
13 - int error = 0;  
14 - int correct = 0; 13 + int error = 0; // compteur d'erreurs
  14 + int correct = 0; // compteur de corrections effectuées
15 FILE* fp_lib; 15 FILE* fp_lib;
16 FILE* fp_txt; 16 FILE* fp_txt;
17 17
@@ -21,8 +21,8 @@ int main(int argc, char *argv[]) @@ -21,8 +21,8 @@ int main(int argc, char *argv[])
21 return EXIT_FAILURE; 21 return EXIT_FAILURE;
22 } 22 }
23 23
24 - fp_lib = fopen(argv[argc-2], "r");  
25 - fp_txt = fopen(argv[argc-1], "r+"); 24 + fp_lib = fopen(argv[argc-2], "r"); // ouverture du fichier bibliothèque en mode lecture
  25 + fp_txt = fopen(argv[argc-1], "r+"); // ouverture du fichier à analyser en mode lecture/écriture
26 26
27 if(fp_lib==NULL || fp_txt==NULL) 27 if(fp_lib==NULL || fp_txt==NULL)
28 { 28 {
@@ -30,22 +30,24 @@ int main(int argc, char *argv[]) @@ -30,22 +30,24 @@ int main(int argc, char *argv[])
30 return EXIT_FAILURE; 30 return EXIT_FAILURE;
31 } 31 }
32 32
33 - init_tree(&tree);  
34 - read_lib(fp_lib, &tree);  
35 - read_txt(fp_txt, &tree, &error, &correct); 33 + init_tree(&tree); // initialisation de l'arbre indexé
  34 + read_lib(fp_lib, &tree); // lecture de la bibliothèque
  35 + read_txt(fp_txt, &tree, &error, &correct); // analyse du fichier et corrections éventuelles
36 36
37 // Si vous souhaitez imprimer l'arbre indexé complet : 37 // Si vous souhaitez imprimer l'arbre indexé complet :
38 //char word[MAX] = ""; 38 //char word[MAX] = "";
39 //print_tree(tree, 0, word); 39 //print_tree(tree, 0, word);
40 40
  41 + // Impression du nombre d'erreurs
41 if(error<2) printf("Dans le texte %s, %d mot n'est pas dans le dictionnaire %s.\n", argv[argc-1], error, argv[argc-2]); 42 if(error<2) printf("Dans le texte %s, %d mot n'est pas dans le dictionnaire %s.\n", argv[argc-1], error, argv[argc-2]);
42 else printf("Dans le texte %s, %d mots ne sont pas dans le dictionnaire %s.\n", argv[argc-1], error, argv[argc-2]); 43 else printf("Dans le texte %s, %d mots ne sont pas dans le dictionnaire %s.\n", argv[argc-1], error, argv[argc-2]);
43 44
  45 + // Impression du nombre de corrections
44 if(correct<2) printf("%d a été corrigé.\n", correct); 46 if(correct<2) printf("%d a été corrigé.\n", correct);
45 else printf("%d ont été corrigés.\n", correct); 47 else printf("%d ont été corrigés.\n", correct);
46 48
47 - free_tree(&tree);  
48 - fclose(fp_lib); 49 + free_tree(&tree); // Libération de l'espace mémoire
  50 + fclose(fp_lib); // Fermeture des fichiers texte
49 fclose(fp_txt); 51 fclose(fp_txt);
50 return EXIT_SUCCESS; 52 return EXIT_SUCCESS;
51 } 53 }
@@ -6,7 +6,7 @@ The ant and the cicada @@ -6,7 +6,7 @@ The ant and the cicada
6 6
7 In the summer, the ant families were very busy. They knew that in the winter they would have to stay in their anthill. They wanted to have enough food for the whole winter. 7 In the summer, the ant families were very busy. They knew that in the winter they would have to stay in their anthill. They wanted to have enough food for the whole winter.
8 8
9 - While the ants worked hard, the cicadas didn't do anything. They sang and danced all day. When they were hungry, they coud fly to the farm and get something to eat. 9 + While the ants worked hard, the cicadas didn't do anything. They sang and danced all day. When they were hungry, they could fly to the farm and get something to eat.
10 10
11 One day the cicadas were singing and dancing. They saw a long line of ants bringing food to their anthill. The cicadas said, Stop, my silly friends. It's a very nice day. Come and dance with us. The ants said, Don't you know about winter? If you don't work now, you'll have trouble later. 11 One day the cicadas were singing and dancing. They saw a long line of ants bringing food to their anthill. The cicadas said, Stop, my silly friends. It's a very nice day. Come and dance with us. The ants said, Don't you know about winter? If you don't work now, you'll have trouble later.
12 12
@@ -24,3 +24,7 @@ The ant and the cicada @@ -24,3 +24,7 @@ The ant and the cicada
24 24
25 25
26 26
  27 +
  28 +
  29 +
  30 +
@@ -27,7 +27,7 @@ void init_tree(Node* Tree) @@ -27,7 +27,7 @@ void init_tree(Node* Tree)
27 if(is_empty_tree(*Tree)) 27 if(is_empty_tree(*Tree))
28 { 28 {
29 *Tree = malloc(sizeof(node)); 29 *Tree = malloc(sizeof(node));
30 - (*Tree)->letter = 7; // 30 + (*Tree)->letter = 7; // caractère sans utilité
31 (* Tree)->endWord = false; 31 (* Tree)->endWord = false;
32 for(int i=0; i<NB_CARAC; i++) 32 for(int i=0; i<NB_CARAC; i++)
33 (*Tree)->next[i] = NULL; // initialisation du tableau 'next' à un tableau de pointeurs NULL 33 (*Tree)->next[i] = NULL; // initialisation du tableau 'next' à un tableau de pointeurs NULL
@@ -35,13 +35,11 @@ void init_tree(Node* Tree) @@ -35,13 +35,11 @@ void init_tree(Node* Tree)
35 } 35 }
36 36
37 // Détermine l'indice de rangement dans le tableau 'next' du caractère 'letter' 37 // Détermine l'indice de rangement dans le tableau 'next' du caractère 'letter'
38 -int find_caract_indice(char letter) // Ne fonctionne pas pour les caractères accentués 38 +int find_caract_indice(char letter)
39 { 39 {
40 - //printf("__%d__\n", letter);  
41 if(letter>=97 && letter<=122) return letter-'a'; 40 if(letter>=97 && letter<=122) return letter-'a';
42 if(letter>=65 && letter<=90) return letter-'A'; 41 if(letter>=65 && letter<=90) return letter-'A';
43 if(letter == 39) return letter-13; // l'apostrophe est placée en 27ème position 42 if(letter == 39) return letter-13; // l'apostrophe est placée en 27ème position
44 - //if(letter>=192) {printf("%d", letter-166); return letter-166;} //-192+26  
45 } 43 }
46 44
47 // Fonction d'ajout d'un mot 'word' dans la structure 'tree' de type 'arbre indexé' 45 // Fonction d'ajout d'un mot 'word' dans la structure 'tree' de type 'arbre indexé'
@@ -52,38 +50,34 @@ void add_in_tree(Node Tree, char word[]) @@ -52,38 +50,34 @@ void add_in_tree(Node Tree, char word[])
52 Node Tree2 = Tree; 50 Node Tree2 = Tree;
53 while(word[j] != '\0') // on parcourt tout le mot 'word' 51 while(word[j] != '\0') // on parcourt tout le mot 'word'
54 { 52 {
55 - /*if(is_leaf(Tree2)) // a retirer  
56 - printf("empty\t");*/  
57 char letter = word[j]; 53 char letter = word[j];
58 - ind = find_caract_indice(letter);  
59 - if(Tree2->next[ind]!=NULL) // si le pointeur du tableau 'next' corresdant au caractère lu n'est pas NULL, on s'insère dans cette 'branche' de l'arbre indexé et on continue avec le caractère suivant 54 + ind = find_caract_indice(letter); // on récupère l'indice de rangement de 'letter'
  55 +
  56 + if(Tree2->next[ind]!=NULL) // si le pointeur du tableau 'next' correspondant au caractère lu n'est pas NULL, on s'insère dans cette 'branche' de l'arbre indexé et on continue avec le caractère suivant
60 { 57 {
61 Tree2 = Tree2->next[ind]; 58 Tree2 = Tree2->next[ind];
62 - /* printf("%c %d\t", letter, ind);  
63 - printf("okA %d\n", j);*/  
64 } 59 }
65 else // sinon, on ajoute une nouvelle cellule de type 'struct node' et on y insère les informations concernant le caractères 60 else // sinon, on ajoute une nouvelle cellule de type 'struct node' et on y insère les informations concernant le caractères
66 { 61 {
67 Node new = NULL; 62 Node new = NULL;
68 new = malloc(sizeof(node)); 63 new = malloc(sizeof(node));
69 - new->letter = letter; // le caractère  
70 - for(int i=0; i<NB_CARAC; i++) // un tableau de pointeurs NULL 64 +
  65 + new->letter = letter;
  66 + for(int i=0; i<NB_CARAC; i++)
71 { 67 {
72 new->next[i]=NULL; 68 new->next[i]=NULL;
73 } 69 }
74 new->endWord = false; 70 new->endWord = false;
  71 +
75 Tree2->next[ind] = new; // on fait pointé le tableau du caractère précédent vers cette cellule (vers ce caractère) 72 Tree2->next[ind] = new; // on fait pointé le tableau du caractère précédent vers cette cellule (vers ce caractère)
76 - if(!(Tree2->endWord)) // si le caractère n'est pas un caractère de fin, on le met à 'false' -> UTILITE ? 73 + if(!(Tree2->endWord)) // si le caractère précédent n'est pas un caractère de fin, on lui donne la valeur 'false'
77 Tree2->endWord = false; 74 Tree2->endWord = false;
78 Tree2=Tree2->next[ind]; // on se place au niveau du caractère suivant dans l'arbre indexé 75 Tree2=Tree2->next[ind]; // on se place au niveau du caractère suivant dans l'arbre indexé
79 - /*printf("%c %d\t", letter, ind);  
80 - printf("okB %d\n", j);*/  
81 } 76 }
82 j++; 77 j++;
83 if(word[j]=='\0') // si le caractère suivant est la fin de la chaîne, on dit que le caractère précédent est un caractère de fin 78 if(word[j]=='\0') // si le caractère suivant est la fin de la chaîne, on dit que le caractère précédent est un caractère de fin
84 Tree2->endWord = true; 79 Tree2->endWord = true;
85 } 80 }
86 - //printf("ok\n");  
87 } 81 }
88 82
89 // Fonction qui détermine si le caractère est un caractère de fin de mot (espace, ',', ';', '.', etc..) 83 // Fonction qui détermine si le caractère est un caractère de fin de mot (espace, ',', ';', '.', etc..)
@@ -103,168 +97,172 @@ char max_index(char word[]) @@ -103,168 +97,172 @@ char max_index(char word[])
103 return index; 97 return index;
104 } 98 }
105 99
106 -void scan_word(Node Tree, char word[], int* error, FILE* fp_txt, int* correct) // si un mot démarre juste après un caractère de fin, la fonction ne lit pas les mots séparément 100 +// Fonction qui scanne les mots du fichier à vérifier et les analyse
  101 +void scan_word(Node Tree, char word[], int* error, FILE* fp_txt, int* correct)
107 { 102 {
108 - bool endWord = false;  
109 - bool stop = false;  
110 - int ind = 0;  
111 - int indice; 103 + bool endWord = false; // true : le caractère est un caractère de fin, false : le caractère n'est pas un caractère de fin
  104 + bool stop = false; // permet de ne pas compte 2 fois certaines erreurs
  105 + int ind = 0; // indice dans le mot 'word'
  106 + int indice; // indice de rangement de letter dans le tableau 'next'
112 char letter; 107 char letter;
113 Node Tree2 = Tree; 108 Node Tree2 = Tree;
114 - while(!is_end_caract(word[ind])) 109 + while(!is_end_caract(word[ind])) // si 'word[ind]' n'est pas un caractère de fin
115 { 110 {
116 stop = false; 111 stop = false;
117 letter = word[ind]; 112 letter = word[ind];
118 - indice = find_caract_indice(letter); 113 + indice = find_caract_indice(letter); // récupération de l'indice de rangement
119 114
120 - if(Tree2 != NULL && Tree2->next[indice]!=NULL) 115 + if(Tree2 != NULL && Tree2->next[indice]!=NULL) // si l'arbre n'est pas vide et que la case correspondant à la lettre dans l'arbre n'est pas vide
121 { 116 {
122 - ind++;  
123 - Tree2 = Tree2->next[indice]; 117 + ind++; // on passe à la lettre suivante
  118 + Tree2 = Tree2->next[indice]; // on se met dans la case de la lettre qui vient d'être vérifiée
124 endWord = Tree2->endWord; 119 endWord = Tree2->endWord;
125 } 120 }
126 else 121 else
127 { 122 {
128 - add_error(error, word, ind, Tree2, fp_txt, correct);  
129 - //printf("%d\n", ind);  
130 - ind = max_index(word);  
131 - //printf("%d\n", ind); 123 + add_error(error, word, ind, Tree2, fp_txt, correct); // si l'abre est vide ou que la case de l'arbre correspondant à la lettre est vide, on ajoute une erreur
  124 + ind = max_index(word); // on se place à la fin du mot pour ne pas continuer de vérifier ses lettres
132 stop = true; 125 stop = true;
133 endWord = false; 126 endWord = false;
134 } 127 }
135 } 128 }
136 - if(!endWord && !stop) 129 + if(!endWord && !stop) // si un mot manque d'au moins une lettre (endWord == false alors qu'on a atteint la fin du mot à scanner)
137 { 130 {
138 - add_error(error, word, ind, Tree2, fp_txt, correct); 131 + add_error(error, word, ind, Tree2, fp_txt, correct); // on ajoute une erreur
139 } 132 }
140 } 133 }
141 134
  135 +// Ajoute une erreur, donne le type d'erreur et lance le processus de correction
142 void add_error(int* error, char word[], int index, Node Tree, FILE* fp_txt, int* correct) 136 void add_error(int* error, char word[], int index, Node Tree, FILE* fp_txt, int* correct)
143 { 137 {
144 (*error)++; 138 (*error)++;
145 - if(index==0) 139 + if(index==0) // si la première lettre n'est pas reconnu, on ne propose pas de correction
146 { 140 {
147 printf("Le mot '%s' ne correspond à aucun mot du dictionnaire.\n\n", word); 141 printf("Le mot '%s' ne correspond à aucun mot du dictionnaire.\n\n", word);
148 return; 142 return;
149 } 143 }
150 - else if(index<strlen(word)) 144 + else if(index<strlen(word)) // si l'index d'erreur n'est pas le dernier indice du mot, on a une faute dans le mot
151 printf("Il y a une erreur dans le mot '%s', au caractère %c d'incide %d.\n", word, word[index], index); 145 printf("Il y a une erreur dans le mot '%s', au caractère %c d'incide %d.\n", word, word[index], index);
152 - else 146 + else // sinon l'erreur a lieu à la fin du mot
153 printf("Il manque au moins une lettre au mot '%s'.\n", word); 147 printf("Il manque au moins une lettre au mot '%s'.\n", word);
154 - make_correction(word, index, Tree, fp_txt, correct); 148 + make_correction(word, index, Tree, fp_txt, correct); // processus de correction
155 } 149 }
156 150
157 -void make_correction(char word[], int index, Node Tree, FILE* fp_txt, int* correct) // gestion des caractères de fin 151 +// Lance le processus de correction, avec les différentes initialisations
  152 +void make_correction(char word[], int index, Node Tree, FILE* fp_txt, int* correct)
158 { 153 {
159 - correction liste = NULL;  
160 - init_correction(&liste);  
161 - char end;  
162 - bool testEnd;  
163 - testEnd = detect_end_caract(&end, word);  
164 - int longueur = strlen(word);  
165 - Node Tree2 = Tree;  
166 - word[index-1]='\0';  
167 - printf("\n");  
168 - char words[MAX] = "";  
169 - make_tree_correct(Tree2, 0, words, word, liste);  
170 - choice_word(liste, fp_txt, end, longueur, correct, testEnd);  
171 - free(liste); // VALGRIND ??? 154 + correction liste = NULL; // crée une liste contigüe qui contiendra les propositions de correction
  155 + init_correction(&liste); // initalise cette liste
  156 + char end; // permet de stocker un éventuel caractère de fin (',', ';', '?', etc..)
  157 + bool testEnd; // true si le mot possede un caractère de fin, false sinon
  158 + testEnd = detect_end_caract(&end, word);
  159 + int longueur = strlen(word);
  160 + Node Tree2 = Tree;
  161 + word[index-1]='\0'; // on coupe le mot avant l'erreur
  162 + printf("\n");
  163 + char words[MAX] = ""; // chaine de caractères permettant le stockage des différentes lettres pouvant composer les mots de correction
  164 + make_tree_correct(Tree2, 0, words, word, liste); // rempli la liste chainée avec les propositions de correction
  165 + choice_word(liste, fp_txt, end, longueur, correct, testEnd); // permet le choix du mot de correction et lance le processus de remplacement
  166 + free(liste);
172 } 167 }
173 168
  169 +// Détermine si le mot word possède un caractère de fin et le renvoie si c'est le cas
174 bool detect_end_caract(char* end, char word[]) 170 bool detect_end_caract(char* end, char word[])
175 { 171 {
176 - if(is_end_caract(word[strlen(word)-1]))  
177 - {  
178 - *end = word[strlen(word)-1];  
179 - return true;  
180 - }  
181 - return false; 172 + if(is_end_caract(word[strlen(word)-1]))
  173 + {
  174 + *end = word[strlen(word)-1];
  175 + return true;
  176 + }
  177 + return false;
182 } 178 }
183 179
  180 +// Permet le choix du mot de correction et lance le processus de remplacement
184 void choice_word(correction liste, FILE* fp_txt, char end, int longueur, int* correct, bool testEnd) 181 void choice_word(correction liste, FILE* fp_txt, char end, int longueur, int* correct, bool testEnd)
185 { 182 {
186 - int choix;  
187 - printf("Voici les mots possibles pour corriger ce mot :\n");  
188 - for(int i=0; i<liste->dernier+1; i++)  
189 - printf("%d. %s\n", i+1, liste->mots[i]);  
190 - printf("\n");  
191 - choix = -1;  
192 - printf("Quel mot voulez-vous sélectionner ? (Entrez %d pour ne pas corriger le mot)\n", (liste->dernier)+2);  
193 - while(choix<1 || choix>liste->dernier+2)  
194 - {  
195 - scanf("%d", &choix);  
196 - }  
197 - if(choix==(liste->dernier)+2)  
198 - {  
199 - printf("\n");  
200 - return;  
201 - }  
202 - (*correct)++;  
203 - char word[MAX];  
204 - strcpy(word, liste->mots[choix-1]);  
205 - printf("Le mot %s a été sélectionné.\n\n", word);  
206 - if(testEnd) add_caract(word, end);  
207 - correct_word(word, fp_txt, longueur); 183 + int choix;
  184 + printf("Voici les mots possibles pour corriger ce mot :\n");
  185 + for(int i=0; i<liste->dernier+1; i++) // on propose tous les mots de la liste contigüe
  186 + printf("%d. %s\n", i+1, liste->mots[i]);
  187 + printf("\n");
  188 + choix = -1;
  189 + printf("Quel mot voulez-vous sélectionner ? (Entrez %d pour ne pas corriger le mot)\n", (liste->dernier)+2); // exemple : 3 mots possibles. Si on entre 4, alors on ne veut pas corriger
  190 + while(choix<1 || choix>liste->dernier+2) // vérifie que la valeur entrée est correcte
  191 + {
  192 + scanf("%d", &choix);
  193 + }
  194 + if(choix==(liste->dernier)+2) // si on ne corrige pas
  195 + {
  196 + printf("\n");
  197 + return;
  198 + }
  199 + (*correct)++; // on incrémente un compteur de corrections
  200 + char word[MAX]; // contiendra le mot choisi
  201 + strcpy(word, liste->mots[choix-1]);
  202 + printf("Le mot %s a été sélectionné.\n\n", word);
  203 + if(testEnd) add_caract(word, end); // s'il y a un caractère de fin, on l'ajoute
  204 + correct_word(word, fp_txt, longueur); // processus de remplacement
208 } 205 }
209 206
  207 +// Remplace le mot comportant une erreur par le mot choisi dans choice_word
210 void correct_word(char word[], FILE* fp_txt, int longueur) 208 void correct_word(char word[], FILE* fp_txt, int longueur)
211 { 209 {
212 - FILE* fp_tamp;  
213 - fp_tamp = fopen("tampon.txt", "w+");  
214 - if(fp_tamp==NULL)  
215 - {  
216 - printf("Erreur lors de l'ouverture du fichier tampon.\n");  
217 - return;  
218 - }  
219 - int position = ftell(fp_txt)-longueur;  
220 - rewind(fp_txt);  
221 - char tempo;  
222 - while(ftell(fp_tamp)<position) 210 + FILE* fp_tamp; // création d'un fichier tampon
  211 + fp_tamp = fopen("tampon.txt", "w+"); // ouverture en mode lecture/écriture avec suppression du contenu au préalable
  212 + if(fp_tamp==NULL)
223 { 213 {
224 - tempo = fgetc(fp_txt);  
225 - if(tempo==EOF) break;  
226 - //if(tempo=='\n');  
227 - fputc(tempo, fp_tamp);  
228 - }  
229 - fprintf(fp_tamp, "%s", word);  
230 - long newPosition = ftell(fp_tamp);  
231 - fseek(fp_txt, ftell(fp_txt)+longueur, SEEK_SET);  
232 - while(1) 214 + printf("Erreur lors de l'ouverture du fichier tampon.\n");
  215 + return;
  216 + }
  217 + int position = ftell(fp_txt)-longueur; // on récupère la position dans le fichier à analyser du début du mot avec erreur
  218 + rewind(fp_txt); // on se place au début du fichier à scanner
  219 + char tempo;
  220 + while(ftell(fp_tamp)<position) // tant qu'on est pas arrivé au mot avec erreur
233 { 221 {
234 - tempo = fgetc(fp_txt);  
235 - if(tempo==EOF) break;  
236 - //if(tempo=='\n');  
237 - fputc(tempo, fp_tamp);  
238 - }  
239 - rewind(fp_txt);  
240 - rewind(fp_tamp);  
241 - char temp[MAX_READ];  
242 - while(1)  
243 - {  
244 - if(fgets(temp, MAX_READ, fp_tamp)==NULL)  
245 - break;  
246 - fputs(temp, fp_txt);  
247 - }  
248 - fseek(fp_txt, newPosition, SEEK_SET);  
249 - fclose(fp_tamp);  
250 - remove("tampon.txt"); 222 + tempo = fgetc(fp_txt); // copie d'un caractère à la fois
  223 + if(tempo==EOF) break; // jusque la fin du fichier
  224 + fputc(tempo, fp_tamp); // on ajoute le caractère dans le fichier tampon
  225 + }
  226 + fprintf(fp_tamp, "%s", word); // on ajout le mot corrigé dans le fichier tampon
  227 + long newPosition = ftell(fp_tamp); // on récupère la position de la fin du mot corrigé
  228 + fseek(fp_txt, ftell(fp_txt)+longueur, SEEK_SET); // on se place après le mot avec erreur dans le fichier à analyser
  229 + while(1) // on copie la fin du fichier à analyser dans le fichier tampon
  230 + {
  231 + tempo = fgetc(fp_txt);
  232 + if(tempo==EOF) break;
  233 + fputc(tempo, fp_tamp);
  234 + }
  235 + rewind(fp_txt); // on se remet au debut des 2 fichiers pour renvoyer le contenu du fichier tampon dans le fichier à analyser
  236 + rewind(fp_tamp);
  237 + char temp[MAX_READ];
  238 + while(1) // on procède ligne par ligne car aucune modification sur un mot ne sera effectuée
  239 + {
  240 + if(fgets(temp, MAX_READ, fp_tamp)==NULL)
  241 + break;
  242 + fputs(temp, fp_txt);
  243 + }
  244 + fseek(fp_txt, newPosition, SEEK_SET); // on avait récupérer la position après le mot corrigé, on s'y place pour continuer l'analyse du fichier
  245 + fclose(fp_tamp); // fermeture du fichier tampon et suppression
  246 + remove("tampon.txt");
251 } 247 }
252 248
  249 +// Initialise la liste contigüe contenant les mots de correction
253 void init_correction(correction* liste) 250 void init_correction(correction* liste)
254 { 251 {
255 - if((*liste)!=NULL)  
256 - {  
257 - printf("Déjà initialisé.\n");  
258 - return;  
259 - }  
260 - *liste = malloc(sizeof(struct liste));  
261 - (*liste)->dernier = -1;  
262 - for(int i=0; i<NB_MOT_CORRECTION; i++)  
263 - {  
264 - strcpy((*liste)->mots[i], "");  
265 - } 252 + if((*liste)!=NULL)
  253 + {
  254 + printf("Déjà initialisé.\n");
  255 + return;
  256 + }
  257 + *liste = malloc(sizeof(struct liste));
  258 + (*liste)->dernier = -1;
  259 + for(int i=0; i<NB_MOT_CORRECTION; i++)
  260 + {
  261 + strcpy((*liste)->mots[i], "");
  262 + }
266 } 263 }
267 264
  265 +// Affichage
268 void init_pgrm(void) 266 void init_pgrm(void)
269 { 267 {
270 printf("\n------------------------------------------\n"); 268 printf("\n------------------------------------------\n");
@@ -273,6 +271,7 @@ void init_pgrm(void) @@ -273,6 +271,7 @@ void init_pgrm(void)
273 printf("------------------------------------------\n\n"); 271 printf("------------------------------------------\n\n");
274 } 272 }
275 273
  274 +// Renvoie true si 'word' ne comprend pas d'accent, false sinon
276 bool no_accent(char word[]) 275 bool no_accent(char word[])
277 { 276 {
278 int index_max = max_index(word); 277 int index_max = max_index(word);
@@ -281,102 +280,104 @@ bool no_accent(char word[]) @@ -281,102 +280,104 @@ bool no_accent(char word[])
281 return true; 280 return true;
282 } 281 }
283 282
  283 +// Lecture du fichier à analyser
284 void read_txt(FILE* fp, Node* Tree, int* error, int* correct) 284 void read_txt(FILE* fp, Node* Tree, int* error, int* correct)
285 { 285 {
286 char word[MAX]; 286 char word[MAX];
287 while(1) 287 while(1)
288 { 288 {
289 - if(fscanf(fp, "%s", word)!=1) 289 + if(fscanf(fp, "%s", word)!=1) // tant qu'on a pas fini la lecture du fichier
290 break; 290 break;
291 - if(no_accent(word)) // !!! MOTS AVEC ACCENTS NON PRIS EN COMPTE  
292 - scan_word(*Tree, word, error, fp, correct); 291 + if(no_accent(word)) // on ne prend pas en compte les mots accentués (voir compte-rendu pour explications)
  292 + scan_word(*Tree, word, error, fp, correct); // on scanne le mot
293 } 293 }
294 if(feof(fp)) printf("Fin de la lecture du fichier à scanner.\n\n"); 294 if(feof(fp)) printf("Fin de la lecture du fichier à scanner.\n\n");
295 if(ferror(fp)) printf("Erreur lors de la lecture du fichier à scanner.\n\n"); 295 if(ferror(fp)) printf("Erreur lors de la lecture du fichier à scanner.\n\n");
296 } 296 }
297 297
  298 +// Lecture du dictionnaire
298 void read_lib(FILE* fp, Node* Tree) 299 void read_lib(FILE* fp, Node* Tree)
299 { 300 {
300 char word[MAX]; 301 char word[MAX];
301 while(1) 302 while(1)
302 { 303 {
303 - if(fscanf(fp, "%s", word)!=1) 304 + if(fscanf(fp, "%s", word)!=1) // tant qu'on a pas fini la lecture du fichier
304 break; 305 break;
305 - // printf("--%s--\n", word);  
306 - //fflush(stdout);  
307 - if(no_accent(word))  
308 - add_in_tree(*Tree, word); 306 + if(no_accent(word)) // on ne prend pas en compte les mots accentués (voir compte-rendu pour explications)
  307 + add_in_tree(*Tree, word); // on ajoute le mot dans l'arbre indexé
309 } 308 }
310 if(feof(fp)) printf("Fin de la lecture de la bibliothèque.\n\n"); 309 if(feof(fp)) printf("Fin de la lecture de la bibliothèque.\n\n");
311 if(ferror(fp)) printf("Erreur lors de la lecture de la bibliothèque.\n\n"); 310 if(ferror(fp)) printf("Erreur lors de la lecture de la bibliothèque.\n\n");
312 } 311 }
313 312
  313 +// Affichage de l'arbre indexé (inutile pour le code, fonction d'aide)
314 void print_tree(Node Tree, int index, char word[]) 314 void print_tree(Node Tree, int index, char word[])
315 { 315 {
316 - if(is_empty_tree(Tree))  
317 - return;  
318 - add_caract(word, Tree->letter);  
319 - if(is_leaf(Tree))  
320 - {  
321 - printf("%s\n", word);  
322 - supp_caract(word);  
323 - return;  
324 - }  
325 - if(Tree->endWord)  
326 - printf("%s\n", word);  
327 - while(index < NB_CARAC) 316 + if(is_empty_tree(Tree)) // si l'arbre est vide, rien a imprimer
  317 + return;
  318 + add_caract(word, Tree->letter); // sinon, on stocke le caractère dans une chaine
  319 + if(is_leaf(Tree)) // si on atteint une feuille, on imprime et on supprime le dernier caractère car il n'est plus utile
  320 + {
  321 + printf("%s\n", word);
  322 + supp_caract(word);
  323 + return;
  324 + }
  325 + if(Tree->endWord) // si on est à la fin d'un mot, on l'imprime mais on enlève pas de lettre car il peut y avoir des mots plus grands de même racine
  326 + printf("%s\n", word);
  327 + while(index < NB_CARAC) // on parcourt tout le tableau de pointeur de chaque cellule
  328 + {
  329 + if(!is_empty_tree(Tree->next[index])) // si la case du tableau n'est pas vide
328 { 330 {
329 - if(!is_empty_tree(Tree->next[index]))  
330 - {  
331 - print_tree(Tree->next[index], 0, word);  
332 - }  
333 - index++; 331 + print_tree(Tree->next[index], 0, word); // on relance la fonction en partant de la case
334 } 332 }
335 - supp_caract(word);  
336 - return; 333 + index++;
  334 + }
  335 + supp_caract(word); // on supprime le dernier caractère stocké car il n'est plus utile
  336 + return;
337 } 337 }
338 338
339 -void make_tree_correct(Node Tree, int index, char word[], char start[], correction liste) 339 +// Comme son nom l'indique, cette fonction sélectionne les mots possibles pour la correction du mot 'word' et les ajoute dans la liste contigüe
  340 +void make_tree_correct(Node Tree, int index, char word[], char start[], correction liste) // même principe que la fonction d'affichage de l'arbre indexé
340 { 341 {
341 - if(is_empty_tree(Tree))  
342 - return;  
343 - add_caract(word, Tree->letter);  
344 - if(is_leaf(Tree))  
345 - {  
346 - //printf("%s%s\n", start, word);  
347 - add_in_liste(liste, start, word);  
348 - supp_caract(word);  
349 - return;  
350 - }  
351 - if(Tree->endWord)  
352 - {  
353 - //printf("%s%s\n", start, word);  
354 - add_in_liste(liste, start, word);  
355 - }  
356 - while(index < NB_CARAC) 342 + if(is_empty_tree(Tree)) // si l'arbre est vide, il n'y a pas de correction possible
  343 + return;
  344 + add_caract(word, Tree->letter); // on ajoute le caractère à la chaine de stockage
  345 + if(is_leaf(Tree)) // si on arrive au bout d'une branche, on ajoute le mot dans la liste et on supprime le dernier caractère stocké
  346 + {
  347 + add_in_liste(liste, start, word);
  348 + supp_caract(word);
  349 + return;
  350 + }
  351 + if(Tree->endWord) // si on arrive à la fin d'un mot, on l'ajout dans la liste
  352 + {
  353 + add_in_liste(liste, start, word);
  354 + }
  355 + while(index < NB_CARAC) // on parcourt le tableau de chaque cellule
  356 + {
  357 + if(!is_empty_tree(Tree->next[index])) // si la case n'est pas vide
357 { 358 {
358 - if(!is_empty_tree(Tree->next[index]))  
359 - {  
360 - make_tree_correct(Tree->next[index], 0, word, start, liste);  
361 - }  
362 - index++; 359 + make_tree_correct(Tree->next[index], 0, word, start, liste); // on relance la fonction à partir de cette case
363 } 360 }
364 - supp_caract(word);  
365 - return; 361 + index++;
  362 + }
  363 + supp_caract(word); // on supprime le dernier caractère stocké, inutile maintenant
  364 + return;
366 } 365 }
367 366
  367 +// Ajoute les mots de correction dans la liste contigüe
368 void add_in_liste(correction liste, char start[], char word[]) 368 void add_in_liste(correction liste, char start[], char word[])
369 { 369 {
370 - char temp[MAX];  
371 - strcpy(temp, start);  
372 - strcat(temp, word);  
373 - if(liste->dernier<NB_MOT_CORRECTION-1)  
374 - {  
375 - (liste->dernier)++;  
376 - strcpy(liste->mots[liste->dernier], temp);  
377 - } 370 + char temp[MAX];
  371 + strcpy(temp, start); // on concatène le debut du mot (avant l'erreur) avec la suite envoyée dans 'word'
  372 + strcat(temp, word);
  373 + if(liste->dernier<NB_MOT_CORRECTION-1) // pour ne pas dépasser le nombre de mots proposés
  374 + {
  375 + (liste->dernier)++;
  376 + strcpy(liste->mots[liste->dernier], temp);
  377 + }
378 } 378 }
379 379
  380 +// Ajoute un caractère à une chaine de caractères
380 void add_caract(char word[], char caract) 381 void add_caract(char word[], char caract)
381 { 382 {
382 char str[2]; 383 char str[2];
@@ -385,11 +386,13 @@ void add_caract(char word[], char caract) @@ -385,11 +386,13 @@ void add_caract(char word[], char caract)
385 strcat(word, str); 386 strcat(word, str);
386 } 387 }
387 388
  389 +// Supprime un caractère d'une chaine de caractères
388 void supp_caract(char word[]) 390 void supp_caract(char word[])
389 { 391 {
390 word[strlen(word)-1]='\0'; 392 word[strlen(word)-1]='\0';
391 } 393 }
392 394
  395 +// Désalloue la mémoire utilisée par l'arbre indexé
393 void free_tree(Node* Tree) 396 void free_tree(Node* Tree)
394 { 397 {
395 if(*Tree!=NULL) 398 if(*Tree!=NULL)
@@ -9,10 +9,12 @@ @@ -9,10 +9,12 @@
9 #include <stdlib.h> 9 #include <stdlib.h>
10 #include <stdbool.h> 10 #include <stdbool.h>
11 #include <string.h> 11 #include <string.h>
  12 +
  13 +// Définition des constantes
12 #define MAX 30 // taille maximale d'une chaîne lue dans un fichier 14 #define MAX 30 // taille maximale d'une chaîne lue dans un fichier
13 -#define NB_CARAC 27 // nombre de caractères différents pouvant être identifiés -> 89 avec accentués 15 +#define NB_CARAC 27 // nombre de caractères différents pouvant être identifiés
14 #define NB_MOT_CORRECTION 15 // nombre de mots pour la correction 16 #define NB_MOT_CORRECTION 15 // nombre de mots pour la correction
15 -#define MAX_READ 1000 17 +#define MAX_READ 1000 // nombre de caractères maximums dans une ligne lue lors de la connexion
16 18
17 // Déclaration de la structure 'trie' ou 'arbre indexé', ainsi que des pointeurs associés 19 // Déclaration de la structure 'trie' ou 'arbre indexé', ainsi que des pointeurs associés
18 typedef struct node* Node; 20 typedef struct node* Node;
@@ -23,7 +25,7 @@ typedef struct node { @@ -23,7 +25,7 @@ typedef struct node {
23 bool endWord; 25 bool endWord;
24 }node; 26 }node;
25 27
26 -// Déclaration de la structure contenant les mots possible pour la correction 28 +// Déclaration de la liste contigüe contenant les mots possible pour la correction
27 typedef struct liste* correction; 29 typedef struct liste* correction;
28 30
29 typedef struct liste { 31 typedef struct liste {
@@ -76,7 +78,7 @@ void add_error(int*, char*, int, Node, FILE*, int*); @@ -76,7 +78,7 @@ void add_error(int*, char*, int, Node, FILE*, int*);
76 // Corrige les erreurs 78 // Corrige les erreurs
77 void make_correction(char *, int, Node, FILE*, int*); 79 void make_correction(char *, int, Node, FILE*, int*);
78 80
79 -// Initialise le programme 81 +// Initialise le programme (affichage)
80 void init_pgrm(void); 82 void init_pgrm(void);
81 83
82 // Ajoute un caractère à une chaine de caractères 84 // Ajoute un caractère à une chaine de caractères
@@ -85,10 +87,10 @@ void add_caract(char*, char); @@ -85,10 +87,10 @@ void add_caract(char*, char);
85 // Supprime le dernier caractère d'une chaine 87 // Supprime le dernier caractère d'une chaine
86 void supp_caract(char*); 88 void supp_caract(char*);
87 89
88 -// Initialise le tableau contenant les mots de correction 90 +// Initialise la liste contigüe contenant les mots de correction
89 void init_correction(correction*); 91 void init_correction(correction*);
90 92
91 -// Imprime les mots possibles pour la correction 93 +// Récupère les mots possibles pour la correction
92 void make_tree_correct(Node, int, char*, char*, correction); 94 void make_tree_correct(Node, int, char*, char*, correction);
93 95
94 // Ajoute un mot dans une liste contigûe 96 // Ajoute un mot dans une liste contigûe