Commit fb520d8f50ec47df06a6667428f89b51d579dd10
1 parent
b2638a8a
v1 ended
Showing
9 changed files
with
97 additions
and
40 deletions
Show diff stats
README.md
1 | -# Programmation Avancée | 1 | +# Correcteur Orthographique |
2 | 2 | ||
3 | + | ||
4 | +## mode d'emploi | ||
5 | +- Compilez les fichiers (un make suffira). | ||
6 | +- Lancez le programme (./dico.exec). | ||
7 | +- Suivez les instructions et charger un dictionnaire. | ||
8 | +- Choisissez ce que vous voulez faire parmi les propositions du menu. | ||
9 | +![](img/Menu.png) | ||
10 | + | ||
11 | +## Description | ||
12 | +- Lire le dictionnaire permet de faire afficher le contenu du dictionnaire. | ||
13 | +- Lorsque que voulez tester l'orthographe vous pouvez au préalable choisir/créer un fichier de sortie en choisissant le 6), puis faire votre test en choisissant le 5). | ||
14 | + | ||
15 | + | ||
16 | + | ||
17 | +#cahier des charges | ||
3 | > Réalisation d’un correcteur orthographique | 18 | > Réalisation d’un correcteur orthographique |
4 | 19 | ||
5 | ## Objectif | 20 | ## Objectif |
@@ -17,16 +17,17 @@ byte addto_dico(dico d,const string word){ | @@ -17,16 +17,17 @@ byte addto_dico(dico d,const string word){ | ||
17 | byte isIn=0, endKind=0; | 17 | byte isIn=0, endKind=0; |
18 | endKind=end_kind(word); | 18 | endKind=end_kind(word); |
19 | if(!is_word(endKind)){ | 19 | if(!is_word(endKind)){ |
20 | - printf("%s is incorrect\n",word); | ||
21 | return -1; | 20 | return -1; |
22 | } | 21 | } |
23 | tree*tmp=&d[hash(word[0])],*temp=tmp; | 22 | tree*tmp=&d[hash(word[0])],*temp=tmp; |
23 | + | ||
24 | //1st, let's go through the tree, until the word is not in tree | 24 | //1st, let's go through the tree, until the word is not in tree |
25 | for(i=0; word[i]!='\0' && word[i]!='\'' && !is_empty(*tmp) ;i++){ | 25 | for(i=0; word[i]!='\0' && word[i]!='\'' && !is_empty(*tmp) ;i++){ |
26 | temp=tmp; | 26 | temp=tmp; |
27 | if(isalpha(word[i+1])) | 27 | if(isalpha(word[i+1])) |
28 | tmp=&((*tmp)->next[hash(word[i+1])]); | 28 | tmp=&((*tmp)->next[hash(word[i+1])]); |
29 | } | 29 | } |
30 | + | ||
30 | //if word is not ended at the end of the tree | 31 | //if word is not ended at the end of the tree |
31 | if(is_empty(*tmp)){ | 32 | if(is_empty(*tmp)){ |
32 | isIn=0; | 33 | isIn=0; |
@@ -37,15 +38,12 @@ byte addto_dico(dico d,const string word){ | @@ -37,15 +38,12 @@ byte addto_dico(dico d,const string word){ | ||
37 | tmp=&((*tmp)->next[hash(word[i+1])]); | 38 | tmp=&((*tmp)->next[hash(word[i+1])]); |
38 | } | 39 | } |
39 | (*temp)->isEnd = endKind; | 40 | (*temp)->isEnd = endKind; |
40 | - printf("%s added\n",word); | ||
41 | - fflush(stdout); | ||
42 | } | 41 | } |
42 | + | ||
43 | //if word is ended | 43 | //if word is ended |
44 | else{ | 44 | else{ |
45 | isIn=endKind & (*temp)->isEnd; | 45 | isIn=endKind & (*temp)->isEnd; |
46 | (*temp)->isEnd = endKind | (*temp)->isEnd; | 46 | (*temp)->isEnd = endKind | (*temp)->isEnd; |
47 | - printf("%s %s in\n",word,(isIn!=0)?("allready"):("not yet")); | ||
48 | - fflush(stdout); | ||
49 | } | 47 | } |
50 | return isIn; | 48 | return isIn; |
51 | } | 49 | } |
@@ -62,7 +60,7 @@ void loadfrom_file(dico d,FILE*stream){ | @@ -62,7 +60,7 @@ void loadfrom_file(dico d,FILE*stream){ | ||
62 | return; | 60 | return; |
63 | } | 61 | } |
64 | char word[30]={0}; | 62 | char word[30]={0}; |
65 | - while(fscanf(stream,"%30s",word)!=EOF){ | 63 | + while(fscanf(stream,"%30s",word)==1){ |
66 | addto_dico(d,word); | 64 | addto_dico(d,word); |
67 | } | 65 | } |
68 | printf("load success\n"); | 66 | printf("load success\n"); |
@@ -161,6 +159,12 @@ void test_words(dico d,FILE*inStream,FILE*outStream){ | @@ -161,6 +159,12 @@ void test_words(dico d,FILE*inStream,FILE*outStream){ | ||
161 | char word[30]={0}; | 159 | char word[30]={0}; |
162 | byte isIn=0,someWrong=0; | 160 | byte isIn=0,someWrong=0; |
163 | while(fscanf(inStream,"%30s",word)!=EOF){ | 161 | while(fscanf(inStream,"%30s",word)!=EOF){ |
162 | + /*//get rid of punctuation marks | ||
163 | + isIn=0; | ||
164 | + while(ischar_of_word(word[(int)isIn])) | ||
165 | + isIn++; | ||
166 | + word[(int)isIn]='\0'; | ||
167 | + */ | ||
164 | isIn=is_in(d,word); | 168 | isIn=is_in(d,word); |
165 | if(isIn<1){ | 169 | if(isIn<1){ |
166 | if(someWrong==0){ | 170 | if(someWrong==0){ |
@@ -176,8 +180,22 @@ void test_words(dico d,FILE*inStream,FILE*outStream){ | @@ -176,8 +180,22 @@ void test_words(dico d,FILE*inStream,FILE*outStream){ | ||
176 | } | 180 | } |
177 | } | 181 | } |
178 | } | 182 | } |
179 | - //ajout des mots absent? | ||
180 | - if(is_emptyLIFO(absWords))return; | 183 | + //fermer outStream pour permettre à l'utilisateur de lire le compte rendu des tests |
184 | + if(outStream!=stdout) | ||
185 | + fclose(outStream); | ||
186 | + outStream=stdout; | ||
187 | + | ||
188 | + //aucun mot ne peut être ajouté au dictionnaire ? | ||
189 | + if(is_emptyLIFO(absWords)){ | ||
190 | + if(someWrong) | ||
191 | + printf("Parmi les mots absents du dictionnaire, aucun ne peut être ajouté au dictionnaire.\n"); | ||
192 | + else | ||
193 | + printf("Felicitations !!!\nAucun des mots que vous avez entre n'est absents du dictionnaire.\n"); | ||
194 | + return; | ||
195 | + } | ||
196 | + | ||
197 | + | ||
198 | + //ajout des mots absent? | ||
181 | printf("Voulez-vous ajouter certains de ces mots au dictionnaire?\n(1 for yes,0 for no)\n"); | 199 | printf("Voulez-vous ajouter certains de ces mots au dictionnaire?\n(1 for yes,0 for no)\n"); |
182 | someWrong=saisie(0,1); | 200 | someWrong=saisie(0,1); |
183 | 201 |
@@ -19,6 +19,7 @@ void printto_terminal(dico); | @@ -19,6 +19,7 @@ void printto_terminal(dico); | ||
19 | void print(tree,FILE*,string); | 19 | void print(tree,FILE*,string); |
20 | 20 | ||
21 | void strupper(string str); | 21 | void strupper(string str); |
22 | +//uppers all letters in str | ||
22 | 23 | ||
23 | byte is_in(dico,string); | 24 | byte is_in(dico,string); |
24 | void test_words(dico,FILE*inStream,FILE*outStream); | 25 | void test_words(dico,FILE*inStream,FILE*outStream); |
22.9 KB
No preview for this file type
@@ -34,51 +34,74 @@ FILE* getFile(string mode){ | @@ -34,51 +34,74 @@ FILE* getFile(string mode){ | ||
34 | 34 | ||
35 | 35 | ||
36 | 36 | ||
37 | - | ||
38 | - | ||
39 | -void menu(dico monDico){ | 37 | +int main(void){ |
40 | int choice=0; | 38 | int choice=0; |
41 | - char word[2]={0}; | 39 | + printf("Bienvenue dans le dictonnaire !\n\n"); |
40 | + dico monDico; | ||
41 | + make_empty_dico(monDico); | ||
42 | + | ||
42 | //initialisation | 43 | //initialisation |
43 | printf("Pour commencer, veuillez charger un dictionnaire.\n"); | 44 | printf("Pour commencer, veuillez charger un dictionnaire.\n"); |
44 | FILE*fileIn=getFile("r"),*fileOut=stdout; | 45 | FILE*fileIn=getFile("r"),*fileOut=stdout; |
45 | if(fileIn==stdin) | 46 | if(fileIn==stdin) |
46 | printf("Entrez vos mots (ctrl-D pour terminer le chargement):\n"); | 47 | printf("Entrez vos mots (ctrl-D pour terminer le chargement):\n"); |
47 | loadfrom_file(monDico,fileIn); | 48 | loadfrom_file(monDico,fileIn); |
48 | - fclose(fileIn); | 49 | + if(fileIn!=stdin) |
50 | + fclose(fileIn); | ||
51 | + | ||
49 | 52 | ||
53 | + | ||
50 | //boucle | 54 | //boucle |
51 | while(1){ | 55 | while(1){ |
56 | + | ||
52 | clear(); | 57 | clear(); |
53 | //menu | 58 | //menu |
54 | printf("La sortie est branchee sur %s.\n",fileOut==stdout?"le terminal":"un fichier"); | 59 | printf("La sortie est branchee sur %s.\n",fileOut==stdout?"le terminal":"un fichier"); |
55 | printf("Que voulez-vous faire ?\n"); | 60 | printf("Que voulez-vous faire ?\n"); |
61 | + | ||
56 | //end programme | 62 | //end programme |
57 | printf("0) Fermer le programme.\n\n"); | 63 | printf("0) Fermer le programme.\n\n"); |
64 | + | ||
58 | //just about the dictionnary | 65 | //just about the dictionnary |
59 | printf("1) Lire le dictionnaire.\n"); | 66 | printf("1) Lire le dictionnaire.\n"); |
60 | printf("2) Rajouter des mots au dictionnaire\n"); | 67 | printf("2) Rajouter des mots au dictionnaire\n"); |
61 | printf("3) Effacer le dictionnaire\n"); | 68 | printf("3) Effacer le dictionnaire\n"); |
62 | printf("4) Remplacer le dictionnaire actuel par un autre dictionnaire\n\n"); | 69 | printf("4) Remplacer le dictionnaire actuel par un autre dictionnaire\n\n"); |
70 | + | ||
63 | //word correction | 71 | //word correction |
64 | printf("5) Tester si un mot, un ensemble de mot, une phrase ou un paragraphe appartient au dictionnaire.\n\n"); | 72 | printf("5) Tester si un mot, un ensemble de mot, une phrase ou un paragraphe appartient au dictionnaire.\n\n"); |
73 | + | ||
65 | //out stream | 74 | //out stream |
66 | printf("6) Définir un fichier de sortie.\n"); | 75 | printf("6) Définir un fichier de sortie.\n"); |
67 | printf("7) Définir la sortie sur le terminal.\n"); | 76 | printf("7) Définir la sortie sur le terminal.\n"); |
68 | 77 | ||
78 | + | ||
79 | + | ||
80 | + | ||
69 | //saisie du choix | 81 | //saisie du choix |
70 | - scanf("%2s",word); | ||
71 | - choice=ctoi(*word); | 82 | + choice=getchar(); |
83 | + choice=ctoi(choice); | ||
84 | + | ||
85 | + | ||
86 | + | ||
72 | 87 | ||
73 | switch(choice){ | 88 | switch(choice){ |
89 | + | ||
74 | case 0: {//sortie du programme | 90 | case 0: {//sortie du programme |
75 | if(fileOut!=stdout) | 91 | if(fileOut!=stdout) |
76 | fclose(fileOut); | 92 | fclose(fileOut); |
77 | - return;} | 93 | + fileOut=stdout; |
94 | + delete_dico(monDico); | ||
95 | + printf("Le dictionnaire vous dit aurevoir.\n\n\n"); | ||
96 | + return EXIT_SUCCESS; | ||
97 | + } | ||
98 | + | ||
99 | + | ||
78 | case 1: {//Lire le dictionnaire | 100 | case 1: {//Lire le dictionnaire |
79 | printto_file(monDico,fileOut); | 101 | printto_file(monDico,fileOut); |
80 | printf("dictionnaire imprimme\n"); | 102 | printf("dictionnaire imprimme\n"); |
81 | break;} | 103 | break;} |
104 | + | ||
82 | 105 | ||
83 | //manip sur le dictionnaire | 106 | //manip sur le dictionnaire |
84 | case 2: {//ajout | 107 | case 2: {//ajout |
@@ -88,6 +111,7 @@ void menu(dico monDico){ | @@ -88,6 +111,7 @@ void menu(dico monDico){ | ||
88 | loadfrom_file(monDico,fileIn); | 111 | loadfrom_file(monDico,fileIn); |
89 | if(fileIn!=stdin) | 112 | if(fileIn!=stdin) |
90 | fclose(fileIn); | 113 | fclose(fileIn); |
114 | + fileIn=stdin; | ||
91 | break;} | 115 | break;} |
92 | case 3: {//effacer | 116 | case 3: {//effacer |
93 | delete_dico(monDico); | 117 | delete_dico(monDico); |
@@ -95,11 +119,14 @@ void menu(dico monDico){ | @@ -95,11 +119,14 @@ void menu(dico monDico){ | ||
95 | break;} | 119 | break;} |
96 | case 4: {//remplacer | 120 | case 4: {//remplacer |
97 | delete_dico(monDico); | 121 | delete_dico(monDico); |
122 | + printf("Le dictionnaire est maintenant vide.\n"); | ||
98 | fileIn=getFile("r"); | 123 | fileIn=getFile("r"); |
99 | loadfrom_file(monDico,fileIn); | 124 | loadfrom_file(monDico,fileIn); |
100 | if(fileIn!=stdin) | 125 | if(fileIn!=stdin) |
101 | fclose(fileIn); | 126 | fclose(fileIn); |
127 | + fileIn=stdin; | ||
102 | break;} | 128 | break;} |
129 | + | ||
103 | 130 | ||
104 | 131 | ||
105 | case 5: {//faire des tests | 132 | case 5: {//faire des tests |
@@ -109,34 +136,32 @@ void menu(dico monDico){ | @@ -109,34 +136,32 @@ void menu(dico monDico){ | ||
109 | test_words(monDico,fileIn,fileOut); | 136 | test_words(monDico,fileIn,fileOut); |
110 | if(fileIn!=stdin) | 137 | if(fileIn!=stdin) |
111 | fclose(fileIn); | 138 | fclose(fileIn); |
139 | + fileIn=stdin; | ||
112 | break;} | 140 | break;} |
141 | + | ||
142 | + | ||
113 | 143 | ||
114 | //définir la sortie des tests et de "Lire" le dictionnaire | 144 | //définir la sortie des tests et de "Lire" le dictionnaire |
115 | case 6: { | 145 | case 6: { |
116 | if(fileOut!=stdout) | 146 | if(fileOut!=stdout) |
117 | fclose(fileOut); | 147 | fclose(fileOut); |
118 | - fileOut=getFile("w"); | 148 | + fileOut=getFile("a"); |
119 | break;} | 149 | break;} |
120 | case 7: { | 150 | case 7: { |
121 | if(fileOut!=stdout) | 151 | if(fileOut!=stdout) |
122 | fclose(fileOut); | 152 | fclose(fileOut); |
123 | fileOut=stdout; | 153 | fileOut=stdout; |
124 | break;} | 154 | break;} |
155 | + | ||
156 | + | ||
157 | + | ||
125 | //si le choix n'est pas parmi les précédents | 158 | //si le choix n'est pas parmi les précédents |
126 | default: {break;} | 159 | default: {break;} |
127 | } | 160 | } |
128 | - choice=0; | 161 | + |
162 | + | ||
163 | + //protection, si le scanf pour le choix a un problème | ||
164 | + choice=-1; | ||
129 | pause(); | 165 | pause(); |
130 | }//end of while | 166 | }//end of while |
131 | -} | ||
132 | - | ||
133 | - | ||
134 | -int main(void){ | ||
135 | - printf("Bienvenue dans le dictonnaire !\n\n"); | ||
136 | - dico monDico; | ||
137 | - make_empty_dico(monDico); | ||
138 | - menu(monDico); | ||
139 | - delete_dico(monDico); | ||
140 | - printf("Le dictionnaire vous dit aurevoir.\n\n\n"); | ||
141 | - return EXIT_SUCCESS; | ||
142 | } | 167 | } |
rapportDico.odt
No preview for this file type
treeh.c
@@ -29,10 +29,6 @@ void delete_tree(tree *t){ | @@ -29,10 +29,6 @@ void delete_tree(tree *t){ | ||
29 | *t=NULL; | 29 | *t=NULL; |
30 | } | 30 | } |
31 | 31 | ||
32 | - | ||
33 | - | ||
34 | - | ||
35 | - | ||
36 | //Casual functions | 32 | //Casual functions |
37 | bool is_empty(const tree t){ | 33 | bool is_empty(const tree t){ |
38 | return t==NULL; | 34 | return t==NULL; |
@@ -57,9 +53,10 @@ bool is_acronyme_end(const tree t){return (t->isEnd & ACRONYME_END);} | @@ -57,9 +53,10 @@ bool is_acronyme_end(const tree t){return (t->isEnd & ACRONYME_END);} | ||
57 | 53 | ||
58 | 54 | ||
59 | 55 | ||
60 | -//needs to check c wether isalpha | ||
61 | -int hash(char c){return c%32-1;} | ||
62 | -bool ischar_of_word(char c){return isalpha(c) || c=='\'';} | 56 | +//functions not directly related to the structure |
57 | +int hash(char c){return c%32-1;}//needs to check c wether isalpha | ||
58 | +bool ischar_of_word(char c){return (c=='\'' || isalpha(c));} | ||
59 | +bool is_word(const byte endKind){return endKind!=NOT_AN_END;} | ||
63 | 60 | ||
64 | byte end_kind(const string s){ | 61 | byte end_kind(const string s){ |
65 | byte endKind=NOT_AN_END; | 62 | byte endKind=NOT_AN_END; |
@@ -96,6 +93,3 @@ byte end_kind(const string s){ | @@ -96,6 +93,3 @@ byte end_kind(const string s){ | ||
96 | } | 93 | } |
97 | return NOT_AN_END; | 94 | return NOT_AN_END; |
98 | } | 95 | } |
99 | -bool is_word(const byte endKind){ | ||
100 | - return endKind!=0; | ||
101 | -} |
treeh.h
@@ -36,6 +36,8 @@ void delete_tree(tree*);//free(tree) and delete tree on all t->next | @@ -36,6 +36,8 @@ void delete_tree(tree*);//free(tree) and delete tree on all t->next | ||
36 | bool is_empty(const tree);//==NULL | 36 | bool is_empty(const tree);//==NULL |
37 | bool is_followed(const tree);//if true tree has following letters | 37 | bool is_followed(const tree);//if true tree has following letters |
38 | 38 | ||
39 | + | ||
40 | +//endKind functions | ||
39 | bool is_end(const tree);//true when at least 1 of the following functions is true | 41 | bool is_end(const tree);//true when at least 1 of the following functions is true |
40 | bool is_straight_end(const tree);//if true word can end here | 42 | bool is_straight_end(const tree);//if true word can end here |
41 | bool ends_with_apostrophe(const tree);//if true word can end here with apostrophe | 43 | bool ends_with_apostrophe(const tree);//if true word can end here with apostrophe |
@@ -43,6 +45,8 @@ bool is_common_end(const tree);//if true all letters are lower | @@ -43,6 +45,8 @@ bool is_common_end(const tree);//if true all letters are lower | ||
43 | bool is_proper_end(const tree);//if true 1st letter is upper | 45 | bool is_proper_end(const tree);//if true 1st letter is upper |
44 | bool is_acronyme_end(const tree);//if true all letters are upper | 46 | bool is_acronyme_end(const tree);//if true all letters are upper |
45 | 47 | ||
48 | + | ||
49 | +//other | ||
46 | int hash(char);//need to check if isalpha | 50 | int hash(char);//need to check if isalpha |
47 | bool ischar_of_word(char);//tells if char can be in a word | 51 | bool ischar_of_word(char);//tells if char can be in a word |
48 | bool is_word(byte endKind);//pass end_kind() as parameter | 52 | bool is_word(byte endKind);//pass end_kind() as parameter |