Commit df266b378df756dbc0c01930619d212915afe1a8

Authored by Thorsieger
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 }