correcteur.c 2.97 KB
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

#define MAX_LETTRES 30
#define size 255


typedef struct node {
  char l;
  struct node * lettres[size];
  bool fin_de_mot;
} Node;






bool is_empty(struct node *tree)
{
	return tree==NULL;
}






void ajout(Node **N, char lettre)
{
    Node *nouveau = malloc(sizeof(Node));
    (*nouveau).l=lettre;
    (*nouveau).fin_de_mot=0;
    for (int i=0; i<size; i++) nouveau->lettres[i]=NULL;
    *N = nouveau;
}






void ajout_alphab(Node ** pn, char *  mot,int cpt)
{
    Node * tmp= *pn;
    char lettre=mot[cpt];
    int pos;
    
    pos=lettre;
    if (lettre>='A' && lettre <= 'Z') pos =lettre -'A'+'a';
    if (lettre == '\0' || pos == 44 || pos == 46){
        (*tmp).fin_de_mot=1;
        return;
    }
    if (tmp->lettres[pos] == NULL) {
        ajout(&tmp->lettres[pos],lettre);
    }
    cpt++;
    return ajout_alphab(&tmp->lettres[pos],mot,cpt);
    
    
}






Node * charger_arbre(Node ** Arbre, char * dico){
    FILE * fp;
    char mot[MAX_LETTRES];
    fp = fopen(dico,"r");
    int i;
    while ((i = fscanf(fp,"%s",mot)) == 1){
        ajout_alphab(Arbre,mot,0);
    }
    fclose(fp);
    return *Arbre;
}






void affichage_arbre(Node * Arbre)
{
    if (is_empty(Arbre)){
        printf("arbre vide \n");
        return;
    }
    for (int i=0; i<size; i++){
        if (Arbre->lettres[i] != NULL){
            printf("%c -> %c \n",Arbre->l,Arbre->lettres[i]->l);
            affichage_arbre(Arbre->lettres[i]);
        }
    }
    if (Arbre->fin_de_mot) printf("fin de mot \n");
}






void detruire_arbre(Node ** Arbre)
{
  
    if (is_empty(*Arbre)) return;
    for (int i=0; i<size; i++){
        detruire_arbre(&(*Arbre)->lettres[i]);
    }
    free(*Arbre);
    *Arbre=NULL;
}






void initialisation(Node ** Arbre){
    Node *nouveau = malloc(sizeof(struct node));
    (*nouveau).l='?';
    (*nouveau).fin_de_mot=0;
    for (int i=0; i<size; i++) nouveau->lettres[i] = NULL;
    *Arbre = nouveau;}






int  comparaison(Node ** pn, char *  mot,int cpt,int * erreur)
{
    char lettre=mot[cpt];
    int pos = lettre ;
    if (lettre>='A' && lettre <= 'Z') pos =lettre -'A'+'a';
    cpt++;
    if (lettre == '\0' || pos == 44 || pos == 46){
      if((*pn)->fin_de_mot==0){
          (*erreur)++;
      }
      
      return (*erreur);
    }
    if (lettre == '?' || lettre == '!' || lettre == ':' || lettre == ';') return (*erreur);
    if ((*pn)->lettres[pos] == NULL) {
        (*erreur)++;
      return (*erreur);
    }
    return comparaison(&(*pn)->lettres[pos],mot,cpt,erreur);
    
    
}

void test_erreur(Node * Dico,char * texte){
    FILE * fp;
    int * erreur=malloc(sizeof(int));
    (*erreur)=0;
  char mot[MAX_LETTRES];
  fp = fopen(texte,"r");
  int i;
  while ((i = fscanf(fp,"%s",mot)) == 1){
    (*erreur)=comparaison(&Dico,mot,0,erreur);
  }
    if ((*erreur)==0 || (*erreur)==1 ) printf("%d erreur \n",(*erreur));
    else printf("%d erreurs \n",(*erreur));
    free(erreur);
  fclose(fp);
}