Votre question

Compter le nombre d'occurences d'une chaine dans un texte

Tags :
  • chaine
  • Programmation
Dernière réponse : dans Programmation
2 Avril 2011 21:13:00

J'ai un petit problème pour compte le nombre d'occurence dans un texte
Exemple du texte :

  1. Lady Montague, wife to Montague.
  2. Lady Capulet, wife to Capulet.
  3. Juliet, daughter to Capulet.
  4. Nurse to Juliet.


J'arrive à diviser chaque ligne en petites chaines :
"Lady","Montague,","wife","to","Montague".
Avec ce bout de code :
  1. void frequenceMot(char* buffer){
  2. int i;
  3.  
  4. for(i=0;buffer[i]!='\0';i++)
  5. {
  6. if(buffer[i]!=' ')
  7. {
  8. printf("%c",buffer[i]);
  9. }
  10. else printf("\n");
  11. }
  12. }

Je souhaiterais faire l'analyse sur tous les mots.
Une liste est construite pour contenir tous les mots, avec dans chaque maillon, le mot, sa taille, le nombre d’occurrences et le pointeur vers le suivant.
En fait, la procédure fréquence mot prend en compte un seul mot par "appel" et analyse si :
-Le mot est déja dans une liste, occurence = occurence +1
-Le mot est nouveau (donc n'est pas dans la liste), alors la liste "s'agrandie" avec le mot, sa taille et son occurrence.
Et ca pour tout le texte afin d'afficher un résultat comme ceci :
Le mot 'Juliet' est présent 100 fois soit 32% (exemple)
Voila le "debut" du code qui semble correspondre à ce que je recherches :
Spoiler
  1. void ajouterFin(char* chaine){
  2. mot_item* element= new mot_item;
  3. // On fixe la valeur de l'élément
  4. element->mot = chaine;
  5. element->taille = sizeof(chaine);
  6. element->occurence = element->occurence + 1;
  7. element->suivant = liste;
  8. liste = element;
  9. }
  10.  
  11. mot_item* recherche(char* chaine){
  12. mot_item* element = liste;
  13. while(element != NULL && element->chaine != chaine){
  14. element = element->suivant;
  15. }
  16. if(element->chaine = chaine){
  17. chaine->occurence = chaine->occurence +1;
  18. }
  19. afouterFin(chaine)
  20. }
  21. // Cette procédure permet d'obtenir dans une chaine, la meme chose que pour les caractères a savoir, le mot, son nombre d'apparitions et le pourcentage d'utilisation par rapport au reste du texte
  22. void frequenceM(char* chaine){
  23. int i;
  24. struct mot_item{
  25. char* mot ; // pointer vers le mot
  26. int taille; // taille du mot
  27. int occurence; // compteur occurence
  28. mot_item *suivant; // pointe vers le prochain element de la chaine , si c'est le
  29. //dernier alors il est à null
  30. };
  31. mot_item* liste = NULL;
  32. liste->mot = chaine;
  33. liste->taille = sizeof(chaine);
  34. liste->occurence = 0;
  35. liste->suivant = NULL;
  36.  
  37. if(liste->mot != buffer){
  38. ajouterFin(buffer);
  39. }else{
  40. recherche(buffer);
  41. }
  42. }


Merci d'avance pour votre aide.

Autres pages sur : compter nombre occurences chaine texte

a b L Programmation
3 Avril 2011 11:47:34

Bon, en python, ça se fait en 3 lignes de code, mais je suppose que c'est pour apprendre le C.

Je te compiles à la main:

  1. element->occurence = element->occurence + 1;

"element->occurence" n'est pas initialisé, donc tu auras n'importe quoi dedans.

  1. element->suivant = liste;

j'imagine que "liste" est une variable globale, alors ce n'est pas propre car tu ne pourras pas adapter ton programme à la gestions de plusieurs listes (possible bug).

  1. element->suivant = liste;
  2. liste = element;

Là tu ajoutes en début pas en fin.

  1. while(element != NULL && element->chaine != chaine){

Tu te contentes de comparer des pointeur, c'est-à-dire que tu compare les adresses mémoires où se trouvent "element->chaine" et "chaine". Comme tu as ces 2 chaines forcément à des endroits différents en mémomire, les adresses seront toujours différents, et donc ton inégalité sera toujours vraie. Il te faut comparer tous les caractères qui se trouve à ces adresses et pas les adresses elle-même. Pour ça tu peux soit comparer caractère par caractère, soit utiliser la fonction "strcmp()" qui fait ce travail.

  1. if(element->chaine = chaine){
  2. chaine->occurence = chaine->occurence +1;
  3. }

Attention, si tu lances 2 fois a fonction "recherche", ça va continuer à augmenter. Ce n'est pas propre car tu ne peux pas adapter ton programme à plusieurs appels de recherche (possible bug). Le mieux est de tout réinitialiser au début de la fonction.

  1. struct mot_item{

il faut de définir en dehors de la fonction pour être accessible partout. Idem pour "liste", mais mieux vaut le passer en paramètre plutôt que d'utiliser une variable globale (cf commentaires précédents)
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS