Commit df266b378df756dbc0c01930619d212915afe1a8
1 parent
e1737bb6
ajout de commentaire dans le texte
Showing
2 changed files
with
143 additions
and
119 deletions
Show diff stats
@@ -59,6 +59,7 @@ char recommencer = ' '; | @@ -59,6 +59,7 @@ char recommencer = ' '; | ||
59 | wprintf(L"Le fichier testé contient %d mots qui ne sont pas présent dans le dictionnaire.\n",result); | 59 | wprintf(L"Le fichier testé contient %d mots qui ne sont pas présent dans le dictionnaire.\n",result); |
60 | fclose(fp); | 60 | fclose(fp); |
61 | 61 | ||
62 | + //Demande si volonté de recommencer | ||
62 | wprintf(L"Voulez vous tester un autre fichier ?[Y]\n"); | 63 | wprintf(L"Voulez vous tester un autre fichier ?[Y]\n"); |
63 | wscanf(L" %c",&recommencer); | 64 | wscanf(L" %c",&recommencer); |
64 | }while(recommencer == 'Y' || recommencer == 'y'); | 65 | }while(recommencer == 'Y' || recommencer == 'y'); |
1 | #include "tree.h" | 1 | #include "tree.h" |
2 | 2 | ||
3 | -void cons_tree(struct node ** ptr_tree, wchar_t val) | 3 | +//Contruction d'un arbre |
4 | +void cons_tree(struct node **ptr_tree, wchar_t val) | ||
4 | { | 5 | { |
5 | *ptr_tree = malloc(sizeof(struct node)); | 6 | *ptr_tree = malloc(sizeof(struct node)); |
6 | (*ptr_tree)->val = val; | 7 | (*ptr_tree)->val = val; |
7 | (*ptr_tree)->fin = 0; | 8 | (*ptr_tree)->fin = 0; |
8 | - (*ptr_tree)->nbr_fils=0; | ||
9 | - (*ptr_tree)->fils = malloc(sizeof(struct node*)); | ||
10 | - (*ptr_tree)->fils[0]=NULL; | 9 | + (*ptr_tree)->nbr_fils = 0; |
10 | + (*ptr_tree)->fils = malloc(sizeof(struct node *)); //Tableau de taille 1 de pointeur de noeud | ||
11 | + (*ptr_tree)->fils[0] = NULL; //Cette node n'a pas de fils | ||
11 | } | 12 | } |
12 | 13 | ||
14 | +//Initialiation de chaque element du dictionnaire à nul | ||
13 | void mk_empty_tree(dico *Dico) | 15 | void mk_empty_tree(dico *Dico) |
14 | { | 16 | { |
15 | - for(int i = 0; i < Dico->taille; i++) | 17 | + for (int i = 0; i < Dico->taille; i++) |
16 | { | 18 | { |
17 | - Dico->tab_ptr_tree[i] = NULL; | 19 | + Dico->tab_ptr_tree[i] = NULL; //Chaque element du dico est vide |
18 | } | 20 | } |
19 | } | 21 | } |
20 | 22 | ||
23 | +//Création d'un dictionnaire pour enregister les 26 lettres de l'alphabet | ||
21 | void init_dico(dico *Dico) | 24 | void init_dico(dico *Dico) |
22 | { | 25 | { |
23 | Dico->taille = 26; | 26 | Dico->taille = 26; |
24 | - Dico->tab_ptr_tree = malloc(Dico->taille*sizeof(struct node*)); | 27 | + Dico->tab_ptr_tree = malloc(Dico->taille * sizeof(struct node *)); |
25 | mk_empty_tree(Dico); | 28 | mk_empty_tree(Dico); |
26 | } | 29 | } |
27 | 30 | ||
28 | -void add(struct node **tab_ptr_tree, wchar_t val[],int taille, int fl) | 31 | +//ajout d'un mot dans le dictionnaire dans son arbre (liée à la première lettre du mot) |
32 | +void add(struct node **tab_ptr_tree, wchar_t val[], int taille, int fl) | ||
29 | { | 33 | { |
30 | - if(tab_ptr_tree[fl]==NULL)cons_tree(&(tab_ptr_tree[fl]),val[0]+97); | ||
31 | - Node* noeudtest = tab_ptr_tree[fl]; | ||
32 | - for(int i = 1;i<taille;i++) | 34 | + if (tab_ptr_tree[fl] == NULL)cons_tree(&(tab_ptr_tree[fl]), val[0] + 97); //si l'arbre n'existe pas on le crée |
35 | + | ||
36 | + Node *noeudtest = tab_ptr_tree[fl]; | ||
37 | + for (int i = 1; i < taille; i++)//on va travailler sur toutes les lettres du mot | ||
38 | + { | ||
39 | + int trouve = -1; | ||
40 | + for (int j = 0; j < noeudtest->nbr_fils; j++)//On recherche si la lettre existe déja | ||
41 | + { | ||
42 | + if (noeudtest->fils[j]->val == val[i])trouve = j; | ||
43 | + } | ||
44 | + if (trouve == -1) | ||
33 | { | 45 | { |
34 | - int trouve = -1; | ||
35 | - for(int j=0;j<noeudtest->nbr_fils;j++) | ||
36 | - { | ||
37 | - if(noeudtest->fils[j]->val==val[i])trouve=j; | ||
38 | - } | ||
39 | - if(trouve==-1) | ||
40 | - { | ||
41 | - //ajouter lettre | ||
42 | - noeudtest->nbr_fils++; | ||
43 | - noeudtest->fils = realloc(noeudtest->fils,(noeudtest->nbr_fils)*sizeof(struct node*)); | ||
44 | - cons_tree(&(noeudtest->fils[(noeudtest->nbr_fils)-1]),val[i]); | ||
45 | - trouve = noeudtest->nbr_fils-1; | ||
46 | - } | ||
47 | - | ||
48 | - noeudtest = noeudtest->fils[trouve];//on jump au noeud suivant | 46 | + //ajouter lettre |
47 | + noeudtest->nbr_fils++; | ||
48 | + noeudtest->fils = realloc(noeudtest->fils, (noeudtest->nbr_fils) * sizeof(struct node *));//On ajoute de la place dans le tableau de fils pour y mettre celui ci | ||
49 | + cons_tree(&(noeudtest->fils[(noeudtest->nbr_fils) - 1]), val[i]); | ||
50 | + trouve = noeudtest->nbr_fils - 1; | ||
49 | } | 51 | } |
50 | - noeudtest->fin = 1; | ||
51 | 52 | ||
53 | + noeudtest = noeudtest->fils[trouve]; //on jump au noeud suivant (lettre existante ou venant d'étre créé) | ||
54 | + } | ||
55 | + noeudtest->fin = 1;//On a terminé le mot, cette lettre est la dernière du mot | ||
52 | } | 56 | } |
53 | 57 | ||
58 | +//Calcul de la taille de la chaine de caractère donnée en paramètre | ||
54 | int size(wchar_t val[]) | 59 | int size(wchar_t val[]) |
55 | { | 60 | { |
56 | int cpt = 0; | 61 | int cpt = 0; |
57 | - while(val!= NULL && val[cpt]!='\0') | ||
58 | - { | ||
59 | - cpt++; | ||
60 | - } | 62 | + while (val != NULL && val[cpt] != '\0') |
63 | + { | ||
64 | + cpt++; | ||
65 | + } | ||
61 | return cpt; | 66 | return cpt; |
62 | } | 67 | } |
63 | 68 | ||
69 | +//Tous les caractères en majuscules sont mis en minuscule (même ceux avec accent) | ||
64 | void toLowerCase(wchar_t mot[]) | 70 | void toLowerCase(wchar_t mot[]) |
65 | { | 71 | { |
66 | - for(int i=0;i<size(mot);i++) | ||
67 | - { | ||
68 | - if((mot[i]<='Z' && mot[i]>='A') || (mot[i]>=192 && mot[i]<=214) || (mot[i]>=216 && mot[i]<=222))mot[i]+=32; | ||
69 | - else if(mot[i]==138|| mot[i]==140 || mot[i]==142) mot[i]+=16; | ||
70 | - else if(mot[i]==159) mot[i]+=96; | ||
71 | - } | 72 | + for (int i = 0; i < size(mot); i++) |
73 | + { | ||
74 | + if ((mot[i] <= 'Z' && mot[i] >= 'A') || (mot[i] >= 192 && mot[i] <= 214) || (mot[i] >= 216 && mot[i] <= 222))mot[i] += 32; | ||
75 | + else if (mot[i] == 138 || mot[i] == 140 || mot[i] == 142)mot[i] += 16; | ||
76 | + else if (mot[i] == 159)mot[i] += 96; | ||
77 | + } | ||
72 | } | 78 | } |
73 | 79 | ||
74 | -void splitcarac(dico *Dico,wchar_t message[],wchar_t separateur[]) | 80 | +//Récupération de la première lettre du mot et découpade de celui ci en fonction des séparateurs |
81 | +void splitcarac(dico *Dico, wchar_t message[], wchar_t separateur[]) | ||
75 | { | 82 | { |
76 | - int first_letter =-1; | ||
77 | - if(message[0]>='a' && message[0]<='z') | 83 | + |
84 | + //On récupére l'id de la première lettre dans notre dico | ||
85 | + int first_letter = -1; | ||
86 | + if (message[0] >= 'a' && message[0] <= 'z') | ||
78 | { | 87 | { |
79 | - first_letter = (int)message[0]-97; | 88 | + first_letter = (int)message[0] - 97; |
80 | } | 89 | } |
81 | else | 90 | else |
82 | { | 91 | { |
83 | - for(int i = 26; i < Dico->taille; i++) | 92 | + for (int i = 26; i < Dico->taille; i++)//On recherche si elle existe et qu'elle n'est pas de 'a' à 'z' |
84 | { | 93 | { |
85 | - if(Dico->tab_ptr_tree[i]->val == message[0]){first_letter = i;break;} | 94 | + if (Dico->tab_ptr_tree[i]->val == message[0]) |
95 | + { | ||
96 | + first_letter = i; | ||
97 | + break; | ||
98 | + } | ||
86 | } | 99 | } |
87 | - if(first_letter == -1) | 100 | + if (first_letter == -1)//Elle n'exite pas, on l'ajoute |
88 | { | 101 | { |
89 | first_letter = Dico->taille; | 102 | first_letter = Dico->taille; |
90 | Dico->taille++; | 103 | Dico->taille++; |
91 | - Dico->tab_ptr_tree = realloc(Dico->tab_ptr_tree,(Dico->taille)*sizeof(struct node*)); | 104 | + Dico->tab_ptr_tree = realloc(Dico->tab_ptr_tree, (Dico->taille) * sizeof(struct node *));//On laisse la place pour ajouter une première lettre de mot |
92 | Dico->tab_ptr_tree[first_letter] = NULL; | 105 | Dico->tab_ptr_tree[first_letter] = NULL; |
93 | - cons_tree(&(Dico->tab_ptr_tree[first_letter]),message[0]); | 106 | + cons_tree(&(Dico->tab_ptr_tree[first_letter]), message[0]); |
94 | } | 107 | } |
95 | } | 108 | } |
96 | - | 109 | + |
97 | wchar_t *buffer; | 110 | wchar_t *buffer; |
98 | - wchar_t *token = wcstok(message, separateur, &buffer); | ||
99 | - add(Dico->tab_ptr_tree,token,size(token),first_letter); | ||
100 | - if(buffer!=NULL)splitcarac(Dico,buffer,separateur); | 111 | + wchar_t *token = wcstok(message, separateur, &buffer);//On découpe le mot selon les séparateurs |
112 | + add(Dico->tab_ptr_tree, token, size(token), first_letter);//On ajoute le mot (jusqu'au séparateur) au dictionnaire | ||
113 | + if (buffer != NULL)splitcarac(Dico, buffer, separateur);//S'il reste des mots à ajouter on recommence | ||
101 | } | 114 | } |
102 | 115 | ||
116 | +//Chargement du dictionnaire | ||
103 | void load_dico(FILE *fp, dico *Dico, wchar_t separateur[]) | 117 | void load_dico(FILE *fp, dico *Dico, wchar_t separateur[]) |
104 | { | 118 | { |
105 | - wchar_t val[3000]; | ||
106 | - | ||
107 | - while(fwscanf(fp, L"%ls",val)==1) | ||
108 | - { | ||
109 | - toLowerCase(val); | ||
110 | - splitcarac(Dico,val,separateur); | ||
111 | - } | 119 | + wchar_t val[3000];//Nombre de caractère max sur une page |
120 | + | ||
121 | + while (fwscanf(fp, L"%ls", val) == 1) | ||
122 | + { | ||
123 | + toLowerCase(val);//Les caractères sont mis en miniscule | ||
124 | + splitcarac(Dico, val, separateur);//On ajoute tous les mots au dictionnaire | ||
125 | + } | ||
112 | 126 | ||
113 | - //On peut tester la bonne ou mauvaise terminaison de la lecture | ||
114 | - if(feof(fp)) printf("Fin normal de lecture\n"); | ||
115 | - if(ferror(fp)) printf("ERREUR de lecture\n"); | 127 | + //On peut tester la bonne ou mauvaise terminaison de la lecture |
128 | + if (ferror(fp))wprintf(L"ERREUR de lecture\n"); | ||
116 | } | 129 | } |
117 | 130 | ||
131 | +//On libère toute la mémoire de chaque arbre | ||
118 | void free_tree(struct node *ptr_tree) | 132 | void free_tree(struct node *ptr_tree) |
119 | { | 133 | { |
120 | - if(ptr_tree==NULL)return; | ||
121 | - if(ptr_tree->nbr_fils==0){free(ptr_tree->fils);return;} | ||
122 | - for(int i=(ptr_tree->nbr_fils)-1;i>=0;i--) | 134 | + if (ptr_tree == NULL)return;//On a terminé |
135 | + if (ptr_tree->nbr_fils == 0)//Le noeud n'a pas de fils on peut libérer la mémoire | ||
136 | + { | ||
137 | + free(ptr_tree->fils); | ||
138 | + return; | ||
139 | + } | ||
140 | + for (int i = (ptr_tree->nbr_fils) - 1; i >= 0; i--)//si le noeud à des fils ré-exécute la fontion | ||
123 | { | 141 | { |
124 | free_tree(ptr_tree->fils[i]); | 142 | free_tree(ptr_tree->fils[i]); |
125 | free(ptr_tree->fils[i]); | 143 | free(ptr_tree->fils[i]); |
@@ -127,11 +145,12 @@ void free_tree(struct node *ptr_tree) | @@ -127,11 +145,12 @@ void free_tree(struct node *ptr_tree) | ||
127 | free(ptr_tree->fils); | 145 | free(ptr_tree->fils); |
128 | } | 146 | } |
129 | 147 | ||
148 | +//On libére la mémoire du dictionnaire | ||
130 | void free_dico(dico Dico) | 149 | void free_dico(dico Dico) |
131 | { | 150 | { |
132 | - for(int i=0;i<Dico.taille;i++) | 151 | + for (int i = 0; i < Dico.taille; i++)//On libére chaque arbre |
133 | { | 152 | { |
134 | - if(Dico.tab_ptr_tree[i]!=NULL) | 153 | + if (Dico.tab_ptr_tree[i] != NULL) |
135 | { | 154 | { |
136 | free_tree(Dico.tab_ptr_tree[i]); | 155 | free_tree(Dico.tab_ptr_tree[i]); |
137 | free(Dico.tab_ptr_tree[i]); | 156 | free(Dico.tab_ptr_tree[i]); |
@@ -140,80 +159,84 @@ void free_dico(dico Dico) | @@ -140,80 +159,84 @@ void free_dico(dico Dico) | ||
140 | free(Dico.tab_ptr_tree); | 159 | free(Dico.tab_ptr_tree); |
141 | } | 160 | } |
142 | 161 | ||
143 | -/*Recherche dans le dictionnaire*/ | ||
144 | -int find_mot(dico Dico,wchar_t mot[]) | 162 | +//Recherche dans le dictionnaire d'un mot |
163 | +int find_mot(dico Dico, wchar_t mot[]) | ||
145 | { | 164 | { |
146 | - if (mot==NULL) { | ||
147 | - return 0; | ||
148 | - } | ||
149 | - if(mot[0]>='0' && mot[0]<='9')return 0; | 165 | + if (mot == NULL)return 0; |
166 | + if (mot[0] >= '0' && mot[0] <= '9')return 0; | ||
150 | 167 | ||
151 | - int fl =-1; | ||
152 | - if(mot[0]>='a' && mot[0]<='z') | ||
153 | - { | ||
154 | - fl = (int)mot[0]-97; | ||
155 | - } | ||
156 | - else | 168 | + int fl = -1; |
169 | + if (mot[0] >= 'a' && mot[0] <= 'z') | ||
170 | + { | ||
171 | + fl = (int)mot[0] - 97; | ||
172 | + } | ||
173 | + else | ||
174 | + { | ||
175 | + for (int i = 26; i < Dico.taille; i++) | ||
157 | { | 176 | { |
158 | - for(int i = 26; i < Dico.taille; i++) | 177 | + if (Dico.tab_ptr_tree[i]->val == mot[0]) |
159 | { | 178 | { |
160 | - if(Dico.tab_ptr_tree[i]->val == mot[0]){fl = i;break;} | 179 | + fl = i; |
180 | + break; | ||
161 | } | 181 | } |
162 | - if(fl == -1)return 1; | ||
163 | } | 182 | } |
183 | + if (fl == -1)return 1; | ||
184 | + } | ||
164 | 185 | ||
165 | - int taille = size(mot); | ||
166 | - if(taille==1 && Dico.tab_ptr_tree[fl]!=NULL) | ||
167 | - { | ||
168 | - if(Dico.tab_ptr_tree[fl]->fin==0)return 1; | ||
169 | - else return 0;//vrais | ||
170 | - } | ||
171 | - if(taille==1 && Dico.tab_ptr_tree[fl]==NULL)return 1;//faux | 186 | + int taille = size(mot); |
187 | + if (taille == 1 && Dico.tab_ptr_tree[fl] != NULL) | ||
188 | + { | ||
189 | + if (Dico.tab_ptr_tree[fl]->fin == 0)return 1; | ||
190 | + else return 0; //vrais | ||
191 | + } | ||
192 | + if (taille == 1 && Dico.tab_ptr_tree[fl] == NULL)return 1; //faux | ||
172 | 193 | ||
173 | - struct node *ptr_node = Dico.tab_ptr_tree[fl]; | ||
174 | - for(int i=1;i<taille;i++) | 194 | + struct node *ptr_node = Dico.tab_ptr_tree[fl]; |
195 | + for (int i = 1; i < taille; i++) | ||
196 | + { | ||
197 | + if (ptr_node->nbr_fils == 0)return 1; | ||
198 | + for (int k = 0; k < (ptr_node->nbr_fils); k++) | ||
175 | { | 199 | { |
176 | - if(ptr_node->nbr_fils==0)return 1; | ||
177 | - for(int k=0;k<(ptr_node->nbr_fils);k++) | ||
178 | - { | ||
179 | - if(ptr_node->fils[k]->val==mot[i]) | ||
180 | - { | ||
181 | - ptr_node=ptr_node->fils[k]; | ||
182 | - break; | ||
183 | - } | ||
184 | - else if(k+1==ptr_node->nbr_fils)return 1; | ||
185 | - } | 200 | + if (ptr_node->fils[k]->val == mot[i]) |
201 | + { | ||
202 | + ptr_node = ptr_node->fils[k]; | ||
203 | + break; | ||
204 | + } | ||
205 | + else if (k + 1 == ptr_node->nbr_fils) | ||
206 | + return 1; | ||
186 | } | 207 | } |
208 | + } | ||
187 | 209 | ||
188 | - if(ptr_node->fin==0)return 1; | ||
189 | - else return 0; | 210 | + if (ptr_node->fin == 0)return 1; |
211 | + else return 0; | ||
190 | } | 212 | } |
191 | 213 | ||
192 | -int find_erreur(dico Dico, FILE *fp,wchar_t separateur[]) | 214 | +//Test de présence de chaque mot du fichier de l'utilisateur |
215 | +int find_erreur(dico Dico, FILE *fp, wchar_t separateur[]) | ||
193 | { | 216 | { |
194 | wchar_t val[3000]; | 217 | wchar_t val[3000]; |
195 | - int cpt_erreur =0; | ||
196 | - | ||
197 | - while(fwscanf(fp, L"%ls",val)==1) | ||
198 | - { | ||
199 | - toLowerCase(val); | ||
200 | - cpt_erreur += split_text(Dico,val,separateur); | ||
201 | - } | 218 | + int cpt_erreur = 0; |
202 | 219 | ||
203 | - //On peut tester la bonne ou mauvaise terminaison de la lecture | ||
204 | - if(feof(fp)) printf("Fin normal de lecture\n"); | ||
205 | - if(ferror(fp)) printf("ERREUR de lecture\n"); | 220 | + while (fwscanf(fp, L"%ls", val) == 1) |
221 | + { | ||
222 | + toLowerCase(val);//Fichier mit en minuscule | ||
223 | + cpt_erreur += split_text(Dico, val, separateur);//découpage et analyse du texte selon les séparateur | ||
224 | + } | ||
206 | 225 | ||
207 | - return cpt_erreur; | 226 | + //On peut tester la bonne ou mauvaise terminaison de la lecture |
227 | + if (ferror(fp))wprintf(L"ERREUR de lecture\n"); | ||
228 | + | ||
229 | + return cpt_erreur; | ||
208 | } | 230 | } |
209 | 231 | ||
210 | -int split_text(dico Dico,wchar_t message[], wchar_t separateur[]) | ||
211 | -{ | ||
212 | - if(message[0] == 0)return 0; | 232 | +//Découpage et analyse du texte selon les séparateur |
233 | +int split_text(dico Dico, wchar_t message[], wchar_t separateur[]) | ||
234 | +{ | ||
235 | + if (message[0] == 0)return 0; | ||
213 | wchar_t *buffer; | 236 | wchar_t *buffer; |
214 | - wchar_t *token = wcstok(message, separateur, &buffer); | ||
215 | - int err = find_mot(Dico,token); | ||
216 | - if(buffer!=NULL)err += split_text(Dico,buffer,separateur); | 237 | + wchar_t *token = wcstok(message, separateur, &buffer);//Découpage selon les caractère de séparation |
238 | + int err = find_mot(Dico, token);//recherche de la présence du mot dans le dictionnaire | ||
239 | + if (buffer != NULL)err += split_text(Dico, buffer, separateur); | ||
217 | 240 | ||
218 | return err; | 241 | return err; |
219 | } | 242 | } |