Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

Déterminer la langue d'un texte en C


lolipo

Messages recommandés

string.h n'est pas une "bibliothèque", c'est uniquement un fichier de prototypes de fonctions se trouvant dans les librairies C (donc pas de linkage à prévoir sur une bibliothèque autre que celles utilisées par défaut par le compilateur)

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

Salut à tous, le programme compile bien mais il n'affiche que la langue est espagnole pour les trois textes...

Je vous met le programme que j'ai chiader en dessous. si vous voyez une erreur, dîtes-moi. Merci.

/*Programme QuelleLangue*/

/*Les "strcpy" et les "strcmp" sont des commandes specifiques au traitement 
des chaines
de caracteres. Le strcpy=string copy, c'est la procedure d'affectation d'une 
chaine de
caracteres a une variable, le strcmp=string compare, c'est la procedure de 
comparaison de
chaine de caractere*/

/*Bibliotheques (library en anglais), c'est la que le compilateur va aller 
chercher les commandes pour comprendre celles qui sont utilisees*/
#include<stdlib.h> // les commandes les plus courantes
#include<stdio.h>
#include<string.h> // traitement des chaines de caractères

/*Definition de deux nouveaux types pour les tableaux de chaines de 
caracteres*/
typedef char chaine25[25];
typedef char chaine3[3];

int main()
{

/*Declaration des variables*/
int i, lang, tablettres[10001];
chaine25 tabmots[10001], nomfichier;
FILE *f;

/*Prototypage des procedures: le prototypage consiste a declarer les 
procedures et/ou les fonctions que l'on utilise
il faut en donner le type:toujours void pour une procedure, le nom, puis 
entre parentheses on met les types des parametres
suivis ou non d'une etoile selon que le parametre est passe par valeur ou 
par adresse*/
int Langue(chaine25, int);
int GetWord(FILE *f, chaine25 *adr []);

do {
 printf("Nom du fichier: ");
 scanf("%s", &nomfichier);
 f = fopen(nomfichier, "r");
 if (f == NULL) printf ("Erreur: fichier inexistant.\n");
} while (f == NULL);

i = 1;
while (i <= 10000 && !feof(f)) {
 tablettres[i] = GetWord(f, &tabmots[i]);
 i++;
}

fclose(f);

/* Determination effective de la langue */
lang = 0;
i = 1;
while (!lang) {
 lang = Langue(tabmots[i], tablettres[i]);
 i++;
}
switch (lang) {
 case 1:
 	printf ("Le texte est de langue anglaise.\n");
 	break;
 case 2:
 	printf ("Le texte est de langue française.\n");
 	break;
 case 3:
 	printf ("Le texte est de langue espagnole.\n");
 	break;
 default:
 	printf ("Langue du texte indéterminée.\n");
}
}

int GetWord(FILE *f, chaine25 *adr [])
{
chaine25 a;
char carlu;
int i, j;

fread(&carlu, 1, 1, f);

i = 1;
while (carlu != ' ' && carlu != '\n' && carlu != '.' && carlu != ',' && carlu != ';' && carlu != '?' && !feof(f) && i < 25) {
 strcpy(*adr[i], &carlu);
 i++;
 fread(&carlu, 1, 1, f);
}

return i;
}

int Langue(chaine25 a, int nb)
{
chaine25 
tabfr[32]={"","et","à","des","une","qui","je","dans","par","ne","pour","du","il","comme", "pas","plus","mon","au","nous","sa","avec","ses","cette","ma","ce","ou","lui","ces", "tout","elle","mais","où"};

chaine25 
tabang[32]={"","the","of","off","to","and","in","his","that","he","is","was","it","as","with", "i","have","be","not","him","by","for","so","which","this","had","very","has","one","some", "from","at"};

chaine25 
tabesp[13]={"","el","los","las","por","para","una","libro","sobre","como","cuanto","cuando", "quien"};

int i, result;

result = 0;
for (i = 1; i <= 31; i++) if (!strncmp(a, tabang[i], nb)) result = 1;
for (i = 1; i <= 31; i++) if (!strncmp(a, tabfr[i], nb)) result = 2;
for (i = 1; i <= 12; i++) if (!strncmp(a, tabesp[i], nb)) result = 3;

// printf ("Test du mot %s\n", a);
return result;
}

Lien vers le commentaire
Partager sur d’autres sites

1) évite les commentaires // ce n'est pas parce que le compilateur sait aussi compiler du C++ qu'il faut en abuser. Ca ne fait pas partie du langage C

 

2) les prototypes à l'intérieur du main() je n'avais encore jamais vu ça, il fallait oser... les prototypes se mettent avant toute implémentation de fonction (et/ou "procédure"). Ils ne sont nécessaires que dans deux cas : on les met dans un .h pour pouvoir cross-compiler des .c utilisant chacun des fonctions de l'autre, on les met au début du fichier .c parce qu'elle s'appellent les unes les autres et il serait trop fastidieux de les implémenter dans leur ordre de dépendance. Ce n'est pas ton cas donc tu peux implémenter Langue() et GetWord() avant ton main() sans souci.

 

3) dans GetWord, les variables a et j sont inutilisées

 

4) GetWord est défini en (FILE * , char***) et tu l'appelles avec (FILE * , char**), ou pour reprendre ta syntaxe, le second argument est censé être un chaine25*[] et tu lui passes un chaine25*

 

5) ton main() est supposé retourner un int or il ne contient aucun "return"

 

6) une boucle sur un tableau de taille fixe sans condition sur l'index, c'est le segfault assuré (ligne 48)

 

7) au niveau de l'algo, tel qu'il est fait c'est toujours le dernier dico contenant la lettre recherchée qui sera retourné. il est donc normal que ton texte soit toujours indiqué comme étant "espagnol"... Ce qu'il fait ici peut se résumer par "c'est le dernier qui l'a qui gagne"

 

8) les commentaires sont inefficaces, on passe de longues minutes à se demander ce que fait chaque fonction ou ce que tu aurais voulu qu'elle fasse...

Lien vers le commentaire
Partager sur d’autres sites

bon voilà le code épuré :

/*Programme QuelleLangue */

/*Les "strcpy" et les "strcmp" sont des commandes specifiques au traitement
  des chaines
  de caracteres. Le strcpy=string copy, c'est la procedure d'affectation d'une
  chaine de
  caracteres a une variable, le strcmp=string compare, c'est la procedure de
  comparaison de
  chaine de caractere */

/*Bibliotheques (library en anglais), c'est la que le compilateur va aller
  chercher les commandes pour comprendre celles qui sont utilisees */
#include<stdlib.h>              // les commandes les plus courantes
#include<stdio.h>
#include<string.h>              // traitement des chaines de caractères

/*Definition de deux nouveaux types pour les tableaux de chaines de
  caracteres */
typedef char chaine25[25];
typedef char chaine3[3];

int GetWord (FILE * f, chaine25 * adr)
{
  char carlu;
  int i;

  fread (&carlu, 1, 1, f);

  i = 1;
  while (carlu != ' ' && carlu != '\n' && carlu != '.' && carlu != ',' && carlu != ';' && carlu != '?' && !feof (f) && i < 25)
  {
     strcpy (adr[i], &carlu);
     i++;
     fread (&carlu, 1, 1, f);
  }

  return i;
}

int Langue (chaine25 a, size_t nb)
{
  chaine25 tabfr[32] =
  {
     "", "et", "à", "des", "une", "qui", "je", "dans", "par", "ne", "pour",
     "du", "il", "comme", "pas", "plus", "mon", "au", "nous", "sa", "avec",
     "ses", "cette", "ma", "ce", "ou", "lui", "ces", "tout", "elle", "mais", "où"
  };

  chaine25
     tabang[32] =
  {
     "", "the", "of", "off", "to", "and", "in", "his", "that", "he", "is",
     "was", "it", "as", "with", "i", "have", "be", "not", "him", "by", "for",
     "so", "which", "this", "had", "very", "has", "one", "some", "from", "at"
  };

  chaine25
     tabesp[13] =
  {
     "", "el", "los", "las", "por", "para", "una", "libro", "sobre", "como",
     "cuanto", "cuando", "quien"
  };

  int i, result;

  result = 0;
  for (i = 1; i <= 31; i++)
     if (!strncmp (a, tabang[i], nb))
        result = 1;
  for (i = 1; i <= 31; i++)
     if (!strncmp (a, tabfr[i], nb))
        result = 2;
  for (i = 1; i <= 12; i++)
     if (!strncmp (a, tabesp[i], nb))
        result = 3;

// printf ("Test du mot %s\n", a);
  return result;
}

int main (void)
{

/*Declaration des variables */
  int i, lang;
  size_t tablettres[10001];
  chaine25 tabmots[10001], nomfichier;
  FILE *f;

  do
  {
     printf ("Nom du fichier: ");
     scanf ("%s", nomfichier);
     f = fopen (nomfichier, "r");
     if (f == NULL)
        printf ("Erreur: fichier inexistant.\n");
  }
  while (f == NULL);

  i = 1;
  while (i <= 10000 && !feof (f))
  {
     tablettres[i] = GetWord (f, &tabmots[i]);
     i++;
  }

  fclose (f);

/* Determination effective de la langue */
  lang = 0;
  i = 1;
  while (!lang)
  {
     lang = Langue (tabmots[i], tablettres[i]);
     i++;
  }
  switch (lang)
  {
  case 1:
     printf ("Le texte est de langue anglaise.\n");
     break;
  case 2:
     printf ("Le texte est de langue française.\n");
     break;
  case 3:
     printf ("Le texte est de langue espagnole.\n");
     break;
  default:
     printf ("Langue du texte indéterminée.\n");
  }
  
  return 0;
}

 

voilà, un pb reste : inversion entre l'anglais et l'espagnol... il trouve la bonne langue pour le français (il est chauvin)!!

Lien vers le commentaire
Partager sur d’autres sites

Au début j'avais pas trop compris pourquoi tu avais une chaine vide dans tes tableaux de mots, mais je viens de voir que tu commences à compter à 1 au lieu de 0 ... (ca explique aussi les tailles fixes à <un nombre rond> + 1 )

 

Pour GetWord, au lieu de lire caractère par caractère, tu peux utiliser strtok() pour obtenir chaque mot d'une chaine de caractères. Au passage, si tu tombes sur une expression de plus de 25 "lettres" dans ton fichier, tu cours à la catastrophe (segfault).

 

Tu peux te passer de tablettres (qui, si j'ai bien compris, donne la taille du mot lu) en utilisant strlen() qui donne la longueur d'une chaine de caractères.

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...