Dictionnaire français/anglais anglais/français en c

Description

C'est une petite application que j'avais fais pour mon BTS, alors pas super poussée :)
Cette application est un dictionnaire français/anglais anglais/français en C qui contient comme base de données deux fichiers texte qui par défaut sont anglais.txt et francais.txt écris de cette façon :
  • c*

charm=charme
chick=poussin
computer=ordinateur
  • d*

day=jour
define=définir
drink=boisson

Quand au code en lui même je ne pense pas qu'il soit très compliqué à comprendre, et au pire il y a des commentaires ;) . Je précise que ce code est compilable sous Visual C++ à cause du conio.h (je voulais faire des pauses et tout et tout pour les examinateurs), mais si vous enlevez les getch() et le conio.h, le code est compilable avec GCC.

Source / Exemple :


/* dictionnaire anglais_français */

#define EN 0 //identifie la langue anglaise
#define FR 1 //identifie la langue française
#define LN_MOT 40 //longueur maximal d'un mot du resultat par définition
#define NB_MOTS 20 // nombre de mots maximal pouvant être inscrit dans le tableau de resultat
#define T_NOM_FICHIER 7 // nom du fichier 
#define FRANCAIS "francais.txt" // fichier de la base de données 
#define ANGLAIS "anglais.txt" // autre  fichier de la base de données
#define MAX_LINE 100 // taille maximal de la ligne lue ds le fichier
#define SEPARATEUR '=' // caractère utilisé pour séparer les mots anglais/français
#define TYPE_AIDE 1 // pour lancer l'utilisation de la fonction d'aide à recherche
#define TYPE_RECH 0 // pour lancer l'utilisation de la fonction de recherche
 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>

/* Ci-dessous les variables globales */

char resultat[NB_MOTS][LN_MOT+1]; // tableau qui contient tous les resultats
char mot_trouve[LN_MOT+1]; // tableau qui prend le mot trouvé pour le renvoyer à la fonction afficer_resultat
int nb_mot_trouve=0;// le nombre de mots trouvés
int pointeur[26][2]; // tableau qui enregistre les pointeurs sur les lettres
char nouvelle[2]="o"; // sert à faire la boucle qui relance le programme
int nb_recherche=1; //conte le nombre de recherche effectuées 

/* Déclaration des fonctions */

int recherche(int langue, char *mot, int type, int nb_recherche);
void afficher_resultat(char *langue, char *mot, int type); 
int recherche_ligne(char *ligne, char *mot);
int aide_ligne(char *ligne, char *mot);
void recherche_pointeur();// enregistre les pointeurs dans un tableau pointeur[26][2]

int main()
{
  char langue[3];
  char type[2];
  char mot[LN_MOT+1];
  
  
  recherche_pointeur();// on enregistre les pointeurs
  
  while(strcmp(nouvelle,"o") == 0)
  {
    printf(" **************************************************************************************************************************\n");
    printf(" *                           Bienvenue sur le dictionnaire anglais/francais francais/anglais                              *\n");
    printf(" **************************************************************************************************************************\n");
    printf("\nPour obtenir la traduction d'un mot veuillez suivre le format de requete suivant :\n");
    printf("[fr/an] pour en francais ou en anglais [o/n] vous avez le mot en entier ou non [mot] le mot a traduire\n");
    printf("Par exemple si vous voulez la traduction du mot ange en anglais, vous taperez : fr o ange . Maintenant c'est a vous :\n");
    scanf("%s %s %s",langue, type, mot);
       
    nb_recherche++; //on incremente le nombre de recherches
    
    /* Si l'utilisateur à le mot en entier on appel la fonction afficher_resultat avec en argument la langue, le mot, et le type de recherche qui servira à appeler ici la fonction recherche_ligne, sinon idem que precedement sauf que le type de recherche servira à appeler la fonction aide_ligne */
    
    if((strcmp(type,"o") != 0) && (strcmp(type,"n") != 0)){
      //printf("%s", type);
      printf("\nle type de recherche que vouz avez entre n'est pas correcte. Veuillez redemarrer le programme\n.");
      getch();
	  exit (0);
    }
    
    if(strcmp(type,"o") == 0) {
      //printf("%s", type);
      afficher_resultat(langue,mot,TYPE_RECH); 
    }
    else{
      //printf("%s", type);
      afficher_resultat(langue,mot,TYPE_AIDE); 
    }
	system("cls");
  }
  
  return 0;
}

/* La fonction afficher_resultat a pour but d'appeler la fonction 'recherche' qui lui renvoi le nombre de mots trouvés, ensuite la fonctionaffiche les resultats trouvés et propose de relancer une recherche*/

void afficher_resultat(char *langue, char *mot, int type) 
{
  int i;
  int lan; // la langue
  int nb_mot_trouves;
  
  /* on verifie si la langue entrée par l'utilisateur est correcte, et si ce n'est pas le cas on quitte le programme */  
  
  if ((strcmp(langue, "an") != 0 ) && (strcmp(langue, "fr") != 0 )){ 
    printf("\nla langue que vous avez choisie est erronee ou n'est pas effective pour ce programme. Veuillez redemarer le programme\n");
    getch();
	exit (0);
  }
  if (strcmp(langue, "an") == 0 ){
    lan = EN;
  }
  else{
    lan = FR;
  }
  nb_mot_trouves = recherche(lan, mot, type, nb_recherche); // on récupère le nombre de mots trouvé
  
  if(nb_mot_trouves >= 1)
    {
      printf("\nIl y a %d mots trouves : \n", nb_mot_trouves);
      
      for(i=1;i<=nb_mot_trouves;i++)
	{
	  printf("%s\n", resultat[i-1]); //on affiche les résultats
	}
    }
  
  else {
    printf("Il n'y a pas de resultats a votre recherche\n");
  }
  
  printf("\nSi voulez vous effectuer une autre recherche, tapez o sinon n \n");
  scanf("%s", nouvelle);
  if((strcmp(nouvelle,"o")!= 0) && (strcmp(nouvelle,"n")!= 0)){
	  printf("La ou les valeurs saisies ne sont pas correctes. L'application va maintenant s'arreter !\n");
	  getch();
	  exit(0);
  }

  for (i=0; i<= nb_mot_trouves; i++)
    {
      strcpy(resultat[i], "\0"); // réinitialistation du tableau de resultats
    } 
  
} 

/* La fonction recherche lance la recherche et appelle les sous fonctions recherche_ligne et aide_ligne.En fonction de la variable type elle renvoie le nombre de mots trouvés à la fonction afficher_resultats et rempli le tableau le tableau de resultats */

int recherche(int langue, char *mot, int type, int nb_recherche)
{
  char ligne[MAX_LINE+1]; // tableau qui recevra la ligne lue dans le fichier d'archive
  FILE *fichier;
  char nom_fichier[T_NOM_FICHIER+1]; //contient le nom du fichier à ouvrir
  
  if(nb_recherche > 1){
    nb_mot_trouve = 0; // on réinitialise le nombre de mots trouvés si la recherche a été lancée plusieurs fois
  }
  
  
  if(langue == EN )
    strcpy(nom_fichier,ANGLAIS);
  else 
    strcpy(nom_fichier,FRANCAIS);

  /*On ouvre le ficgier d'archive */  

  fichier = fopen(nom_fichier,"r+");
  if(fichier == NULL){
    printf("impossible d'ouvrir %s\n", nom_fichier);
    return 0;
  }
  else{
    
    if(langue == EN )
      fseek(fichier, pointeur[mot[0] - 'a'][EN], SEEK_SET); // on se place au bon endroit dans le fichier grâce aux resultats de la fonction recherche_pointeur
    else 
      fseek(fichier, pointeur[mot[0] - 'a'][FR], SEEK_SET); // idem
    
    if ( type == TYPE_RECH){
      while ( fgets(ligne, MAX_LINE, fichier) != NULL) // on prend la ligne jusqu'à la fin du fichier
	{
	  if(recherche_ligne(ligne, mot) != 0) 
	    {
	      strcpy(resultat[nb_mot_trouve], mot_trouve ); // on copie le mot trouvé par la fonction recherhche_ligne le tableau resultat
	      nb_mot_trouve++;
	    }
	}
    }
    else {
      while ( fgets(ligne, MAX_LINE, fichier) != NULL)
	{
	  if(aide_ligne(ligne, mot) != 0)
	    {
	      strcpy(resultat[nb_mot_trouve], mot_trouve );// on copie le mot trouvé par la fonction aide_ligne dans le tableau resultat
	      nb_mot_trouve++;
	    }
	}
    }
    
    
    fclose(fichier);
    return nb_mot_trouve;
  }
  return 0;
}

/* La fonction recherche_ligne prend en argument le mot donné par l'utilisateur et la ligne lue par la fonction recherche, si recherche_ligne trouve le mot donné elle place sa traduction dans le tableau mot_trouve */

int recherche_ligne(char *ligne, char *mot)
{
  char *egal;
  char *avant;
  char *apres;
  
  if ( strstr(ligne, mot) != NULL )
    {
      
      egal = strchr(ligne,SEPARATEUR);                   //on regarde où est le séparateur
      apres = egal+1;                                    //pointeur vers la chaine apres le =
      apres[strlen( apres )-1] = '\0';                   //on enleve le \n
      avant = ligne;                                     //on prend la ligne avant d'enlever tout ce qu'il y a apres le =
      avant[ strlen(ligne) - (strlen(apres)+1)] = '\0';  //on enleve tout ce qu'il y a après le '='
      
      if(strcmp( avant , mot ) == 0) 
	{
	  strcpy( mot_trouve , apres); //on copie dans le tableau apres le mot apres le '='
	  return 1;
	}
      else 
	return 0;
    }
  
  return 0;
  
}

/* La fonction aide_ligne prend en argument le bout de mot que l'utitilisateur a donné au début du programme, ainsi que la ligne prise par la fonction recherche  */

int aide_ligne(char *ligne, char *mot)
{
  char *egal;
  char *avant;
  char *apres;
  
  if ( strstr(ligne, mot) != NULL )
    {
      
      egal = strchr(ligne,SEPARATEUR); //on regarde où est le séparateur
      apres = egal+1;                  //pointeur vers la chaine apres le =
      apres[strlen( apres )-1] = '\0'; // on enleve le \n
      avant = ligne;                   //on prend la ligne avant d'enlever tout ce qu'il y a apres le =
      avant[ strlen(ligne) - (strlen(apres)+1)] = '\0';//on enleve tout ce qu'il y a après le '='
      
      /* Si on trouve la chaine mot dans la chaîne avant */
      
      if(strstr( avant , mot ) != NULL ) 
	{
	  if (strncmp(avant, mot, strlen(mot)) == 0)
	    {
	      strcpy( mot_trouve , avant);//on met dans avant le mot avant le '='
	      return 1;
	    }
	  else 
		return 0;
	  
	}
      else 
	return 0;     
    }
  return 0;
}

/* La fonction recherche_pointeur lit les fichiers d'archive, et repère toutes les expressions de la forme *a* afin de noter leur emplacement pour optimiser la l'execution du programme.  */

void recherche_pointeur()
{
  char lettre[4];
  FILE *fp;
  char ligne[MAX_LINE+1];
  int j, res;
  
/* les pointeurs du fichier anglais.txt */
  
  fp = fopen(ANGLAIS,"r+");
  
  if(fp == NULL)
    printf("impossible d'ouvrir %s\n",ANGLAIS);
  else{
    
    while ( fgets(ligne, MAX_LINE, fp) != NULL)
      {
	
	for(j=0;j < 26;j++)
	  {
	    lettre[0]='*';
	    lettre[1]='a'+j;
	    lettre[2]='*';
	    lettre[3]='\0';
	    
	    if ( strstr(ligne, lettre) != NULL )
	      {
		res = ftell(fp);
		pointeur[j][EN] = res + strlen(lettre) - 3 ; //on place la position courrante de l'expression trouvée dans un tableau pointeur
		break;
	      }
	    
	    
	  }
      }
    
    fclose(fp);
    
  }
  
  /* les pointeurs du fichier francais.txt */
  fp = fopen(FRANCAIS,"r+");
  
  if(fp == NULL)
    printf("impossible d'ouvrir %s\n",FRANCAIS);
  else{
    
    while ( fgets(ligne, MAX_LINE, fp) != NULL)
      {
	
	for(j=0;j < 26;j++)
	  {
	    lettre[0]='*';
	    lettre[1]='a'+j;
	    lettre[2]='*';
	    lettre[3]='\0';
	    
	    if ( strstr(ligne, lettre) != NULL )
	      {
		res = ftell(fp);
		pointeur[j][FR] = res + strlen(lettre) - 2 ; //idem
		break;
	      }
 	  }
      }
    fclose(fp);
  }
}

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.