From ffa95c23f45b04b01e90a92e603d3a06a129187b Mon Sep 17 00:00:00 2001 From: grouille Date: Thu, 2 May 2019 10:56:31 +0200 Subject: [PATCH] Version finale sans commentaire avec correcteur orthographique opérationnel --- doc.txt | 11 ++++------- main | Bin 0 -> 18808 bytes main.c | 16 +++++++++------- tree.c | 246 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------- tree.h | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++----------------------- 5 files changed, 254 insertions(+), 92 deletions(-) create mode 100755 main diff --git a/doc.txt b/doc.txt index a1638d8..c064ff3 100644 --- a/doc.txt +++ b/doc.txt @@ -1,7 +1,4 @@ -aspirateur chien. chienne, banane.banane -Doucement, Etrange. Odorat; odorant; -L'ile, L'ocean; aaee''ee -chiens -chienne -chie -Doucement. +aspirateur. Doucement, bien; +chien +chien. Doucament. +chien diff --git a/main b/main new file mode 100755 index 0000000..51ea0ce Binary files /dev/null and b/main differ diff --git a/main.c b/main.c index 8be3122..0ece9e7 100644 --- a/main.c +++ b/main.c @@ -11,6 +11,7 @@ int main(int argc, char *argv[]) init_pgrm(); Node tree = NULL; int error = 0; + int correct = 0; FILE* fp_lib; FILE* fp_txt; @@ -21,7 +22,7 @@ int main(int argc, char *argv[]) } fp_lib = fopen(argv[argc-2], "r"); - fp_txt = fopen(argv[argc-1], "r"); + fp_txt = fopen(argv[argc-1], "r+"); if(fp_lib==NULL || fp_txt==NULL) { @@ -31,17 +32,18 @@ int main(int argc, char *argv[]) init_tree(&tree); read_lib(fp_lib, &tree); - read_txt(fp_txt, &tree, &error, fp_txt); + read_txt(fp_txt, &tree, &error, &correct); - // printf("%p\n", tree); - - //print_first(tree); - //printf("\n"); - //print_tree(tree, 0); + // Si vous souhaitez imprimer l'arbre indexé complet : + //char word[MAX] = ""; + //print_tree(tree, 0, word); if(error<2) printf("Dans le texte %s, %d mot n'est pas dans le dictionnaire %s.\n", argv[argc-1], error, argv[argc-2]); else printf("Dans le texte %s, %d mots ne sont pas dans le dictionnaire %s.\n", argv[argc-1], error, argv[argc-2]); + if(correct<2) printf("%d a été corrigé.\n", correct); + else printf("%d ont été corrigés.\n", correct); + free_tree(&tree); fclose(fp_lib); fclose(fp_txt); diff --git a/tree.c b/tree.c index 571e76f..5fc760a 100644 --- a/tree.c +++ b/tree.c @@ -27,7 +27,7 @@ void init_tree(Node* Tree) if(is_empty_tree(*Tree)) { *Tree = malloc(sizeof(node)); - (*Tree)->letter = '?'; // caractère choisi arbitrairement + (*Tree)->letter = 7; // (* Tree)->endWord = false; for(int i=0; inext[i] = NULL; // initialisation du tableau 'next' à un tableau de pointeurs NULL @@ -71,9 +71,10 @@ void add_in_tree(Node Tree, char word[]) { new->next[i]=NULL; } + new->endWord = false; 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;*/ + 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);*/ @@ -102,7 +103,7 @@ char max_index(char word[]) return index; } -void scan_word(Node Tree, char word[], int* error, FILE* fp_txt) // si un mot démarre juste après un caractère de fin, la fonction ne lit pas les mots séparément +void scan_word(Node Tree, char word[], int* error, FILE* fp_txt, int* correct) // 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; @@ -124,7 +125,7 @@ void scan_word(Node Tree, char word[], int* error, FILE* fp_txt) // si un mot dà } else { - add_error(error, word, ind, Tree, fp_txt); + add_error(error, word, ind, Tree2, fp_txt, correct); //printf("%d\n", ind); ind = max_index(word); //printf("%d\n", ind); @@ -134,28 +135,134 @@ void scan_word(Node Tree, char word[], int* error, FILE* fp_txt) // si un mot dà } if(!endWord && !stop) { - add_error(error, word, ind, Tree, fp_txt); + add_error(error, word, ind, Tree2, fp_txt, correct); } } -void add_error(int* error, char word[], int index, Node Tree, FILE* fp_txt) +void add_error(int* error, char word[], int index, Node Tree, FILE* fp_txt, int* correct) { (*error)++; if(index==0) { - printf("Le mot %s ne correspond à aucun mot du dictionnaire.\n\n", word); + printf("Le mot %s ne correspond à aucun mot du dictionnaire.\n", word); return; } else if(indexdernier+1; i++) + printf("%d. %s\n", i+1, liste->mots[i]); + printf("\n"); + choix = -1; + printf("Quel mot voulez-vous sélectionner ? (Entrez %d pour ne pas corriger le mot)\n", (liste->dernier)+2); + while(choix<1 || choix>liste->dernier+2) + { + scanf("%d", &choix); + } + if(choix==(liste->dernier)+2) + { + printf("\n"); + return; + } + (*correct)++; + char word[MAX]; + strcpy(word, liste->mots[choix-1]); + printf("Le mot %s a été sélectionné.\n\n", word); + if(testEnd) add_caract(word, end); + correct_word(word, fp_txt, longueur); +} + +void correct_word(char word[], FILE* fp_txt, int longueur) +{ + FILE* fp_tamp; + fp_tamp = fopen("tampon.txt", "w+"); + if(fp_tamp==NULL) + { + printf("Erreur lors de l'ouverture du fichier tampon.\n"); + return; + } + int position = ftell(fp_txt)-longueur; + rewind(fp_txt); + char tempo; + while(ftell(fp_tamp)dernier = -1; + for(int i=0; imots[i], ""); + } } void init_pgrm(void) @@ -174,7 +281,7 @@ bool no_accent(char word[]) return true; } -void read_txt(FILE* fp, Node* Tree, int* error, FILE* fp_txt) +void read_txt(FILE* fp, Node* Tree, int* error, int* correct) { char word[MAX]; while(1) @@ -182,7 +289,7 @@ void read_txt(FILE* fp, Node* Tree, int* error, FILE* fp_txt) if(fscanf(fp, "%s", word)!=1) break; if(no_accent(word)) // !!! MOTS AVEC ACCENTS NON PRIS EN COMPTE - scan_word(*Tree, word, error, fp_txt); + scan_word(*Tree, word, error, fp, correct); } if(feof(fp)) printf("Fin de la lecture du fichier à scanner.\n\n"); if(ferror(fp)) printf("Erreur lors de la lecture du fichier à scanner.\n\n"); @@ -204,54 +311,83 @@ void read_lib(FILE* fp, Node* Tree) if(ferror(fp)) printf("Erreur lors de la lecture de la bibliothèque.\n\n"); } +void print_tree(Node Tree, int index, char word[]) +{ + if(is_empty_tree(Tree)) + return; + add_caract(word, Tree->letter); + if(is_leaf(Tree)) + { + printf("%s\n", word); + supp_caract(word); + return; + } + if(Tree->endWord) + printf("%s\n", word); + while(index < NB_CARAC) + { + if(!is_empty_tree(Tree->next[index])) + { + print_tree(Tree->next[index], 0, word); + } + index++; + } + supp_caract(word); + return; +} -void print_tree(Node Tree, int index) +void make_tree_correct(Node Tree, int index, char word[], char start[], correction liste) { - 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; - } - 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); - } + if(is_empty_tree(Tree)) + return; + add_caract(word, Tree->letter); + if(is_leaf(Tree)) + { + //printf("%s%s\n", start, word); + add_in_liste(liste, start, word); + supp_caract(word); + return; + } + if(Tree->endWord) + { + //printf("%s%s\n", start, word); + add_in_liste(liste, start, word); + } + while(index < NB_CARAC) + { + if(!is_empty_tree(Tree->next[index])) + { + make_tree_correct(Tree->next[index], 0, word, start, liste); + } + index++; + } + supp_caract(word); + return; } -int find_index(Node tree) +void add_in_liste(correction liste, char start[], char word[]) { - Node cpTree = tree; - int index = 0; - while(cpTree->next[index]==NULL && index < NB_CARAC) - index++; - return index; + char temp[MAX]; + strcpy(temp, start); + strcat(temp, word); + if(liste->dernierdernier)++; + strcpy(liste->mots[liste->dernier], temp); + } } -void print_first(Node Tree) +void add_caract(char word[], char caract) { - 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]; - } + char str[2]; + str[0] = caract; + str[1] = '\0'; + strcat(word, str); +} + +void supp_caract(char word[]) +{ + word[strlen(word)-1]='\0'; } void free_tree(Node* Tree) diff --git a/tree.h b/tree.h index 0832b86..f0ae9ea 100644 --- a/tree.h +++ b/tree.h @@ -11,6 +11,8 @@ #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 +#define NB_MOT_CORRECTION 15 // nombre de mots pour la correction +#define MAX_READ 1000 // Déclaration de la structure 'trie' ou 'arbre indexé', ainsi que des pointeurs associés typedef struct node* Node; @@ -21,57 +23,82 @@ typedef struct node { bool endWord; }node; +// Déclaration de la structure contenant les mots possible pour la correction +typedef struct liste* correction; + +typedef struct liste { + char mots[NB_MOT_CORRECTION][MAX]; + int dernier; +}liste; + // Fonction permettant de savoir si la structure est vide -bool is_empty_tree(Node Tree); +bool is_empty_tree(Node); // Fonction permettant de savoir si le tableau 'next' est un tableau de pointeurs NULL -bool is_leaf(Node Tree); +bool is_leaf(Node); // Initialisation de la structure accueillant le dictionnaire -void init_tree(Node* Tree); +void init_tree(Node*); // 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 - +int find_caract_indice(char); // Ne fonctionne pas pour les caractères accentués // Fonction d'ajout d'un mot 'word' dans la structure 'tree' de type 'arbre indexé' -void add_in_tree(Node Tree, char word[]); +void add_in_tree(Node, char*); // Fonction qui détermine si le caractère est un caractère de fin de mot (espace, ',', ';', '.', etc..) -bool is_end_caract(char letter); +bool is_end_caract(char); // Renvoi l'indice maximum du mot 'word' -char max_index(char word[]); +char max_index(char*); // Détermine si le mot 'word' est présent dans l'arbre indexé -void scan_word(Node Tree, char word[], int* error, FILE*); +void scan_word(Node, char*, int*, FILE*, int*); // Retourne 'true' si le mot 'word' est non accentué, 'false' sinon -bool no_accent(char word[]); +bool no_accent(char*); // Transmet les mots du texte à analyser à 'scan_word' -void read_txt(FILE* fp, Node* Tree, int* error, FILE*); +void read_txt(FILE*, Node*, int*, int*); // Transmet les mots de la biliothèque à 'add_in_tree' -void read_lib(FILE* fp, Node* Tree); - -// A SUPPRIMER -void print_tree(Node Tree, int index); +void read_lib(FILE*, Node*); -// A SUPPRIMER -int find_index(Node tree); - -// A SUPPRIMER -void print_first(Node Tree); +// Affiche l'arbre indexé +void print_tree(Node, int, char*); // Libère l'espace mémoire associé à l'arbre indexé -void free_tree(Node* Tree); +void free_tree(Node*); // Ajoute une erreur -void add_error(int*, char*, int, Node, FILE*); +void add_error(int*, char*, int, Node, FILE*, int*); // Corrige les erreurs -void make_correction(char *, int, Node, FILE*); +void make_correction(char *, int, Node, FILE*, int*); // Initialise le programme void init_pgrm(void); + +// Ajoute un caractère à une chaine de caractères +void add_caract(char*, char); + +// Supprime le dernier caractère d'une chaine +void supp_caract(char*); + +// Initialise le tableau contenant les mots de correction +void init_correction(correction*); + +// Imprime les mots possibles pour la correction +void make_tree_correct(Node, int, char*, char*, correction); + +// Ajoute un mot dans une liste contigûe +void add_in_liste(correction, char*, char*); + +// Choix du mot corrigé +void choice_word(correction, FILE*, char, int, int*, bool); + +// Détecte les caractères spéciaux +bool detect_end_caract(char*, char*); + +// Corrige le mot +void correct_word(char*, FILE*, int); -- libgit2 0.21.2