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 | 18 | > Réalisation d’un correcteur orthographique |
4 | 19 | |
5 | 20 | ## Objectif | ... | ... |
... | ... | @@ -17,16 +17,17 @@ byte addto_dico(dico d,const string word){ |
17 | 17 | byte isIn=0, endKind=0; |
18 | 18 | endKind=end_kind(word); |
19 | 19 | if(!is_word(endKind)){ |
20 | - printf("%s is incorrect\n",word); | |
21 | 20 | return -1; |
22 | 21 | } |
23 | 22 | tree*tmp=&d[hash(word[0])],*temp=tmp; |
23 | + | |
24 | 24 | //1st, let's go through the tree, until the word is not in tree |
25 | 25 | for(i=0; word[i]!='\0' && word[i]!='\'' && !is_empty(*tmp) ;i++){ |
26 | 26 | temp=tmp; |
27 | 27 | if(isalpha(word[i+1])) |
28 | 28 | tmp=&((*tmp)->next[hash(word[i+1])]); |
29 | 29 | } |
30 | + | |
30 | 31 | //if word is not ended at the end of the tree |
31 | 32 | if(is_empty(*tmp)){ |
32 | 33 | isIn=0; |
... | ... | @@ -37,15 +38,12 @@ byte addto_dico(dico d,const string word){ |
37 | 38 | tmp=&((*tmp)->next[hash(word[i+1])]); |
38 | 39 | } |
39 | 40 | (*temp)->isEnd = endKind; |
40 | - printf("%s added\n",word); | |
41 | - fflush(stdout); | |
42 | 41 | } |
42 | + | |
43 | 43 | //if word is ended |
44 | 44 | else{ |
45 | 45 | isIn=endKind & (*temp)->isEnd; |
46 | 46 | (*temp)->isEnd = endKind | (*temp)->isEnd; |
47 | - printf("%s %s in\n",word,(isIn!=0)?("allready"):("not yet")); | |
48 | - fflush(stdout); | |
49 | 47 | } |
50 | 48 | return isIn; |
51 | 49 | } |
... | ... | @@ -62,7 +60,7 @@ void loadfrom_file(dico d,FILE*stream){ |
62 | 60 | return; |
63 | 61 | } |
64 | 62 | char word[30]={0}; |
65 | - while(fscanf(stream,"%30s",word)!=EOF){ | |
63 | + while(fscanf(stream,"%30s",word)==1){ | |
66 | 64 | addto_dico(d,word); |
67 | 65 | } |
68 | 66 | printf("load success\n"); |
... | ... | @@ -161,6 +159,12 @@ void test_words(dico d,FILE*inStream,FILE*outStream){ |
161 | 159 | char word[30]={0}; |
162 | 160 | byte isIn=0,someWrong=0; |
163 | 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 | 168 | isIn=is_in(d,word); |
165 | 169 | if(isIn<1){ |
166 | 170 | if(someWrong==0){ |
... | ... | @@ -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 | 199 | printf("Voulez-vous ajouter certains de ces mots au dictionnaire?\n(1 for yes,0 for no)\n"); |
182 | 200 | someWrong=saisie(0,1); |
183 | 201 | ... | ... |
22.9 KB
No preview for this file type
... | ... | @@ -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 | 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 | 43 | //initialisation |
43 | 44 | printf("Pour commencer, veuillez charger un dictionnaire.\n"); |
44 | 45 | FILE*fileIn=getFile("r"),*fileOut=stdout; |
45 | 46 | if(fileIn==stdin) |
46 | 47 | printf("Entrez vos mots (ctrl-D pour terminer le chargement):\n"); |
47 | 48 | loadfrom_file(monDico,fileIn); |
48 | - fclose(fileIn); | |
49 | + if(fileIn!=stdin) | |
50 | + fclose(fileIn); | |
51 | + | |
49 | 52 | |
53 | + | |
50 | 54 | //boucle |
51 | 55 | while(1){ |
56 | + | |
52 | 57 | clear(); |
53 | 58 | //menu |
54 | 59 | printf("La sortie est branchee sur %s.\n",fileOut==stdout?"le terminal":"un fichier"); |
55 | 60 | printf("Que voulez-vous faire ?\n"); |
61 | + | |
56 | 62 | //end programme |
57 | 63 | printf("0) Fermer le programme.\n\n"); |
64 | + | |
58 | 65 | //just about the dictionnary |
59 | 66 | printf("1) Lire le dictionnaire.\n"); |
60 | 67 | printf("2) Rajouter des mots au dictionnaire\n"); |
61 | 68 | printf("3) Effacer le dictionnaire\n"); |
62 | 69 | printf("4) Remplacer le dictionnaire actuel par un autre dictionnaire\n\n"); |
70 | + | |
63 | 71 | //word correction |
64 | 72 | printf("5) Tester si un mot, un ensemble de mot, une phrase ou un paragraphe appartient au dictionnaire.\n\n"); |
73 | + | |
65 | 74 | //out stream |
66 | 75 | printf("6) Définir un fichier de sortie.\n"); |
67 | 76 | printf("7) Définir la sortie sur le terminal.\n"); |
68 | 77 | |
78 | + | |
79 | + | |
80 | + | |
69 | 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 | 88 | switch(choice){ |
89 | + | |
74 | 90 | case 0: {//sortie du programme |
75 | 91 | if(fileOut!=stdout) |
76 | 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 | 100 | case 1: {//Lire le dictionnaire |
79 | 101 | printto_file(monDico,fileOut); |
80 | 102 | printf("dictionnaire imprimme\n"); |
81 | 103 | break;} |
104 | + | |
82 | 105 | |
83 | 106 | //manip sur le dictionnaire |
84 | 107 | case 2: {//ajout |
... | ... | @@ -88,6 +111,7 @@ void menu(dico monDico){ |
88 | 111 | loadfrom_file(monDico,fileIn); |
89 | 112 | if(fileIn!=stdin) |
90 | 113 | fclose(fileIn); |
114 | + fileIn=stdin; | |
91 | 115 | break;} |
92 | 116 | case 3: {//effacer |
93 | 117 | delete_dico(monDico); |
... | ... | @@ -95,11 +119,14 @@ void menu(dico monDico){ |
95 | 119 | break;} |
96 | 120 | case 4: {//remplacer |
97 | 121 | delete_dico(monDico); |
122 | + printf("Le dictionnaire est maintenant vide.\n"); | |
98 | 123 | fileIn=getFile("r"); |
99 | 124 | loadfrom_file(monDico,fileIn); |
100 | 125 | if(fileIn!=stdin) |
101 | 126 | fclose(fileIn); |
127 | + fileIn=stdin; | |
102 | 128 | break;} |
129 | + | |
103 | 130 | |
104 | 131 | |
105 | 132 | case 5: {//faire des tests |
... | ... | @@ -109,34 +136,32 @@ void menu(dico monDico){ |
109 | 136 | test_words(monDico,fileIn,fileOut); |
110 | 137 | if(fileIn!=stdin) |
111 | 138 | fclose(fileIn); |
139 | + fileIn=stdin; | |
112 | 140 | break;} |
141 | + | |
142 | + | |
113 | 143 | |
114 | 144 | //définir la sortie des tests et de "Lire" le dictionnaire |
115 | 145 | case 6: { |
116 | 146 | if(fileOut!=stdout) |
117 | 147 | fclose(fileOut); |
118 | - fileOut=getFile("w"); | |
148 | + fileOut=getFile("a"); | |
119 | 149 | break;} |
120 | 150 | case 7: { |
121 | 151 | if(fileOut!=stdout) |
122 | 152 | fclose(fileOut); |
123 | 153 | fileOut=stdout; |
124 | 154 | break;} |
155 | + | |
156 | + | |
157 | + | |
125 | 158 | //si le choix n'est pas parmi les précédents |
126 | 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 | 165 | pause(); |
130 | 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 | 29 | *t=NULL; |
30 | 30 | } |
31 | 31 | |
32 | - | |
33 | - | |
34 | - | |
35 | - | |
36 | 32 | //Casual functions |
37 | 33 | bool is_empty(const tree t){ |
38 | 34 | return t==NULL; |
... | ... | @@ -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 | 61 | byte end_kind(const string s){ |
65 | 62 | byte endKind=NOT_AN_END; |
... | ... | @@ -96,6 +93,3 @@ byte end_kind(const string s){ |
96 | 93 | } |
97 | 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 | 36 | bool is_empty(const tree);//==NULL |
37 | 37 | bool is_followed(const tree);//if true tree has following letters |
38 | 38 | |
39 | + | |
40 | +//endKind functions | |
39 | 41 | bool is_end(const tree);//true when at least 1 of the following functions is true |
40 | 42 | bool is_straight_end(const tree);//if true word can end here |
41 | 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 | 45 | bool is_proper_end(const tree);//if true 1st letter is upper |
44 | 46 | bool is_acronyme_end(const tree);//if true all letters are upper |
45 | 47 | |
48 | + | |
49 | +//other | |
46 | 50 | int hash(char);//need to check if isalpha |
47 | 51 | bool ischar_of_word(char);//tells if char can be in a word |
48 | 52 | bool is_word(byte endKind);//pass end_kind() as parameter | ... | ... |