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 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 }
... ...