[C],recherche d un mot dans un texte

Fermé
sophie - 14 mai 2005 à 23:51
 lparoparo - 11 mai 2008 à 12:37
bonjour,

je suis debutante en C et ca fait pas mal de temps que je suis en train d'essayer de faire une fonction qui cherche la frequence d un mot dans un texte mais je n'arrive trjs pas.

j ai egalement essayé d utiliser la fonction strstr mais en vain.

et là je suis un peu perdue, si quelqu un peut me guider un peu ca serait tres gentil

Bonne soirée à tous et à toutes
A voir également:

9 réponses

je propose la solution suivante:

DEBUT
tu initialise ton compteur de mot à 0
tu mets ton mot dans un buffer buff
et tu parcours ton fichier grâce à getc
à chaque fois que tu tombes sur la premère lettre de
ton mot c'est à dire buff[0] tu compares caractère par caractère et tant que les caractères comparés son identique tu incrémentes i.
Tu incrémentes ton compteur seulement si une fois arrivé à la fin de buff tu as ! isalpha(getc).
Ensuite tu remets i=0 et tu recommences jusqu'à ce que tu tombe sur EOF.
FIN
2
je te remercie , mais comme je viens de commencer la prog, et qu on a pas encore fait les fichiers, je ne comprends ni le buff, ni le getc.

je me demandais s il n y avait pas un moyen plus simple pour parcourir mon texte.

j ai pensé à une fonction qui extrait les mots du texte, et une autre(que j 'ai deja faite) qui compare le mot extrait au mot recherché et qui incremente le compteur si les deux mots sont identiques.

mais mon prbl consiste à faire la fonction extraireMot

si tu as une idée,merci de m'aider

Sophie
0
sabre > sophie
15 mai 2005 à 00:31
Pour faire la fonction extraireMot il faut commencer par savoir d'où tu extrais ton mot, d'un texte bien sùr mais ce texte est contenu soit dans un fichier soit dans tableau de charactère.

On suppose que ton texte est dans un tableau de caractère.
Cré un tableau de caractère tab , et parcours le tableau de ton texte et tant que tu ne tombes pas sur un caractère non alphabétique tu recopies le caractère dans tab. Ensuite une fois que tu as ton mot dans tab tu le compare avec la fonction de librairie strcmp. Et tu répètes l'opération jusqu'a ce que tu arrives sur le caractère fin de chaîne '\0'

Je ne parle donc pas du cas où ton texte est dans un fichier...
0
sophie > sabre
15 mai 2005 à 00:38
merci bien,

je vais essayer de faire le programme,esperant ne pas rencontrer d'autres soucis
merci encore une fois
0
sam3000 Messages postés 1225 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 13 juin 2005 144
15 mai 2005 à 17:34
Je crois que le code donné par tafiscobar est parfais dans ton cas!
un exemple complet du programme que tu veux realiser pourrais etre:

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

// cs : texte complet
// ct : mot recherché
int nboccurences (char *cs, char *ct)
{
      int nb = 0;                               // initialiser le nombre d'occurences
      int lengthct = strlen (ct);  // longueyr du mot recherché
      while (1)                  // repeter toujours! la fin sera indiquée
                                        // par le "return nb"
     {
              if (strstr (cs, ct) == NULL) // ct ne se trouve pas ds cs
                    return nb;                         //  retourner le nombre
             nb++;                           // incrementer le nombre d'occurences
             if (lengthct < strlen(cs))  // reste encore du texte
                  cs = cs + lengthct;        //  sauter le mot trouvé
             else                                        // fin du texte
                   return nb;                      //  retourner le nombre
     }
}

void main()
{
  char *mot[20];
  char *texte[200];

  printf("Donner le texte: "); gets(texte);
  printf("Donner le mot: "); gets(texte);
  printf("\n");

  printf("Le nombre d'occurences est : %d\n",nboccurences(texte,mot);
}
2
merci infiniment à vous deux,
un dernier petit soucis,ben j ai fait une petite recherche pour gets que je ne connaissais pas auparavant et si j'ai bien compris elle fournit l adresse du premier caractere de la chaine...

sinon,je ne comprends pas pourquoi on passe l adresse de mot et de texte ( char *texte;char *mot) puisque, d'apres mes petites connaissances les tableaux ce sont deja des adresses.

et enfin quand tu appelles ta fonction nboccurences, ne faut-il pas par hasard l appeler nboccurences(&texte,&mot)?

faut dire qu'avec toutes les documentations que j ai lu sur les pointeurs je suis toujours perdue...
0
tafiscobar Messages postés 1277 Date d'inscription jeudi 7 décembre 2000 Statut Contributeur Dernière intervention 26 février 2009 177
15 mai 2005 à 13:03
salut, strstr (cs, ct) => retourne un pointeur sur la premiére occurence de la chaine ct ds la chaine cs. Donc tu fais une boucle et tu comptes le nombre de fois ou tu rencontres ta chaine ct. Voici un exemple de code:
int nboccurences (char *cs, char *ct) {
      int nb = 0;
      int lengthct = strlen (ct);
      while (1) {
              if (strstr (cs, ct) == NULL) // ct ne se trouve pas ds cs
                    return nb;
             nb++;  
             (lengthct < strlen(cs)) ? cs = cs + lengthct: return nb; 
    }
}

1
voilà ce que j'ai fait si tu as le temps de le regarder, j arrive pas à continuer, càd comment exploiter la fonction extrait
merci

int different (char A[], char B[])/*fonction qui compare deux mots*/
{int i=0;
int j=0;

while ((A[i]!='\0')&&(B[j]=!'\0'))
{
if (A[i]!=B[j])

i++;

if ((A[i]=='\0')&&(B[j]=='\0'))

return 0;
}
else
return 1;
}


int extrait(text[],mot[])
{char tab[N];
int i=0;

while ((text[i]>='a')&&(text[i]<='z'))
/*je n ai considéré que le cas ou le texte est écrit en miniscules
je traiterai les autres cas après */
{tab[i]=text[i];
i++;}

if (different(tab,mot)==1)
/*le mot extrait est != du mot recherché*/
return 1;
else
return 0;}
0
pour ce qui est de ta fonction int different(), tu peux utiliser à la place la fonction strcmp qui est une fonction du C qui fait déjà ce travail, elle retourne 0 si les deux mot sont égaux.
Par contre si tu insistes pour ta fonction int different()

int different (char A[], char B[])/*fonction qui compare deux mots*/
{
int i=0;
int j=0;

while ((A[i]!='\0')&&(B[j]=!'\0'))
{
if (A[i]!=B[j]) return 1; /*car si  deux lettres ne sont pas identiques c'est que les mots sont differents*/

i++;
       }
return 0; /*si les conditions de la boucle sont vérifiés c'est que les mots sont identiques*/ 

}



Pour ce qui est de ta fonction extrait je na'ai pas bien saisie mais lorsque tu fais:

while ((text[i]>='a')&&(text[i]<='z'))
{
  tab[i]=text[i];
  i++;
}



En fait la tu mets ton texte dans tab.
Enfin bref pour exploiter ta fonction extrait il ya deux cas:

1) soit tu as une liste de mot et tu veux chercher leur nombre d'occurence et j'ai compris que tu voulais faire ça
2)soit tu veux connaitre le nombre d'occurence de chaque mot du texte

Je te réponds pour le 1). la manière de procéder est la suivante:

Pour chaque mot de la liste faire
->extraire le mot dans le texte

- si le mot existe il faut que tu fasses une fonction qui compte son nombre d'occurence dans le texte, où alors tu modifie ta fonction extraire pour qu'elle compte le nombre d'occurence

Cordialement
0
sophie > sabre
15 mai 2005 à 17:10
merci pour tes explications qui me sont tres utiles, sauf que là mon probleme c'est que ma fonction extraire ne me permet d'extraire que le premier mot et je n'arrive pas à trouver la boucle adéquate me permettant d'extraire les autres mot du texte et les comparer.


mon but à la fin est bien d'avoir le nombre d occurence d'un mot dans le texte ( ce mot est entré par l utilisateur, le texte est bien défini).

donc, j'ai pas mis le compteur car je n'arrive pas encore à comparer les mots du texte au mot recherché, j'essaie donc de faire étape par étape pour me simplifier la tache.

Bonne journée
et merci encore une fois
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Merci beaucoup sauf que je suis débutante en programmation et donc je comprends pas votre programme.
0
tafiscobar Messages postés 1277 Date d'inscription jeudi 7 décembre 2000 Statut Contributeur Dernière intervention 26 février 2009 177
15 mai 2005 à 15:06
Salut, je ne sais ce que tu ne comprends pas, dis =>
On considére que le texte est chargé ds le tableau. Donc je commence a faire une recherche avec la fct strstr qui me donne la premiére occurence ds le texte (le pointeur du premier caractére) s'il trouve quelque chose, NULL sinon. Donc je fais un test, s'il ne trouve pas quelque chose, je retourne le nb qui contient le nombre d'occurences calculé. S'il trouve quelque chose, j'incremente le compteur et j'incrémente également le pointeur du texte -en faisant un test au passage pour éviter de depasser la méoire du texte de départ et si jamais je depasse le comportement est indéterminé- , pour lui dire qu'il doit commencer a faire la recherche a partir de ce pointeur. Tout cela se fait dans la boucle while. Je ne sais pas si j'ai été clair.
0
sam3000 Messages postés 1225 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 13 juin 2005 144
16 mai 2005 à 12:17
"gets" est "scanf" mais seulement pour les chaines de caracteres
la difference est que scanf n'accepte pas l'espace dans la chaine (c'est un separateur d'entrees) mais gets met tout ce qui est tapé dans la variable (pour saisir une phrase entiere)
0
je suis debutant en programatoin en c et je veu savoir un peut des information sur les fichier
0
je cherche le programme qui calcule le nombre d'occurences du premier mot dans une chaine de caractéres,et le


programme qui écrit les nombres inférieurs à1000 en lettres.
0