9cf06b18
mertz
debut_add_tree
|
1
|
#include "tree.h"
|
f7d9ccda
mertz
ajout_libtree
|
2
|
|
284154ca
Thorsieger
gestion des accents
|
3
|
void cons_tree(struct node ** ptr_tree, wchar_t val)
|
f7d9ccda
mertz
ajout_libtree
|
4
|
{
|
9cf06b18
mertz
debut_add_tree
|
5
6
7
8
9
10
|
*ptr_tree = malloc(sizeof(struct node));
(*ptr_tree)->val = val;
(*ptr_tree)->fin = 0;
(*ptr_tree)->nbr_fils=0;
(*ptr_tree)->fils = malloc(sizeof(struct node*));
(*ptr_tree)->fils[0]=NULL;
|
f7d9ccda
mertz
ajout_libtree
|
11
12
|
}
|
0f6db57b
Thorsieger
gestion des accen...
|
13
|
void mk_empty_tree(dico *Dico)
|
9cf06b18
mertz
debut_add_tree
|
14
|
{
|
0f6db57b
Thorsieger
gestion des accen...
|
15
16
17
18
|
for(int i = 0; i < Dico->taille; i++)
{
Dico->tab_ptr_tree[i] = NULL;
}
|
9cf06b18
mertz
debut_add_tree
|
19
|
}
|
f7d9ccda
mertz
ajout_libtree
|
20
|
|
0f6db57b
Thorsieger
gestion des accen...
|
21
|
void init_dico(dico *Dico)
|
9cf06b18
mertz
debut_add_tree
|
22
|
{
|
0f6db57b
Thorsieger
gestion des accen...
|
23
24
25
|
Dico->taille = 26;
Dico->tab_ptr_tree = malloc(Dico->taille*sizeof(struct node*));
mk_empty_tree(Dico);
|
9cf06b18
mertz
debut_add_tree
|
26
|
}
|
f7d9ccda
mertz
ajout_libtree
|
27
|
|
284154ca
Thorsieger
gestion des accents
|
28
|
void add(struct node **tab_ptr_tree, wchar_t val[],int taille, int fl)
|
03168857
mertz
create tree op
|
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
{
if(tab_ptr_tree[fl]==NULL)cons_tree(&(tab_ptr_tree[fl]),val[0]+97);
Node* noeudtest = tab_ptr_tree[fl];
for(int i = 1;i<taille;i++)
{
int trouve = -1;
for(int j=0;j<noeudtest->nbr_fils;j++)
{
if(noeudtest->fils[j]->val==val[i])trouve=j;
}
if(trouve==-1)
{
//ajouter lettre
noeudtest->nbr_fils++;
noeudtest->fils = realloc(noeudtest->fils,(noeudtest->nbr_fils)*sizeof(struct node*));
cons_tree(&(noeudtest->fils[(noeudtest->nbr_fils)-1]),val[i]);
|
aeb78bdf
mertz
correction fin de...
|
45
|
trouve = noeudtest->nbr_fils-1;
|
03168857
mertz
create tree op
|
46
47
48
49
50
51
|
}
noeudtest = noeudtest->fils[trouve];//on jump au noeud suivant
}
noeudtest->fin = 1;
|
9cf06b18
mertz
debut_add_tree
|
52
|
}
|
f7d9ccda
mertz
ajout_libtree
|
53
|
|
284154ca
Thorsieger
gestion des accents
|
54
|
int size(wchar_t val[])
|
541fd894
mertz
on_avance_tree
|
55
56
57
58
59
60
61
62
63
|
{
int cpt = 0;
while(val[cpt]!='\0')
{
cpt++;
}
return cpt;
}
|
89b9e3f8
Thorsieger
découpage d'un texte
|
64
|
void toLowerCase(wchar_t mot[])
|
aeb78bdf
mertz
correction fin de...
|
65
|
{
|
89b9e3f8
Thorsieger
découpage d'un texte
|
66
|
for(int i=0;i<size(mot);i++)
|
aeb78bdf
mertz
correction fin de...
|
67
|
{
|
0f6db57b
Thorsieger
gestion des accen...
|
68
69
70
|
if((mot[i]<='Z' && mot[i]>='A') || (mot[i]>=192 && mot[i]<=214) || (mot[i]>=216 && mot[i]<=222))mot[i]+=32;
else if(mot[i]==138|| mot[i]==140 || mot[i]==142) mot[i]+=16;
else if(mot[i]==159) mot[i]+=96;
|
aeb78bdf
mertz
correction fin de...
|
71
72
73
|
}
}
|
0f6db57b
Thorsieger
gestion des accen...
|
74
|
void splitcarac(dico *Dico,wchar_t message[])
|
89b9e3f8
Thorsieger
découpage d'un texte
|
75
|
{
|
0f6db57b
Thorsieger
gestion des accen...
|
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
int first_letter =-1;
if(message[0]>='a' && message[0]<='z')
{
first_letter = (int)message[0]-97;
}
else
{
for(int i = 26; i < Dico->taille; i++)
{
if(Dico->tab_ptr_tree[i]->val == message[0]){first_letter = i;break;}
}
if(first_letter == -1)
{
first_letter = Dico->taille;
Dico->taille++;
Dico->tab_ptr_tree = realloc(Dico->tab_ptr_tree,(Dico->taille)*sizeof(struct node*));
Dico->tab_ptr_tree[first_letter] = NULL;
cons_tree(&(Dico->tab_ptr_tree[first_letter]),message[0]);
}
}
|
89b9e3f8
Thorsieger
découpage d'un texte
|
97
|
wchar_t *buffer;
|
76053da1
Thorsieger
update des fichiers
|
98
|
wchar_t *token = wcstok(message, L" ,?;.:/!*+\\\"()=«»", &buffer);
|
0f6db57b
Thorsieger
gestion des accen...
|
99
100
|
add(Dico->tab_ptr_tree,token,size(token),first_letter);
if(buffer!=NULL)splitcarac(Dico,buffer);
|
89b9e3f8
Thorsieger
découpage d'un texte
|
101
|
}
|
541fd894
mertz
on_avance_tree
|
102
|
|
0f6db57b
Thorsieger
gestion des accen...
|
103
|
void load_dico(FILE *fp, dico *Dico)
|
9cf06b18
mertz
debut_add_tree
|
104
|
{
|
16e67e7e
Thorsieger
l'utilisateur peu...
|
105
|
wchar_t val[3000];
|
541fd894
mertz
on_avance_tree
|
106
|
|
284154ca
Thorsieger
gestion des accents
|
107
|
while(fwscanf(fp, L"%ls",val)==1)
|
541fd894
mertz
on_avance_tree
|
108
|
{
|
89b9e3f8
Thorsieger
découpage d'un texte
|
109
|
toLowerCase(val);
|
0f6db57b
Thorsieger
gestion des accen...
|
110
|
splitcarac(Dico,val);
|
541fd894
mertz
on_avance_tree
|
111
112
113
114
115
|
}
//On peut tester la bonne ou mauvaise terminaison de la lecture
if(feof(fp)) printf("Fin normal de lecture\n");
if(ferror(fp)) printf("ERREUR de lecture\n");
|
9cf06b18
mertz
debut_add_tree
|
116
|
}
|
f7d9ccda
mertz
ajout_libtree
|
117
|
|
7ab3be6b
Thorsieger
debut free
|
118
|
void free_tree(struct node *ptr_tree)
|
9cf06b18
mertz
debut_add_tree
|
119
|
{
|
131759ee
Thorsieger
fin free arbre
|
120
121
122
|
if(ptr_tree==NULL)return;
if(ptr_tree->nbr_fils==0){free(ptr_tree->fils);return;}
for(int i=(ptr_tree->nbr_fils)-1;i>=0;i--)
|
7ab3be6b
Thorsieger
debut free
|
123
|
{
|
131759ee
Thorsieger
fin free arbre
|
124
|
free_tree(ptr_tree->fils[i]);
|
7ab3be6b
Thorsieger
debut free
|
125
126
|
free(ptr_tree->fils[i]);
}
|
131759ee
Thorsieger
fin free arbre
|
127
|
free(ptr_tree->fils);
|
7ab3be6b
Thorsieger
debut free
|
128
129
|
}
|
0f6db57b
Thorsieger
gestion des accen...
|
130
|
void free_dico(dico Dico)
|
7ab3be6b
Thorsieger
debut free
|
131
|
{
|
0f6db57b
Thorsieger
gestion des accen...
|
132
|
for(int i=0;i<Dico.taille;i++)
|
7ab3be6b
Thorsieger
debut free
|
133
|
{
|
0f6db57b
Thorsieger
gestion des accen...
|
134
|
if(Dico.tab_ptr_tree[i]!=NULL)
|
7ab3be6b
Thorsieger
debut free
|
135
|
{
|
0f6db57b
Thorsieger
gestion des accen...
|
136
137
|
free_tree(Dico.tab_ptr_tree[i]);
free(Dico.tab_ptr_tree[i]);
|
7ab3be6b
Thorsieger
debut free
|
138
139
|
}
}
|
0f6db57b
Thorsieger
gestion des accen...
|
140
|
free(Dico.tab_ptr_tree);
|
9cf06b18
mertz
debut_add_tree
|
141
|
}
|
76053da1
Thorsieger
update des fichiers
|
142
143
|
/*Recherche dans le dictionnaire*/
|
0f6db57b
Thorsieger
gestion des accen...
|
144
|
int find_mot(dico Dico,wchar_t mot[])
|
76053da1
Thorsieger
update des fichiers
|
145
|
{
|
0f6db57b
Thorsieger
gestion des accen...
|
146
147
148
149
|
if (mot==NULL) {
return 0;
}
if(mot[0]>='0' && mot[0]<='9')return 0;
|
16e67e7e
Thorsieger
l'utilisateur peu...
|
150
|
|
0f6db57b
Thorsieger
gestion des accen...
|
151
152
153
154
155
156
|
int fl =-1;
if(mot[0]>='a' && mot[0]<='z')
{
fl = (int)mot[0]-97;
}
else
|
76053da1
Thorsieger
update des fichiers
|
157
|
{
|
0f6db57b
Thorsieger
gestion des accen...
|
158
159
160
161
162
163
164
165
166
167
168
|
for(int i = 26; i < Dico.taille; i++)
{
if(Dico.tab_ptr_tree[i]->val == mot[0]){fl = i;break;}
}
if(fl == -1)return 1;
}
int taille = size(mot);
if(taille==1 && Dico.tab_ptr_tree[fl]!=NULL)
{
if(Dico.tab_ptr_tree[fl]->fin==0)return 1;
|
76053da1
Thorsieger
update des fichiers
|
169
170
|
else return 0;//vrais
}
|
0f6db57b
Thorsieger
gestion des accen...
|
171
|
if(taille==1 && Dico.tab_ptr_tree[fl]==NULL)return 1;//faux
|
76053da1
Thorsieger
update des fichiers
|
172
|
|
0f6db57b
Thorsieger
gestion des accen...
|
173
174
|
struct node *ptr_node = Dico.tab_ptr_tree[fl];
for(int i=1;i<taille;i++)
|
76053da1
Thorsieger
update des fichiers
|
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
|
{
if(ptr_node->nbr_fils==0)return 1;
for(int k=0;k<(ptr_node->nbr_fils);k++)
{
if(ptr_node->fils[k]->val==mot[i])
{
ptr_node=ptr_node->fils[k];
break;
}
else if(k+1==ptr_node->nbr_fils)return 1;
}
}
if(ptr_node->fin==0)return 1;
else return 0;
}
|
0f6db57b
Thorsieger
gestion des accen...
|
192
|
int find_erreur(dico Dico, FILE *fp)
|
76053da1
Thorsieger
update des fichiers
|
193
|
{
|
16e67e7e
Thorsieger
l'utilisateur peu...
|
194
|
wchar_t val[3000];
|
0f6db57b
Thorsieger
gestion des accen...
|
195
196
197
198
199
200
201
202
203
204
205
206
207
|
int cpt_erreur =0;
while(fwscanf(fp, L"%ls",val)==1)
{
toLowerCase(val);
cpt_erreur += split_text(Dico,val);
}
//On peut tester la bonne ou mauvaise terminaison de la lecture
if(feof(fp)) printf("Fin normal de lecture\n");
if(ferror(fp)) printf("ERREUR de lecture\n");
return cpt_erreur;
|
76053da1
Thorsieger
update des fichiers
|
208
|
}
|
0f6db57b
Thorsieger
gestion des accen...
|
209
210
211
212
213
214
215
216
217
218
219
|
int split_text(dico Dico,wchar_t message[])
{
if(message[0] == 0)return 0;
wchar_t *buffer;
wchar_t *token = wcstok(message, L" ,?;.:/!*+\\\"()=«»", &buffer);
int err = find_mot(Dico,token);
if(buffer!=NULL)err += split_text(Dico,buffer);
return err;
}
|