293e356c
grouille
Version quasi déf...
|
1
2
3
4
5
6
|
// --------------------------------------------------------
// Projet IMA3 2019 - Lecture d'une bibliothèque
// Décompte du nombre de fautes d'orthographe dans un texte
// Normand Quentin & Rouillé Guillaume
// --------------------------------------------------------
|
7d87f7e2
grouille
Makefile + complè...
|
7
|
#include "tree.h"
|
d74431cd
grouille
Ajout de tree.c
|
8
|
|
293e356c
grouille
Version quasi déf...
|
9
|
// Fonction permettant de savoir si la structure est vide
|
54951130
grouille
Ajout du fichier ...
|
10
|
bool is_empty_tree(Node Tree)
|
d74431cd
grouille
Ajout de tree.c
|
11
|
{
|
54951130
grouille
Ajout du fichier ...
|
12
|
return(Tree==NULL);
|
d74431cd
grouille
Ajout de tree.c
|
13
14
|
}
|
293e356c
grouille
Version quasi déf...
|
15
|
// Fonction permettant de savoir si le tableau 'next' est un tableau de pointeurs NULL
|
54951130
grouille
Ajout du fichier ...
|
16
|
bool is_leaf(Node Tree)
|
d74431cd
grouille
Ajout de tree.c
|
17
|
{
|
54951130
grouille
Ajout du fichier ...
|
18
19
20
21
|
for(int i=0; i<NB_CARAC; i++)
if(Tree->next[i] != NULL)
return false;
return true;
|
d74431cd
grouille
Ajout de tree.c
|
22
23
|
}
|
293e356c
grouille
Version quasi déf...
|
24
|
// Initialisation de la structure accueillant le dictionnaire
|
d74431cd
grouille
Ajout de tree.c
|
25
26
|
void init_tree(Node* Tree)
{
|
54951130
grouille
Ajout du fichier ...
|
27
|
if(is_empty_tree(*Tree))
|
d74431cd
grouille
Ajout de tree.c
|
28
|
{
|
54951130
grouille
Ajout du fichier ...
|
29
|
*Tree = malloc(sizeof(node));
|
1e4b8b9c
grouille
Code complet comm...
|
30
|
(*Tree)->letter = 7; // caractère sans utilité
|
d74431cd
grouille
Ajout de tree.c
|
31
|
(* Tree)->endWord = false;
|
54951130
grouille
Ajout du fichier ...
|
32
|
for(int i=0; i<NB_CARAC; i++)
|
293e356c
grouille
Version quasi déf...
|
33
|
(*Tree)->next[i] = NULL; // initialisation du tableau 'next' à un tableau de pointeurs NULL
|
d74431cd
grouille
Ajout de tree.c
|
34
|
}
|
3ff0cab7
grouille
Correction d'une ...
|
35
|
}
|
d74431cd
grouille
Ajout de tree.c
|
36
|
|
293e356c
grouille
Version quasi déf...
|
37
|
// Détermine l'indice de rangement dans le tableau 'next' du caractère 'letter'
|
1e4b8b9c
grouille
Code complet comm...
|
38
|
int find_caract_indice(char letter)
|
293e356c
grouille
Version quasi déf...
|
39
|
{
|
293e356c
grouille
Version quasi déf...
|
40
41
|
if(letter>=97 && letter<=122) return letter-'a';
if(letter>=65 && letter<=90) return letter-'A';
|
a4cfb0f6
grouille
Suppression d'un ...
|
42
43
|
if(letter == 39) return 26; // l'apostrophe est placée en 27ème position
else return -1;
|
293e356c
grouille
Version quasi déf...
|
44
45
46
|
}
// Fonction d'ajout d'un mot 'word' dans la structure 'tree' de type 'arbre indexé'
|
54951130
grouille
Ajout du fichier ...
|
47
|
void add_in_tree(Node Tree, char word[])
|
d74431cd
grouille
Ajout de tree.c
|
48
|
{
|
293e356c
grouille
Version quasi déf...
|
49
50
|
int j=0; // indice du caractère dans le mot 'word'
int ind; // indice du caractère dans le tableau 'next'
|
54951130
grouille
Ajout du fichier ...
|
51
|
Node Tree2 = Tree;
|
293e356c
grouille
Version quasi déf...
|
52
|
while(word[j] != '\0') // on parcourt tout le mot 'word'
|
d74431cd
grouille
Ajout de tree.c
|
53
|
{
|
d74431cd
grouille
Ajout de tree.c
|
54
|
char letter = word[j];
|
1e4b8b9c
grouille
Code complet comm...
|
55
56
57
|
ind = find_caract_indice(letter); // on récupère l'indice de rangement de 'letter'
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
|
293e356c
grouille
Version quasi déf...
|
58
59
|
{
Tree2 = Tree2->next[ind];
|
293e356c
grouille
Version quasi déf...
|
60
61
62
63
64
|
}
else // sinon, on ajoute une nouvelle cellule de type 'struct node' et on y insère les informations concernant le caractères
{
Node new = NULL;
new = malloc(sizeof(node));
|
1e4b8b9c
grouille
Code complet comm...
|
65
66
67
|
new->letter = letter;
for(int i=0; i<NB_CARAC; i++)
|
293e356c
grouille
Version quasi déf...
|
68
69
70
|
{
new->next[i]=NULL;
}
|
ffa95c23
grouille
Version finale sa...
|
71
|
new->endWord = false;
|
1e4b8b9c
grouille
Code complet comm...
|
72
|
|
293e356c
grouille
Version quasi déf...
|
73
|
Tree2->next[ind] = new; // on fait pointé le tableau du caractère précédent vers cette cellule (vers ce caractère)
|
1e4b8b9c
grouille
Code complet comm...
|
74
|
if(!(Tree2->endWord)) // si le caractère précédent n'est pas un caractère de fin, on lui donne la valeur 'false'
|
ffa95c23
grouille
Version finale sa...
|
75
|
Tree2->endWord = false;
|
293e356c
grouille
Version quasi déf...
|
76
|
Tree2=Tree2->next[ind]; // on se place au niveau du caractère suivant dans l'arbre indexé
|
293e356c
grouille
Version quasi déf...
|
77
|
}
|
d74431cd
grouille
Ajout de tree.c
|
78
|
j++;
|
293e356c
grouille
Version quasi déf...
|
79
80
|
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
Tree2->endWord = true;
|
54951130
grouille
Ajout du fichier ...
|
81
|
}
|
54951130
grouille
Ajout du fichier ...
|
82
83
|
}
|
293e356c
grouille
Version quasi déf...
|
84
|
// Fonction qui détermine si le caractère est un caractère de fin de mot (espace, ',', ';', '.', etc..)
|
54951130
grouille
Ajout du fichier ...
|
85
86
|
bool is_end_caract(char letter)
{
|
12c9a42f
grouille
Modification du f...
|
87
|
if(letter==0) return true;
|
a4cfb0f6
grouille
Suppression d'un ...
|
88
|
if((letter>=32 && letter<=38)||(letter>=40 && letter<=47)||(letter>=58 && letter<=64)||(letter>=123 && letter<=126)) return true;
|
54951130
grouille
Ajout du fichier ...
|
89
90
91
|
return false;
}
|
293e356c
grouille
Version quasi déf...
|
92
|
// Renvoi l'indice maximum du mot 'word'
|
54951130
grouille
Ajout du fichier ...
|
93
94
95
96
97
98
99
100
|
char max_index(char word[])
{
int index = 0;
while(!is_end_caract(word[index]))
index++;
return index;
}
|
1e4b8b9c
grouille
Code complet comm...
|
101
102
|
// Fonction qui scanne les mots du fichier à vérifier et les analyse
void scan_word(Node Tree, char word[], int* error, FILE* fp_txt, int* correct)
|
54951130
grouille
Ajout du fichier ...
|
103
|
{
|
1e4b8b9c
grouille
Code complet comm...
|
104
105
106
107
|
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
bool stop = false; // permet de ne pas compte 2 fois certaines erreurs
int ind = 0; // indice dans le mot 'word'
int indice; // indice de rangement de letter dans le tableau 'next'
|
54951130
grouille
Ajout du fichier ...
|
108
109
|
char letter;
Node Tree2 = Tree;
|
1e4b8b9c
grouille
Code complet comm...
|
110
|
while(!is_end_caract(word[ind])) // si 'word[ind]' n'est pas un caractère de fin
|
54951130
grouille
Ajout du fichier ...
|
111
|
{
|
12c9a42f
grouille
Modification du f...
|
112
|
stop = false;
|
54951130
grouille
Ajout du fichier ...
|
113
|
letter = word[ind];
|
1e4b8b9c
grouille
Code complet comm...
|
114
|
indice = find_caract_indice(letter); // récupération de l'indice de rangement
|
293e356c
grouille
Version quasi déf...
|
115
|
|
1e4b8b9c
grouille
Code complet comm...
|
116
|
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
|
54951130
grouille
Ajout du fichier ...
|
117
|
{
|
1e4b8b9c
grouille
Code complet comm...
|
118
119
|
ind++; // on passe à la lettre suivante
Tree2 = Tree2->next[indice]; // on se met dans la case de la lettre qui vient d'être vérifiée
|
12c9a42f
grouille
Modification du f...
|
120
|
endWord = Tree2->endWord;
|
54951130
grouille
Ajout du fichier ...
|
121
122
123
|
}
else
{
|
1e4b8b9c
grouille
Code complet comm...
|
124
125
|
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
ind = max_index(word); // on se place à la fin du mot pour ne pas continuer de vérifier ses lettres
|
12c9a42f
grouille
Modification du f...
|
126
|
stop = true;
|
7d87f7e2
grouille
Makefile + complè...
|
127
|
endWord = false;
|
d74431cd
grouille
Ajout de tree.c
|
128
|
}
|
54951130
grouille
Ajout du fichier ...
|
129
|
}
|
1e4b8b9c
grouille
Code complet comm...
|
130
|
if(!endWord && !stop) // si un mot manque d'au moins une lettre (endWord == false alors qu'on a atteint la fin du mot à scanner)
|
12c9a42f
grouille
Modification du f...
|
131
|
{
|
1e4b8b9c
grouille
Code complet comm...
|
132
|
add_error(error, word, ind, Tree2, fp_txt, correct); // on ajoute une erreur
|
12c9a42f
grouille
Modification du f...
|
133
|
}
|
54951130
grouille
Ajout du fichier ...
|
134
135
|
}
|
1e4b8b9c
grouille
Code complet comm...
|
136
|
// Ajoute une erreur, donne le type d'erreur et lance le processus de correction
|
ffa95c23
grouille
Version finale sa...
|
137
|
void add_error(int* error, char word[], int index, Node Tree, FILE* fp_txt, int* correct)
|
0e62ceb1
grouille
Code propre
|
138
139
|
{
(*error)++;
|
1e4b8b9c
grouille
Code complet comm...
|
140
|
if(index==0) // si la première lettre n'est pas reconnu, on ne propose pas de correction
|
0e62ceb1
grouille
Code propre
|
141
|
{
|
30391ee4
grouille
Correction légère
|
142
|
printf("Le mot '%s' ne correspond à aucun mot du dictionnaire.\n\n", word);
|
0e62ceb1
grouille
Code propre
|
143
144
|
return;
}
|
a4cfb0f6
grouille
Suppression d'un ...
|
145
|
else if(index<(int)strlen(word)) // si l'index d'erreur n'est pas le dernier indice du mot, on a une faute dans le mot
|
ffa95c23
grouille
Version finale sa...
|
146
|
printf("Il y a une erreur dans le mot '%s', au caractère %c d'incide %d.\n", word, word[index], index);
|
1e4b8b9c
grouille
Code complet comm...
|
147
|
else // sinon l'erreur a lieu à la fin du mot
|
ffa95c23
grouille
Version finale sa...
|
148
|
printf("Il manque au moins une lettre au mot '%s'.\n", word);
|
1e4b8b9c
grouille
Code complet comm...
|
149
|
make_correction(word, index, Tree, fp_txt, correct); // processus de correction
|
0e62ceb1
grouille
Code propre
|
150
151
|
}
|
1e4b8b9c
grouille
Code complet comm...
|
152
153
|
// Lance le processus de correction, avec les différentes initialisations
void make_correction(char word[], int index, Node Tree, FILE* fp_txt, int* correct)
|
0e62ceb1
grouille
Code propre
|
154
|
{
|
1e4b8b9c
grouille
Code complet comm...
|
155
156
157
158
159
160
161
162
163
164
165
166
167
|
correction liste = NULL; // crée une liste contigüe qui contiendra les propositions de correction
init_correction(&liste); // initalise cette liste
char end; // permet de stocker un éventuel caractère de fin (',', ';', '?', etc..)
bool testEnd; // true si le mot possede un caractère de fin, false sinon
testEnd = detect_end_caract(&end, word);
int longueur = strlen(word);
Node Tree2 = Tree;
word[index-1]='\0'; // on coupe le mot avant l'erreur
printf("\n");
char words[MAX] = ""; // chaine de caractères permettant le stockage des différentes lettres pouvant composer les mots de correction
make_tree_correct(Tree2, 0, words, word, liste); // rempli la liste chainée avec les propositions de correction
choice_word(liste, fp_txt, end, longueur, correct, testEnd); // permet le choix du mot de correction et lance le processus de remplacement
free(liste);
|
ffa95c23
grouille
Version finale sa...
|
168
169
|
}
|
1e4b8b9c
grouille
Code complet comm...
|
170
|
// Détermine si le mot word possède un caractère de fin et le renvoie si c'est le cas
|
ffa95c23
grouille
Version finale sa...
|
171
172
|
bool detect_end_caract(char* end, char word[])
{
|
1e4b8b9c
grouille
Code complet comm...
|
173
174
175
176
177
178
|
if(is_end_caract(word[strlen(word)-1]))
{
*end = word[strlen(word)-1];
return true;
}
return false;
|
ffa95c23
grouille
Version finale sa...
|
179
180
|
}
|
1e4b8b9c
grouille
Code complet comm...
|
181
|
// Permet le choix du mot de correction et lance le processus de remplacement
|
ffa95c23
grouille
Version finale sa...
|
182
183
|
void choice_word(correction liste, FILE* fp_txt, char end, int longueur, int* correct, bool testEnd)
{
|
1e4b8b9c
grouille
Code complet comm...
|
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
|
int choix;
printf("Voici les mots possibles pour corriger ce mot :\n");
for(int i=0; i<liste->dernier+1; i++) // on propose tous les mots de la liste contigüe
printf("%d. %s\n", i+1, liste->mots[i]);
printf("\n");
choix = -1;
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
while(choix<1 || choix>liste->dernier+2) // vérifie que la valeur entrée est correcte
{
scanf("%d", &choix);
}
if(choix==(liste->dernier)+2) // si on ne corrige pas
{
printf("\n");
return;
}
(*correct)++; // on incrémente un compteur de corrections
char word[MAX]; // contiendra le mot choisi
strcpy(word, liste->mots[choix-1]);
printf("Le mot %s a été sélectionné.\n\n", word);
if(testEnd) add_caract(word, end); // s'il y a un caractère de fin, on l'ajoute
correct_word(word, fp_txt, longueur); // processus de remplacement
|
ffa95c23
grouille
Version finale sa...
|
206
207
|
}
|
1e4b8b9c
grouille
Code complet comm...
|
208
|
// Remplace le mot comportant une erreur par le mot choisi dans choice_word
|
ffa95c23
grouille
Version finale sa...
|
209
210
|
void correct_word(char word[], FILE* fp_txt, int longueur)
{
|
1e4b8b9c
grouille
Code complet comm...
|
211
212
213
|
FILE* fp_tamp; // création d'un fichier tampon
fp_tamp = fopen("tampon.txt", "w+"); // ouverture en mode lecture/écriture avec suppression du contenu au préalable
if(fp_tamp==NULL)
|
ffa95c23
grouille
Version finale sa...
|
214
|
{
|
1e4b8b9c
grouille
Code complet comm...
|
215
216
217
218
219
220
221
|
printf("Erreur lors de l'ouverture du fichier tampon.\n");
return;
}
int position = ftell(fp_txt)-longueur; // on récupère la position dans le fichier à analyser du début du mot avec erreur
rewind(fp_txt); // on se place au début du fichier à scanner
char tempo;
while(ftell(fp_tamp)<position) // tant qu'on est pas arrivé au mot avec erreur
|
ffa95c23
grouille
Version finale sa...
|
222
|
{
|
1e4b8b9c
grouille
Code complet comm...
|
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
|
tempo = fgetc(fp_txt); // copie d'un caractère à la fois
if(tempo==EOF) break; // jusque la fin du fichier
fputc(tempo, fp_tamp); // on ajoute le caractère dans le fichier tampon
}
fprintf(fp_tamp, "%s", word); // on ajout le mot corrigé dans le fichier tampon
long newPosition = ftell(fp_tamp); // on récupère la position de la fin du mot corrigé
fseek(fp_txt, ftell(fp_txt)+longueur, SEEK_SET); // on se place après le mot avec erreur dans le fichier à analyser
while(1) // on copie la fin du fichier à analyser dans le fichier tampon
{
tempo = fgetc(fp_txt);
if(tempo==EOF) break;
fputc(tempo, fp_tamp);
}
rewind(fp_txt); // on se remet au debut des 2 fichiers pour renvoyer le contenu du fichier tampon dans le fichier à analyser
rewind(fp_tamp);
char temp[MAX_READ];
while(1) // on procède ligne par ligne car aucune modification sur un mot ne sera effectuée
{
if(fgets(temp, MAX_READ, fp_tamp)==NULL)
break;
fputs(temp, fp_txt);
}
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
fclose(fp_tamp); // fermeture du fichier tampon et suppression
remove("tampon.txt");
|
ffa95c23
grouille
Version finale sa...
|
248
249
|
}
|
1e4b8b9c
grouille
Code complet comm...
|
250
|
// Initialise la liste contigüe contenant les mots de correction
|
ffa95c23
grouille
Version finale sa...
|
251
252
|
void init_correction(correction* liste)
{
|
1e4b8b9c
grouille
Code complet comm...
|
253
254
255
256
257
258
259
260
261
262
263
|
if((*liste)!=NULL)
{
printf("Déjà initialisé.\n");
return;
}
*liste = malloc(sizeof(struct liste));
(*liste)->dernier = -1;
for(int i=0; i<NB_MOT_CORRECTION; i++)
{
strcpy((*liste)->mots[i], "");
}
|
0e62ceb1
grouille
Code propre
|
264
265
|
}
|
1e4b8b9c
grouille
Code complet comm...
|
266
|
// Affichage
|
0e62ceb1
grouille
Code propre
|
267
268
269
270
271
272
273
274
|
void init_pgrm(void)
{
printf("\n------------------------------------------\n");
printf("Correcteur ortographique.\n");
printf("Normand Quentin & Rouillé Guillaume.\n");
printf("------------------------------------------\n\n");
}
|
1e4b8b9c
grouille
Code complet comm...
|
275
|
// Renvoie true si 'word' ne comprend pas d'accent, false sinon
|
293e356c
grouille
Version quasi déf...
|
276
277
278
279
280
281
282
283
|
bool no_accent(char word[])
{
int index_max = max_index(word);
for(int i=0; i<index_max; i++)
if(word[i]<0) return false;
return true;
}
|
1e4b8b9c
grouille
Code complet comm...
|
284
|
// Lecture du fichier à analyser
|
ffa95c23
grouille
Version finale sa...
|
285
|
void read_txt(FILE* fp, Node* Tree, int* error, int* correct)
|
54951130
grouille
Ajout du fichier ...
|
286
287
288
289
|
{
char word[MAX];
while(1)
{
|
1e4b8b9c
grouille
Code complet comm...
|
290
|
if(fscanf(fp, "%s", word)!=1) // tant qu'on a pas fini la lecture du fichier
|
7d87f7e2
grouille
Makefile + complè...
|
291
|
break;
|
1e4b8b9c
grouille
Code complet comm...
|
292
293
|
if(no_accent(word)) // on ne prend pas en compte les mots accentués (voir compte-rendu pour explications)
scan_word(*Tree, word, error, fp, correct); // on scanne le mot
|
54951130
grouille
Ajout du fichier ...
|
294
|
}
|
0e62ceb1
grouille
Code propre
|
295
296
|
if(feof(fp)) printf("Fin de la lecture du fichier à scanner.\n\n");
if(ferror(fp)) printf("Erreur lors de la lecture du fichier à scanner.\n\n");
|
d74431cd
grouille
Ajout de tree.c
|
297
298
|
}
|
1e4b8b9c
grouille
Code complet comm...
|
299
|
// Lecture du dictionnaire
|
d74431cd
grouille
Ajout de tree.c
|
300
301
302
303
304
|
void read_lib(FILE* fp, Node* Tree)
{
char word[MAX];
while(1)
{
|
1e4b8b9c
grouille
Code complet comm...
|
305
|
if(fscanf(fp, "%s", word)!=1) // tant qu'on a pas fini la lecture du fichier
|
7d87f7e2
grouille
Makefile + complè...
|
306
|
break;
|
1e4b8b9c
grouille
Code complet comm...
|
307
308
|
if(no_accent(word)) // on ne prend pas en compte les mots accentués (voir compte-rendu pour explications)
add_in_tree(*Tree, word); // on ajoute le mot dans l'arbre indexé
|
7d87f7e2
grouille
Makefile + complè...
|
309
|
}
|
0e62ceb1
grouille
Code propre
|
310
311
|
if(feof(fp)) printf("Fin de la lecture de la bibliothèque.\n\n");
if(ferror(fp)) printf("Erreur lors de la lecture de la bibliothèque.\n\n");
|
d74431cd
grouille
Ajout de tree.c
|
312
313
|
}
|
1e4b8b9c
grouille
Code complet comm...
|
314
|
// Affichage de l'arbre indexé (inutile pour le code, fonction d'aide)
|
ffa95c23
grouille
Version finale sa...
|
315
316
|
void print_tree(Node Tree, int index, char word[])
{
|
1e4b8b9c
grouille
Code complet comm...
|
317
318
319
320
321
322
323
324
325
326
327
328
329
330
|
if(is_empty_tree(Tree)) // si l'arbre est vide, rien a imprimer
return;
add_caract(word, Tree->letter); // sinon, on stocke le caractère dans une chaine
if(is_leaf(Tree)) // si on atteint une feuille, on imprime et on supprime le dernier caractère car il n'est plus utile
{
printf("%s\n", word);
supp_caract(word);
return;
}
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
printf("%s\n", word);
while(index < NB_CARAC) // on parcourt tout le tableau de pointeur de chaque cellule
{
if(!is_empty_tree(Tree->next[index])) // si la case du tableau n'est pas vide
|
ffa95c23
grouille
Version finale sa...
|
331
|
{
|
1e4b8b9c
grouille
Code complet comm...
|
332
|
print_tree(Tree->next[index], 0, word); // on relance la fonction en partant de la case
|
ffa95c23
grouille
Version finale sa...
|
333
|
}
|
1e4b8b9c
grouille
Code complet comm...
|
334
335
336
337
|
index++;
}
supp_caract(word); // on supprime le dernier caractère stocké car il n'est plus utile
return;
|
ffa95c23
grouille
Version finale sa...
|
338
|
}
|
0e62ceb1
grouille
Code propre
|
339
|
|
1e4b8b9c
grouille
Code complet comm...
|
340
341
|
// 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
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é
|
d74431cd
grouille
Ajout de tree.c
|
342
|
{
|
1e4b8b9c
grouille
Code complet comm...
|
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
|
if(is_empty_tree(Tree)) // si l'arbre est vide, il n'y a pas de correction possible
return;
add_caract(word, Tree->letter); // on ajoute le caractère à la chaine de stockage
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é
{
add_in_liste(liste, start, word);
supp_caract(word);
return;
}
if(Tree->endWord) // si on arrive à la fin d'un mot, on l'ajout dans la liste
{
add_in_liste(liste, start, word);
}
while(index < NB_CARAC) // on parcourt le tableau de chaque cellule
{
if(!is_empty_tree(Tree->next[index])) // si la case n'est pas vide
|
ffa95c23
grouille
Version finale sa...
|
359
|
{
|
1e4b8b9c
grouille
Code complet comm...
|
360
|
make_tree_correct(Tree->next[index], 0, word, start, liste); // on relance la fonction à partir de cette case
|
ffa95c23
grouille
Version finale sa...
|
361
|
}
|
1e4b8b9c
grouille
Code complet comm...
|
362
363
364
365
|
index++;
}
supp_caract(word); // on supprime le dernier caractère stocké, inutile maintenant
return;
|
54951130
grouille
Ajout du fichier ...
|
366
367
|
}
|
1e4b8b9c
grouille
Code complet comm...
|
368
|
// Ajoute les mots de correction dans la liste contigüe
|
ffa95c23
grouille
Version finale sa...
|
369
|
void add_in_liste(correction liste, char start[], char word[])
|
54951130
grouille
Ajout du fichier ...
|
370
|
{
|
1e4b8b9c
grouille
Code complet comm...
|
371
372
373
374
375
376
377
378
|
char temp[MAX];
strcpy(temp, start); // on concatène le debut du mot (avant l'erreur) avec la suite envoyée dans 'word'
strcat(temp, word);
if(liste->dernier<NB_MOT_CORRECTION-1) // pour ne pas dépasser le nombre de mots proposés
{
(liste->dernier)++;
strcpy(liste->mots[liste->dernier], temp);
}
|
54951130
grouille
Ajout du fichier ...
|
379
380
|
}
|
1e4b8b9c
grouille
Code complet comm...
|
381
|
// Ajoute un caractère à une chaine de caractères
|
ffa95c23
grouille
Version finale sa...
|
382
|
void add_caract(char word[], char caract)
|
54951130
grouille
Ajout du fichier ...
|
383
|
{
|
ffa95c23
grouille
Version finale sa...
|
384
385
386
387
388
389
|
char str[2];
str[0] = caract;
str[1] = '\0';
strcat(word, str);
}
|
1e4b8b9c
grouille
Code complet comm...
|
390
|
// Supprime un caractère d'une chaine de caractères
|
ffa95c23
grouille
Version finale sa...
|
391
392
393
|
void supp_caract(char word[])
{
word[strlen(word)-1]='\0';
|
d74431cd
grouille
Ajout de tree.c
|
394
395
|
}
|
1e4b8b9c
grouille
Code complet comm...
|
396
|
// Désalloue la mémoire utilisée par l'arbre indexé
|
5db504f4
grouille
Ajout de la fonct...
|
397
|
void free_tree(Node* Tree)
|
293e356c
grouille
Version quasi déf...
|
398
|
{
|
5db504f4
grouille
Ajout de la fonct...
|
399
|
if(*Tree!=NULL)
|
293e356c
grouille
Version quasi déf...
|
400
|
{
|
5db504f4
grouille
Ajout de la fonct...
|
401
402
403
404
405
|
for(int i=0; i<NB_CARAC; i++)
{
free_tree(&(*Tree)->next[i]);
}
free(*Tree);
|
293e356c
grouille
Version quasi déf...
|
406
|
}
|
5db504f4
grouille
Ajout de la fonct...
|
407
|
}
|
293e356c
grouille
Version quasi déf...
|
|
|