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 | 59 | wprintf(L"Le fichier testé contient %d mots qui ne sont pas présent dans le dictionnaire.\n",result); |
60 | 60 | fclose(fp); |
61 | 61 | |
62 | + //Demande si volonté de recommencer | |
62 | 63 | wprintf(L"Voulez vous tester un autre fichier ?[Y]\n"); |
63 | 64 | wscanf(L" %c",&recommencer); |
64 | 65 | }while(recommencer == 'Y' || recommencer == 'y'); | ... | ... |
1 | 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 | 6 | *ptr_tree = malloc(sizeof(struct node)); |
6 | 7 | (*ptr_tree)->val = val; |
7 | 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 | 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 | 24 | void init_dico(dico *Dico) |
22 | 25 | { |
23 | 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 | 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 | 59 | int size(wchar_t val[]) |
55 | 60 | { |
56 | 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 | 66 | return cpt; |
62 | 67 | } |
63 | 68 | |
69 | +//Tous les caractères en majuscules sont mis en minuscule (même ceux avec accent) | |
64 | 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 | 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 | 102 | first_letter = Dico->taille; |
90 | 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 | 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 | 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 | 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 | 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 | 142 | free_tree(ptr_tree->fils[i]); |
125 | 143 | free(ptr_tree->fils[i]); |
... | ... | @@ -127,11 +145,12 @@ void free_tree(struct node *ptr_tree) |
127 | 145 | free(ptr_tree->fils); |
128 | 146 | } |
129 | 147 | |
148 | +//On libére la mémoire du dictionnaire | |
130 | 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 | 155 | free_tree(Dico.tab_ptr_tree[i]); |
137 | 156 | free(Dico.tab_ptr_tree[i]); |
... | ... | @@ -140,80 +159,84 @@ void free_dico(dico Dico) |
140 | 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 | 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 | 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 | 241 | return err; |
219 | 242 | } | ... | ... |