293e356c
grouille
Version quasi déf...
|
1
2
3
4
5
6
7
|
// --------------------------------------------------------
// Projet IMA3 2019 - Lecture d'une bibliothèque
// Décompte du nombre de fautes d'orthographe dans un texte
// Normand Quentin & Rouillé Guillaume
// --------------------------------------------------------
// Initialisation des variables et inclusion des bibliothèques
|
d74431cd
grouille
Ajout de tree.c
|
8
9
10
|
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
|
293e356c
grouille
Version quasi déf...
|
11
12
|
#define MAX 30 // taille maximale d'une chaîne lue dans un fichier
#define NB_CARAC 27 // nombre de caractères différents pouvant être identifiés -> 89 avec accentués
|
d74431cd
grouille
Ajout de tree.c
|
13
|
|
293e356c
grouille
Version quasi déf...
|
14
|
// Déclaration de la structure 'trie' ou 'arbre indexé', ainsi que des pointeurs associés
|
d74431cd
grouille
Ajout de tree.c
|
15
16
17
18
|
typedef struct node* Node;
typedef struct node {
char letter;
|
54951130
grouille
Ajout du fichier ...
|
19
|
Node next[NB_CARAC];
|
d74431cd
grouille
Ajout de tree.c
|
20
21
22
|
bool endWord;
}node;
|
293e356c
grouille
Version quasi déf...
|
23
|
// Fonction permettant de savoir si la structure est vide
|
54951130
grouille
Ajout du fichier ...
|
24
|
bool is_empty_tree(Node Tree)
|
d74431cd
grouille
Ajout de tree.c
|
25
|
{
|
54951130
grouille
Ajout du fichier ...
|
26
|
return(Tree==NULL);
|
d74431cd
grouille
Ajout de tree.c
|
27
28
|
}
|
293e356c
grouille
Version quasi déf...
|
29
|
// Fonction permettant de savoir si le tableau 'next' est un tableau de pointeurs NULL
|
54951130
grouille
Ajout du fichier ...
|
30
|
bool is_leaf(Node Tree)
|
d74431cd
grouille
Ajout de tree.c
|
31
|
{
|
54951130
grouille
Ajout du fichier ...
|
32
33
34
35
|
for(int i=0; i<NB_CARAC; i++)
if(Tree->next[i] != NULL)
return false;
return true;
|
d74431cd
grouille
Ajout de tree.c
|
36
37
|
}
|
293e356c
grouille
Version quasi déf...
|
38
|
// Initialisation de la structure accueillant le dictionnaire
|
d74431cd
grouille
Ajout de tree.c
|
39
40
|
void init_tree(Node* Tree)
{
|
54951130
grouille
Ajout du fichier ...
|
41
|
if(is_empty_tree(*Tree))
|
d74431cd
grouille
Ajout de tree.c
|
42
|
{
|
54951130
grouille
Ajout du fichier ...
|
43
|
*Tree = malloc(sizeof(node));
|
293e356c
grouille
Version quasi déf...
|
44
|
(*Tree)->letter = '?'; // caractère choisi arbitrairement
|
d74431cd
grouille
Ajout de tree.c
|
45
|
(* Tree)->endWord = false;
|
54951130
grouille
Ajout du fichier ...
|
46
|
for(int i=0; i<NB_CARAC; i++)
|
293e356c
grouille
Version quasi déf...
|
47
|
(*Tree)->next[i] = NULL; // initialisation du tableau 'next' à un tableau de pointeurs NULL
|
d74431cd
grouille
Ajout de tree.c
|
48
49
50
|
}
}
|
293e356c
grouille
Version quasi déf...
|
51
52
53
54
55
56
57
58
59
60
61
|
// Détermine l'indice de rangement dans le tableau 'next' du caractère 'letter'
int find_caract_indice(char letter) // Ne fonctionne pas pour les caractères accentués
{
//printf("__%d__\n", letter);
if(letter>=97 && letter<=122) return letter-'a';
if(letter>=65 && letter<=90) return letter-'A';
if(letter == 39) return letter-13; // l'apostrophe est placée en 27ème position
//if(letter>=192) {printf("%d", letter-166); return letter-166;} //-192+26
}
// Fonction d'ajout d'un mot 'word' dans la structure 'tree' de type 'arbre indexé'
|
54951130
grouille
Ajout du fichier ...
|
62
|
void add_in_tree(Node Tree, char word[])
|
d74431cd
grouille
Ajout de tree.c
|
63
|
{
|
293e356c
grouille
Version quasi déf...
|
64
65
|
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 ...
|
66
|
Node Tree2 = Tree;
|
293e356c
grouille
Version quasi déf...
|
67
|
while(word[j] != '\0') // on parcourt tout le mot 'word'
|
d74431cd
grouille
Ajout de tree.c
|
68
|
{
|
293e356c
grouille
Version quasi déf...
|
69
70
|
/*if(is_leaf(Tree2)) // a retirer
printf("empty\t");*/
|
d74431cd
grouille
Ajout de tree.c
|
71
|
char letter = word[j];
|
293e356c
grouille
Version quasi déf...
|
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
ind = find_caract_indice(letter);
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
{
Tree2 = Tree2->next[ind];
/* printf("%c %d\t", letter, ind);
printf("okA %d\n", j);*/
}
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));
new->letter = letter; // le caractère
for(int i=0; i<NB_CARAC; i++) // un tableau de pointeurs NULL
{
new->next[i]=NULL;
}
Tree2->next[ind] = new; // on fait pointé le tableau du caractère précédent vers cette cellule (vers ce caractère)
/*if(!(Tree2->endWord)) // si le caractère n'est pas un caractère de fin, on le met à 'false' -> UTILITE ?
Tree2->endWord = false;*/
Tree2=Tree2->next[ind]; // on se place au niveau du caractère suivant dans l'arbre indexé
/*printf("%c %d\t", letter, ind);
printf("okB %d\n", j);*/
}
|
d74431cd
grouille
Ajout de tree.c
|
95
|
j++;
|
293e356c
grouille
Version quasi déf...
|
96
97
|
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 ...
|
98
|
}
|
293e356c
grouille
Version quasi déf...
|
99
|
//printf("ok\n");
|
54951130
grouille
Ajout du fichier ...
|
100
101
|
}
|
293e356c
grouille
Version quasi déf...
|
102
|
// Fonction qui détermine si le caractère est un caractère de fin de mot (espace, ',', ';', '.', etc..)
|
54951130
grouille
Ajout du fichier ...
|
103
104
|
bool is_end_caract(char letter)
{
|
12c9a42f
grouille
Modification du f...
|
105
|
if(letter==0) return true;
|
293e356c
grouille
Version quasi déf...
|
106
|
if((letter>=32 && letter<=38)||(letter>=40 && letter<=47)||(letter>=58 && letter<=64)||(letter>=123 && letter<=126)||(letter==128)) return true;
|
54951130
grouille
Ajout du fichier ...
|
107
108
109
|
return false;
}
|
293e356c
grouille
Version quasi déf...
|
110
|
// Renvoi l'indice maximum du mot 'word'
|
54951130
grouille
Ajout du fichier ...
|
111
112
113
114
115
116
117
118
|
char max_index(char word[])
{
int index = 0;
while(!is_end_caract(word[index]))
index++;
return index;
}
|
12c9a42f
grouille
Modification du f...
|
119
|
void scan_word(Node Tree, char word[], int* error) // si un mot démarre juste après un caractère de fin, la fonction ne lit pas les mots séparément
|
54951130
grouille
Ajout du fichier ...
|
120
|
{
|
293e356c
grouille
Version quasi déf...
|
121
|
bool endWord = false;
|
12c9a42f
grouille
Modification du f...
|
122
|
bool stop = false;
|
54951130
grouille
Ajout du fichier ...
|
123
|
int ind = 0;
|
293e356c
grouille
Version quasi déf...
|
124
|
int indice;
|
54951130
grouille
Ajout du fichier ...
|
125
126
127
128
|
char letter;
Node Tree2 = Tree;
while(!is_end_caract(word[ind]))
{
|
12c9a42f
grouille
Modification du f...
|
129
|
stop = false;
|
54951130
grouille
Ajout du fichier ...
|
130
|
letter = word[ind];
|
293e356c
grouille
Version quasi déf...
|
131
132
133
|
indice = find_caract_indice(letter);
if(Tree2 != NULL && Tree2->next[indice]!=NULL)
|
54951130
grouille
Ajout du fichier ...
|
134
135
|
{
ind++;
|
293e356c
grouille
Version quasi déf...
|
136
|
Tree2 = Tree2->next[indice];
|
12c9a42f
grouille
Modification du f...
|
137
|
endWord = Tree2->endWord;
|
293e356c
grouille
Version quasi déf...
|
138
|
/*if(endWord) printf("end :: %s ::\n", word);*/
|
54951130
grouille
Ajout du fichier ...
|
139
140
141
142
143
|
}
else
{
printf("mot : %s erreur :%c %d \n", word, word[ind], word[ind]);
(*error)++;
|
293e356c
grouille
Version quasi déf...
|
144
|
//printf("%d\n", ind);
|
54951130
grouille
Ajout du fichier ...
|
145
|
ind = max_index(word);
|
293e356c
grouille
Version quasi déf...
|
146
|
//printf("%d\n", ind);
|
12c9a42f
grouille
Modification du f...
|
147
|
stop = true;
|
d74431cd
grouille
Ajout de tree.c
|
148
|
}
|
54951130
grouille
Ajout du fichier ...
|
149
|
}
|
12c9a42f
grouille
Modification du f...
|
150
151
152
153
154
|
if(!endWord && !stop)
{
(*error)++;
printf("---%s---\n", word);
}
|
54951130
grouille
Ajout du fichier ...
|
155
156
|
}
|
293e356c
grouille
Version quasi déf...
|
157
158
159
160
161
162
163
164
|
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;
}
|
54951130
grouille
Ajout du fichier ...
|
165
166
167
168
169
170
171
172
173
|
void read_txt(FILE* fp, Node* Tree, int* error)
{
char word[MAX];
while(1)
{
if(fscanf(fp, "%s", word)!=1)
return;
scan_word(*Tree, word, error);
}
|
d74431cd
grouille
Ajout de tree.c
|
174
175
176
177
178
179
180
|
}
void read_lib(FILE* fp, Node* Tree)
{
char word[MAX];
while(1)
{
|
54951130
grouille
Ajout du fichier ...
|
181
182
|
if(fscanf(fp, "%s", word)!=1)
return;
|
293e356c
grouille
Version quasi déf...
|
183
|
// printf("--%s--\n", word);
|
54951130
grouille
Ajout du fichier ...
|
184
|
//fflush(stdout);
|
293e356c
grouille
Version quasi déf...
|
185
186
|
if(no_accent(word))
add_in_tree(*Tree, word);
|
d74431cd
grouille
Ajout de tree.c
|
187
188
189
190
191
|
}
}
void print_tree(Node Tree, int index)
{
|
54951130
grouille
Ajout du fichier ...
|
192
193
194
195
196
197
198
199
200
201
202
203
|
if(is_empty_tree(Tree))
return;
Node cpTree = NULL;
cpTree = Tree;
if(cpTree->next[index]==NULL && index<26)
{
print_tree(cpTree, index+1);
}
else if(index == 26)
{
return;
}
|
d74431cd
grouille
Ajout de tree.c
|
204
|
else
|
54951130
grouille
Ajout du fichier ...
|
205
206
207
|
{
printf("%c\n", (cpTree->next[index])->letter);
if((cpTree->next[index])->endWord)
|
293e356c
grouille
Version quasi déf...
|
208
209
210
211
212
|
{
printf("fin\n");
//print_tree(cpTree, 0);
return;
}
|
54951130
grouille
Ajout du fichier ...
|
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
|
print_tree(cpTree->next[index], 0);
}
}
int find_index(Node tree)
{
Node cpTree = tree;
int index = 0;
while(cpTree->next[index]==NULL && index < NB_CARAC)
index++;
return index;
}
void print_first(Node Tree)
{
Node cpTree = Tree;
int index = 0;
|
12c9a42f
grouille
Modification du f...
|
230
|
while(!is_leaf(cpTree) || !(cpTree->endWord))
|
54951130
grouille
Ajout du fichier ...
|
231
232
233
|
{
index = find_index(cpTree);
printf("%c\n", (cpTree->next[index])->letter);
|
12c9a42f
grouille
Modification du f...
|
234
|
if(cpTree->next[index]->endWord) printf("fin\n");
|
54951130
grouille
Ajout du fichier ...
|
235
236
|
cpTree=cpTree->next[index];
}
|
d74431cd
grouille
Ajout de tree.c
|
237
238
|
}
|
5db504f4
grouille
Ajout de la fonct...
|
239
|
void free_tree(Node* Tree)
|
293e356c
grouille
Version quasi déf...
|
240
|
{
|
5db504f4
grouille
Ajout de la fonct...
|
241
|
if(*Tree!=NULL)
|
293e356c
grouille
Version quasi déf...
|
242
|
{
|
5db504f4
grouille
Ajout de la fonct...
|
243
244
245
246
247
|
for(int i=0; i<NB_CARAC; i++)
{
free_tree(&(*Tree)->next[i]);
}
free(*Tree);
|
293e356c
grouille
Version quasi déf...
|
248
|
}
|
5db504f4
grouille
Ajout de la fonct...
|
249
|
}
|
293e356c
grouille
Version quasi déf...
|
250
|
|
d74431cd
grouille
Ajout de tree.c
|
251
252
|
int main(int argc, char *argv[])
{
|
54951130
grouille
Ajout du fichier ...
|
253
254
255
256
257
258
259
260
261
262
263
|
Node tree = NULL;
int error = 0;
FILE* fp_lib;
FILE* fp_txt;
fp_lib = fopen(argv[argc-2], "r");
fp_txt = fopen(argv[argc-1], "r");
init_tree(&tree);
read_lib(fp_lib, &tree);
read_txt(fp_txt, &tree, &error);
|
12c9a42f
grouille
Modification du f...
|
264
|
// printf("%p\n", tree);
|
54951130
grouille
Ajout du fichier ...
|
265
|
|
293e356c
grouille
Version quasi déf...
|
266
|
//print_first(tree);
|
12c9a42f
grouille
Modification du f...
|
267
268
|
//printf("\n");
//print_tree(tree, 0);
|
54951130
grouille
Ajout du fichier ...
|
269
270
271
|
printf("erreurs : %d\n", error);
|
5db504f4
grouille
Ajout de la fonct...
|
272
|
free_tree(&tree);
|
d74431cd
grouille
Ajout de tree.c
|
273
274
|
return 0;
}
|