// -------------------------------------------------------- // 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 #include #include #include #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 // Déclaration de la structure 'trie' ou 'arbre indexé', ainsi que des pointeurs associés typedef struct node* Node; typedef struct node { char letter; Node next[NB_CARAC]; bool endWord; }node; // Fonction permettant de savoir si la structure est vide bool is_empty_tree(Node Tree) { return(Tree==NULL); } // Fonction permettant de savoir si le tableau 'next' est un tableau de pointeurs NULL bool is_leaf(Node Tree) { for(int i=0; inext[i] != NULL) return false; return true; } // Initialisation de la structure accueillant le dictionnaire void init_tree(Node* Tree) { if(is_empty_tree(*Tree)) { *Tree = malloc(sizeof(node)); (*Tree)->letter = '?'; // caractère choisi arbitrairement (* Tree)->endWord = false; for(int i=0; inext[i] = NULL; // initialisation du tableau 'next' à un tableau de pointeurs NULL } } // 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é' void add_in_tree(Node Tree, char word[]) { int j=0; // indice du caractère dans le mot 'word' int ind; // indice du caractère dans le tableau 'next' Node Tree2 = Tree; while(word[j] != '\0') // on parcourt tout le mot 'word' { /*if(is_leaf(Tree2)) // a retirer printf("empty\t");*/ char letter = word[j]; 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; inext[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);*/ } j++; 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; } //printf("ok\n"); } // Fonction qui détermine si le caractère est un caractère de fin de mot (espace, ',', ';', '.', etc..) bool is_end_caract(char letter) { if(letter==0) return true; if((letter>=32 && letter<=38)||(letter>=40 && letter<=47)||(letter>=58 && letter<=64)||(letter>=123 && letter<=126)||(letter==128)) return true; return false; } // Renvoi l'indice maximum du mot 'word' char max_index(char word[]) { int index = 0; while(!is_end_caract(word[index])) index++; return index; } 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 { bool endWord = false; bool stop = false; int ind = 0; int indice; char letter; Node Tree2 = Tree; while(!is_end_caract(word[ind])) { stop = false; letter = word[ind]; indice = find_caract_indice(letter); if(Tree2 != NULL && Tree2->next[indice]!=NULL) { ind++; Tree2 = Tree2->next[indice]; endWord = Tree2->endWord; /*if(endWord) printf("end :: %s ::\n", word);*/ } else { printf("mot : %s erreur :%c %d \n", word, word[ind], word[ind]); (*error)++; //printf("%d\n", ind); ind = max_index(word); //printf("%d\n", ind); stop = true; } } if(!endWord && !stop) { (*error)++; printf("---%s---\n", word); } } bool no_accent(char word[]) { int index_max = max_index(word); for(int i=0; inext[index]==NULL && index<26) { print_tree(cpTree, index+1); } else if(index == 26) { return; } else { printf("%c\n", (cpTree->next[index])->letter); if((cpTree->next[index])->endWord) { printf("fin\n"); //print_tree(cpTree, 0); return; } 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; while(!is_leaf(cpTree) || !(cpTree->endWord)) { index = find_index(cpTree); printf("%c\n", (cpTree->next[index])->letter); if(cpTree->next[index]->endWord) printf("fin\n"); cpTree=cpTree->next[index]; } } void free_tree(Node* Tree) { if(*Tree!=NULL) { for(int i=0; inext[i]); } free(*Tree); } } int main(int argc, char *argv[]) { 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); // printf("%p\n", tree); //print_first(tree); //printf("\n"); //print_tree(tree, 0); printf("erreurs : %d\n", error); free_tree(&tree); return 0; }