Blame view

tree.c 7.13 KB
293e356c   grouille   Version quasi déf...
1
2
3
4
5
6
7
  // --------------------------------------------------------
  // Projet IMA3 2019 - Lecture d'une bibliothèque
  // Décompte du nombre de fautes d'orthographe dans un texte
  // Normand Quentin & Rouillé Guillaume
  // --------------------------------------------------------
  
  // Initialisation des variables et inclusion des bibliothèques
d74431cd   grouille   Ajout de tree.c
8
9
10
  #include <stdio.h>
  #include <stdlib.h>
  #include <stdbool.h>
293e356c   grouille   Version quasi déf...
11
12
  #define MAX 30 // taille maximale d'une chaîne lue dans un fichier
  #define NB_CARAC 27 // nombre de caractères différents pouvant être identifiés -> 89 avec accentués
d74431cd   grouille   Ajout de tree.c
13
  
293e356c   grouille   Version quasi déf...
14
  // Déclaration de la structure 'trie' ou 'arbre indexé', ainsi que des pointeurs associés
d74431cd   grouille   Ajout de tree.c
15
16
17
18
  typedef struct node* Node;
  
  typedef struct node {
    char letter;
54951130   grouille   Ajout du fichier ...
19
    Node next[NB_CARAC];
d74431cd   grouille   Ajout de tree.c
20
21
22
    bool endWord;
  }node;
  
293e356c   grouille   Version quasi déf...
23
  // Fonction permettant de savoir si la structure est vide
54951130   grouille   Ajout du fichier ...
24
  bool is_empty_tree(Node Tree)
d74431cd   grouille   Ajout de tree.c
25
  {
54951130   grouille   Ajout du fichier ...
26
    return(Tree==NULL);
d74431cd   grouille   Ajout de tree.c
27
28
  }
  
293e356c   grouille   Version quasi déf...
29
  // Fonction permettant de savoir si le tableau 'next' est un tableau de pointeurs NULL
54951130   grouille   Ajout du fichier ...
30
  bool is_leaf(Node Tree)
d74431cd   grouille   Ajout de tree.c
31
  {
54951130   grouille   Ajout du fichier ...
32
33
34
35
    for(int i=0; i<NB_CARAC; i++)
      if(Tree->next[i] != NULL)
        return false;
    return true;
d74431cd   grouille   Ajout de tree.c
36
37
  }
  
293e356c   grouille   Version quasi déf...
38
  // Initialisation de la structure accueillant le dictionnaire
d74431cd   grouille   Ajout de tree.c
39
40
  void init_tree(Node* Tree)
  {
54951130   grouille   Ajout du fichier ...
41
    if(is_empty_tree(*Tree))
d74431cd   grouille   Ajout de tree.c
42
      {
54951130   grouille   Ajout du fichier ...
43
        *Tree = malloc(sizeof(node));
293e356c   grouille   Version quasi déf...
44
        (*Tree)->letter = '?'; // caractère choisi arbitrairement
d74431cd   grouille   Ajout de tree.c
45
        (* Tree)->endWord = false;
54951130   grouille   Ajout du fichier ...
46
        for(int i=0; i<NB_CARAC; i++)
293e356c   grouille   Version quasi déf...
47
          (*Tree)->next[i] = NULL; // initialisation du tableau 'next' à un tableau de pointeurs NULL
d74431cd   grouille   Ajout de tree.c
48
49
50
      }
  }
  
293e356c   grouille   Version quasi déf...
51
52
53
54
55
56
57
58
59
60
61
  // Détermine l'indice de rangement dans le tableau 'next' du caractère 'letter'
  int find_caract_indice(char letter) // Ne fonctionne pas pour les caractères accentués
  {
    //printf("__%d__\n", letter);
    if(letter>=97 && letter<=122) return letter-'a';
    if(letter>=65 && letter<=90) return letter-'A';
    if(letter == 39) return letter-13; // l'apostrophe est placée en 27ème position
    //if(letter>=192) {printf("%d", letter-166); return letter-166;} //-192+26
  }
  
  // Fonction d'ajout d'un mot 'word' dans la structure 'tree' de type 'arbre indexé'
54951130   grouille   Ajout du fichier ...
62
  void add_in_tree(Node Tree, char word[])
d74431cd   grouille   Ajout de tree.c
63
  {
293e356c   grouille   Version quasi déf...
64
65
    int j=0; // indice du caractère dans le mot 'word'
    int ind; // indice du caractère dans le tableau 'next'
54951130   grouille   Ajout du fichier ...
66
    Node Tree2 = Tree;
293e356c   grouille   Version quasi déf...
67
    while(word[j] != '\0') // on parcourt tout le mot 'word'
d74431cd   grouille   Ajout de tree.c
68
      {
293e356c   grouille   Version quasi déf...
69
70
        /*if(is_leaf(Tree2)) // a retirer
          printf("empty\t");*/
d74431cd   grouille   Ajout de tree.c
71
        char letter = word[j];
293e356c   grouille   Version quasi déf...
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
        ind = find_caract_indice(letter);
        if(Tree2->next[ind]!=NULL) // si le pointeur du tableau 'next' corresdant au caractère lu n'est pas NULL, on s'insère dans cette 'branche' de l'arbre indexé et on continue avec le caractère suivant
        {
          Tree2 = Tree2->next[ind];
  	/* printf("%c %d\t", letter, ind);
  	   printf("okA %d\n", j);*/
        }
        else // sinon, on ajoute une nouvelle cellule de type 'struct node' et on y insère les informations concernant le caractères
        {
          Node new = NULL;
          new = malloc(sizeof(node));
          new->letter = letter; // le caractère
          for(int i=0; i<NB_CARAC; i++) // un tableau de pointeurs NULL
            {
              new->next[i]=NULL;
            }
          Tree2->next[ind] = new;  // on fait pointé le tableau du caractère précédent vers cette cellule (vers ce caractère)
          /*if(!(Tree2->endWord)) // si le caractère n'est pas un caractère de fin, on le met à 'false' -> UTILITE ?
            Tree2->endWord = false;*/
          Tree2=Tree2->next[ind]; // on se place au niveau du caractère suivant dans l'arbre indexé
          /*printf("%c %d\t", letter, ind);
  	  printf("okB %d\n", j);*/
        }
d74431cd   grouille   Ajout de tree.c
95
        j++;
293e356c   grouille   Version quasi déf...
96
97
        if(word[j]=='\0') // si le caractère suivant est la fin de la chaîne, on dit que le caractère précédent est un caractère de fin
          Tree2->endWord = true;
54951130   grouille   Ajout du fichier ...
98
      }
293e356c   grouille   Version quasi déf...
99
    //printf("ok\n");
54951130   grouille   Ajout du fichier ...
100
101
  }
  
293e356c   grouille   Version quasi déf...
102
  // Fonction qui détermine si le caractère est un caractère de fin de mot (espace, ',', ';', '.', etc..)
54951130   grouille   Ajout du fichier ...
103
104
  bool is_end_caract(char letter)
  {
12c9a42f   grouille   Modification du f...
105
    if(letter==0) return true;
293e356c   grouille   Version quasi déf...
106
    if((letter>=32 && letter<=38)||(letter>=40 && letter<=47)||(letter>=58 && letter<=64)||(letter>=123 && letter<=126)||(letter==128)) return true;
54951130   grouille   Ajout du fichier ...
107
108
109
    return false;
  }
  
293e356c   grouille   Version quasi déf...
110
  // Renvoi l'indice maximum du mot 'word'
54951130   grouille   Ajout du fichier ...
111
112
113
114
115
116
117
118
  char max_index(char word[])
  {
    int index = 0;
    while(!is_end_caract(word[index]))
      index++;
    return index;
  }
  
12c9a42f   grouille   Modification du f...
119
  void scan_word(Node Tree, char word[], int* error) // si un mot démarre juste après un caractère de fin, la fonction ne lit pas les mots séparément
54951130   grouille   Ajout du fichier ...
120
  {
293e356c   grouille   Version quasi déf...
121
    bool endWord = false;
12c9a42f   grouille   Modification du f...
122
    bool stop = false;
54951130   grouille   Ajout du fichier ...
123
    int ind = 0;
293e356c   grouille   Version quasi déf...
124
    int indice;
54951130   grouille   Ajout du fichier ...
125
126
127
128
    char letter;
    Node Tree2 = Tree;
    while(!is_end_caract(word[ind]))
    {
12c9a42f   grouille   Modification du f...
129
      stop = false;
54951130   grouille   Ajout du fichier ...
130
      letter = word[ind];
293e356c   grouille   Version quasi déf...
131
132
133
      indice = find_caract_indice(letter);
      
      if(Tree2 != NULL && Tree2->next[indice]!=NULL)
54951130   grouille   Ajout du fichier ...
134
135
      {
        ind++;
293e356c   grouille   Version quasi déf...
136
        Tree2 = Tree2->next[indice];
12c9a42f   grouille   Modification du f...
137
        endWord = Tree2->endWord;
293e356c   grouille   Version quasi déf...
138
        /*if(endWord) printf("end :: %s ::\n", word);*/
54951130   grouille   Ajout du fichier ...
139
140
141
142
143
      }
      else
      {
        printf("mot : %s erreur :%c %d \n", word, word[ind], word[ind]);
        (*error)++;
293e356c   grouille   Version quasi déf...
144
        //printf("%d\n", ind);
54951130   grouille   Ajout du fichier ...
145
        ind = max_index(word);
293e356c   grouille   Version quasi déf...
146
        //printf("%d\n", ind);
12c9a42f   grouille   Modification du f...
147
        stop = true;
d74431cd   grouille   Ajout de tree.c
148
      }
54951130   grouille   Ajout du fichier ...
149
    }
12c9a42f   grouille   Modification du f...
150
151
152
153
154
    if(!endWord && !stop)
      {
        (*error)++;
        printf("---%s---\n", word);
      }
54951130   grouille   Ajout du fichier ...
155
156
  }
  
293e356c   grouille   Version quasi déf...
157
158
159
160
161
162
163
164
  bool no_accent(char word[])
  {
    int index_max = max_index(word);
    for(int i=0; i<index_max; i++)
      if(word[i]<0) return false;
    return true;
  }
  
54951130   grouille   Ajout du fichier ...
165
166
167
168
169
170
171
172
173
  void read_txt(FILE* fp, Node* Tree, int* error)
  {
    char word[MAX];
    while(1)
    {
      if(fscanf(fp, "%s", word)!=1)
        return;
      scan_word(*Tree, word, error);
    }
d74431cd   grouille   Ajout de tree.c
174
175
176
177
178
179
180
  }
  
  void read_lib(FILE* fp, Node* Tree)
  {
    char word[MAX];
    while(1)
      {
54951130   grouille   Ajout du fichier ...
181
182
        if(fscanf(fp, "%s", word)!=1)
  	return;
293e356c   grouille   Version quasi déf...
183
        // printf("--%s--\n", word);
54951130   grouille   Ajout du fichier ...
184
        //fflush(stdout);
293e356c   grouille   Version quasi déf...
185
186
        if(no_accent(word))
  	add_in_tree(*Tree, word);
d74431cd   grouille   Ajout de tree.c
187
188
189
190
191
      }
  }
  
  void print_tree(Node Tree, int index)
  {
54951130   grouille   Ajout du fichier ...
192
193
194
195
196
197
198
199
200
201
202
203
    if(is_empty_tree(Tree))
      return;
    Node cpTree = NULL;
    cpTree = Tree;
    if(cpTree->next[index]==NULL && index<26)
      {
        print_tree(cpTree, index+1);
      }
    else if(index == 26)
      {
        return;
      }
d74431cd   grouille   Ajout de tree.c
204
    else
54951130   grouille   Ajout du fichier ...
205
206
207
      {
        printf("%c\n", (cpTree->next[index])->letter);
        if((cpTree->next[index])->endWord)
293e356c   grouille   Version quasi déf...
208
209
210
211
212
    {
      printf("fin\n");
      //print_tree(cpTree, 0);
      return;
    }
54951130   grouille   Ajout du fichier ...
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
        print_tree(cpTree->next[index], 0);
      }
  }
  
  int find_index(Node tree)
  {
    Node cpTree = tree;
    int index = 0;
    while(cpTree->next[index]==NULL && index < NB_CARAC)
      index++;
    return index;
  }
  
  void print_first(Node Tree)
  {
    Node cpTree = Tree;
    int index = 0;
12c9a42f   grouille   Modification du f...
230
    while(!is_leaf(cpTree) || !(cpTree->endWord))
54951130   grouille   Ajout du fichier ...
231
232
233
      {
        index = find_index(cpTree);
        printf("%c\n", (cpTree->next[index])->letter);
12c9a42f   grouille   Modification du f...
234
        if(cpTree->next[index]->endWord) printf("fin\n");
54951130   grouille   Ajout du fichier ...
235
236
        cpTree=cpTree->next[index];
      }
d74431cd   grouille   Ajout de tree.c
237
238
  }
  
5db504f4   grouille   Ajout de la fonct...
239
  void free_tree(Node* Tree)
293e356c   grouille   Version quasi déf...
240
  {
5db504f4   grouille   Ajout de la fonct...
241
    if(*Tree!=NULL)
293e356c   grouille   Version quasi déf...
242
      {
5db504f4   grouille   Ajout de la fonct...
243
244
245
246
247
        for(int i=0; i<NB_CARAC; i++)
  	{
  	  free_tree(&(*Tree)->next[i]);
  	}
        free(*Tree);
293e356c   grouille   Version quasi déf...
248
      }
5db504f4   grouille   Ajout de la fonct...
249
  }
293e356c   grouille   Version quasi déf...
250
  
d74431cd   grouille   Ajout de tree.c
251
252
  int main(int argc, char *argv[])
  {
54951130   grouille   Ajout du fichier ...
253
254
255
256
257
258
259
260
261
262
263
    Node tree = NULL;
    int error = 0;
    FILE* fp_lib;
    FILE* fp_txt;
    fp_lib = fopen(argv[argc-2], "r");
    fp_txt = fopen(argv[argc-1], "r");
  
    init_tree(&tree);
    read_lib(fp_lib, &tree);
    read_txt(fp_txt, &tree, &error);
  
12c9a42f   grouille   Modification du f...
264
    // printf("%p\n", tree);
54951130   grouille   Ajout du fichier ...
265
  
293e356c   grouille   Version quasi déf...
266
    //print_first(tree);
12c9a42f   grouille   Modification du f...
267
268
    //printf("\n");
    //print_tree(tree, 0);
54951130   grouille   Ajout du fichier ...
269
270
271
    
    printf("erreurs : %d\n", error);
  
5db504f4   grouille   Ajout de la fonct...
272
    free_tree(&tree);
d74431cd   grouille   Ajout de tree.c
273
274
    return 0;
  }