#include #include #include #include #define A 26 struct node { wchar_t lettre; struct cell* listeFils; }; struct cell { struct node* arbre; struct cell* arbreSuivant; }; void lien_listeFils(struct cell** pL) { struct cell* p; p = malloc(sizeof(struct cell)); (*pL)->arbre->listeFils = p; } void initialisation_tab_arbre(struct node tab[]) { for(int i = 0; i < A; i++) { tab[i].lettre = 97+i; //ajout lettres minuscules tab[i].listeFils = NULL; } } void ajout_tete(wchar_t elem, struct cell** pL) { struct cell* p; p = malloc(sizeof(struct cell)); p->arbre = malloc(sizeof(struct node)); p->arbre->listeFils = NULL; p->arbre->lettre = elem; p->arbreSuivant = *pL; *pL = p; } struct cell ** insertion(wchar_t elem, struct cell** pL) { if(((*pL) == NULL) || ((*pL)->arbre->lettre > elem)) { ajout_tete(elem, pL); return &(*pL)->arbre->listeFils; } else if((*pL)->arbre->lettre == elem) { return &(*pL)->arbre->listeFils; } else { return insertion(elem, &(*pL)->arbreSuivant); } } wchar_t conversion_accent(wchar_t lettre) { // Conversion Unicode -> ASCII 256 switch(lettre) { case 192 : //À lettre = 182; break; case 193 : //Á lettre = 181; break; case 194 : // lettre = 182; break; case 198 : //Æ lettre = 146; break; case 199 : //Ç lettre = 128; break; case 200 : //È lettre = 212; break; case 201 : //É lettre = 144; break; case 202 : //Ê lettre = 210; break; case 203 : //Ë lettre = 211; break; case 204 : //Ì lettre = 141; break; case 205 : //Í lettre = 214; break; case 206 : //Î lettre = 215; break; case 207 : //Ï lettre = 216; break; case 209 : //Ñ lettre = 165; break; case 210 : //Ò lettre = 227; break; case 211 : //Ó lettre = 224; break; case 212 : //Ô lettre = 226; break; /* case 140 : //Œ lettre = break;*/ case 217 : //Ù lettre = 235; break; case 218 : //Ú lettre = 233; break; case 219 : //Û lettre = 234; break; case 220 : //Ü lettre = 154; break; case 221 : //Ý lettre = 237; break; /*case 159 : //Ÿ lettre = break;*/ case 224 : //à lettre = 233; break; case 225 : //á lettre = 160; break; case 226 : //â lettre = 131; break; case 230 : //æ lettre = 145; break; case 231 : //ç lettre = 135; break; case 232 : //è lettre = 138; break; case 233 : //é lettre = 130; break; case 234 : //ê lettre = 136; break; case 235 : //ë lettre = 137; break; case 236 : //ì lettre = 141; break; case 237 : //í lettre = 161; break; case 238 : //î lettre = 140; break; case 239 : //ï lettre = 139; break; case 241 : //ñ lettre = 164; break; case 242 : //ò lettre = 149; break; case 243 : //ó lettre = 162; break; case 244 : //ô lettre = 147; break; /*case 156 : //œ lettre = break;*/ case 249 : //ù lettre = 151; break; case 250 : //ú lettre = 163; break; case 251 : //û lettre = 150; break; /*case 252 : //ü lettre = break;*/ case 253 : //ý lettre = 263; break; case 255 : //ÿ lettre = 152; break; default : break; } return lettre; } void remplir_dico(FILE* fd, struct node tab_arbre_prcp[]) { struct cell** localisationArbre = NULL; int cptmot = 0; wchar_t motLu[50]; while(fwscanf(fd, L"%ls", motLu)==1) { wprintf(L"mot lu : %ls\n", motLu); int wchar_tEstUneLettre = 1; int i = 0; cptmot += 1; if((motLu[0] >= 'A') && (motLu[0] <= 'Z')) { localisationArbre = &tab_arbre_prcp[motLu[0]-65].listeFils; } else if((motLu[0] >= 'a') && (motLu[0] <= 'z')) { localisationArbre = &tab_arbre_prcp[motLu[0]-97].listeFils; } else { wprintf(L"Erreur remplissage dico : L'un des caracteres n'est pas une lettre\n"); wprintf(L"Mot : %ls incorrect\n", motLu); wchar_tEstUneLettre = 0; } while((motLu[i] != '\0') && (wchar_tEstUneLettre == 1)) { i += 1; wprintf(L"lettre lue %ld\n", motLu[i]); if(motLu[i] > 127) {motLu[i] = conversion_accent(motLu[i]); wprintf(L"lettre lue apres convversion : %ld\n", motLu[i]);} localisationArbre = insertion(motLu[i], localisationArbre); } wprintf(L"mot lu 2: %ls\n", motLu); } wprintf(L"\n"); fclose(fd); wprintf(L"%d mots inseres dans le dictionnaire.\n", cptmot); } struct cell** test_mot(wchar_t mot, struct cell** localisation, int* verif) { if((*localisation == NULL) || (*localisation)->arbre->lettre > mot) { *verif = 0; return NULL; } if((*localisation)->arbre->lettre == mot) { return &(*localisation)->arbre->listeFils; } else { return test_mot(mot, &(*localisation)->arbreSuivant, verif); } } void correction_txt(FILE* fd, struct node tab_arbre_prcp[]) { struct cell** localisationArbre = NULL; int verif; wchar_t motLu[50]; while(fwscanf(fd, L"%ls", motLu)==1) { wprintf(L"mot lu : %ls\n", motLu); verif = 1; int i = 0; if((motLu[0] >= 'A') && (motLu[0] <= 'Z')) { localisationArbre = &tab_arbre_prcp[motLu[0]-65].listeFils; } else if((motLu[0] >= 'a') && (motLu[0] <= 'z')) { localisationArbre = &tab_arbre_prcp[motLu[0]-97].listeFils; } else { wprintf(L"Erreur correction txt : L'un des caracteres n'est pas une lettre\n"); verif = 0; } while((verif == 1) && (motLu[i] != '\0')) { i += 1; if(motLu[i] > 127) {motLu[i] = conversion_accent(motLu[i]); wprintf(L"mot lu 2 : %ls\n", motLu);} localisationArbre = test_mot(motLu[i], localisationArbre, &verif); wprintf(L"lettre lue %ld\n", motLu[i]); } wprintf(L"\n"); if(verif == 0) wprintf(L"Mot %ls non present dans le dicitonnaire.\n", motLu); } fclose(fd); } void correction_mot(struct node tab_arbre_prcp[]) { struct cell** localisationArbre = NULL; int verif; wchar_t motLu[50]; wprintf(L"Entrez un mot ou une phrase a corriger : \n(0 pour quitter)\n"); while(wscanf(L"%ls", motLu)==1) { if(motLu[0]=='0') return; verif = 1; int i = 0; if((motLu[0] >= 'A') && (motLu[0] <= 'Z')) { localisationArbre = &tab_arbre_prcp[motLu[0]-65].listeFils; } else if((motLu[0] >= 'a') && (motLu[0] <= 'z')) { localisationArbre = &tab_arbre_prcp[motLu[0]-97].listeFils; } else { wprintf(L"Erreur correction mot : L'un des caract%lcres n'est pas une lettre\n", 130); verif = 0; } while((verif == 1) && (motLu[i] != '\0')) { i += 1; wprintf(L"lettre lue %ld\n", motLu[i]); localisationArbre = test_mot(motLu[i], localisationArbre, &verif); } if(verif == 0) wprintf(L"Mot : %ls non present dans le dicitonnaire.\n", motLu); else wprintf(L"Mot : %ls correct\n", motLu); } } int main(int argc, char* argv[]) { FILE* dico = NULL; FILE* txt = NULL; struct node tab_arbre[A]; if(argc>2) { dico = fopen(argv[1], "r"); txt = fopen(argv[2], "r"); } else { dico = NULL; txt = NULL; } if ((dico == NULL) || (txt == NULL)) { wprintf(L"Erreur : il manque un ou plusieurs fichiers !\n"); return 1; } initialisation_tab_arbre(tab_arbre); remplir_dico(dico, tab_arbre); //on suppose qu'il n'y a pas d'accents dans le dictionnaire correction_txt(txt, tab_arbre); correction_mot(tab_arbre); return 0; }