Commit fb520d8f50ec47df06a6667428f89b51d579dd10

Authored by bjeanlou
1 parent b2638a8a

v1 ended

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);
img/Menu.png 0 → 100644

22.9 KB

img/rapportDico.pdf 0 → 100644
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
@@ -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-&gt;isEnd &amp; ACRONYME_END);} @@ -57,9 +53,10 @@ bool is_acronyme_end(const tree t){return (t-&gt;isEnd &amp; 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 -}  
@@ -36,6 +36,8 @@ void delete_tree(tree*);//free(tree) and delete tree on all t-&gt;next @@ -36,6 +36,8 @@ void delete_tree(tree*);//free(tree) and delete tree on all t-&gt;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