IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

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


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 20
    Points
    20
    Par défaut Compter le nombre d'occurences d'une chaine dans un texte
    Bonsoir,

    J'ai un petit problème pour compte le nombre d'occurence dans un texte
    Exemple du texte :
    Lady Montague, wife to Montague.
    Lady Capulet, wife to Capulet.
    Juliet, daughter to Capulet.
    Nurse to Juliet.

    J'arrive à diviser chaque ligne en petites chaines :
    "Lady","Montague,","wife","to","Montague".
    Avec ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void frequenceMot(char* buffer){
    int i;
     
    for(i=0;buffer[i]!='\0';i++)
    {
        if(buffer[i]!=' ')
        {
             printf("%c",buffer[i]);
          }
         else printf("\n");
     }
    }
    Le paramètre d'entrée est une ligne du texte.
    Je ne sais pas comment faire à partir d'une chaine, tester si la chaine suivant est la même.

    L'idée étant de faire un tableau à 3 colonnes avec :
    1) Mot , 2)NbOccur , 3) Pourcentage(je m'en occupe après)
    Et d'afficher :
    Le mot 1 est present 2 soit 3% du texte

    Merci d'avance pour votre aide

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    tu as plusieurs fonctions pour t'aider, soit strtok, strtok_r, strchr, strstr, isspace, ..

    Ou à la main..

    Mais il va falloir que tu stockes les mots trouvés, non ?
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    Pour voir, mon code en entier, il faut aller ici :

    http://pastetool.com/9327 pour le point c
    http://pastetool.com/9328 pour le point h
    et ici pour le main : http://pastetool.com/9329

    Voila le code (en progression) mais il ne fait pas ce que je lui demande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    void ajouterFin(char* chaine){
    mot_item* element= new mot_item;
    // On fixe la valeur de l'élément
    element->mot = chaine;
    element->taille = sizeof(chaine);
    element->occurence = element->occurence + 1;
    element->suivant = liste;
    liste = element;
    }
     
    mot_item* recherche(char* chaine){
    mot_item* element = liste;
     while(element != NULL && element->chaine != chaine){
    element = element->suivant;
     }
     if(element->chaine = chaine){
       chaine->occurence = chaine->occurence +1;
     }
     afouterFin(chaine)
    }
    // 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
    void frequenceM(char* chaine){
    int i;
    struct mot_item{
    char* mot ;          // pointer vers le mot
    int taille;      // taille du mot
    int occurence;  // compteur occurence
    mot_item *suivant;  // pointe vers le prochain element de la chaine , si c'est le
    //dernier alors il est à null
    };
    mot_item* liste = NULL;
     liste->mot = chaine;
     liste->taille = sizeof(chaine);
     liste->occurence = 0;
     liste->suivant = NULL;
     
     if(liste->mot != buffer){
       ajouterFin(buffer);
     }else{
       recherche(buffer);
     }
    }
    Le paramètre d'entrée est un chaine contenant 1 mot.
    Merci de m'aider à faire que ce bout de code marche.

    Merci d'avance pour votre aide

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    sans rentrer dans les détails :


    • l'égalité (ou la différence) entre chaînes ne s'effectue pas par "=" ou "!=" mais strcmp..

    • faire une recherche en passant à travers toute la liste donne le résultat, mais il y a des algorithes (et des strcutures de données) plus rapides (arbres).
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    Merci pour votre réponse.
    Je n'ai pas vu les arbres, donc je ne peut pas les utiliser (1er année d'ecole d'ingénieurs en informatique).

    Pour le code, après modification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    void ajouterFin(char* chaine){
    mot_item* element= new mot_item;
    // On fixe la valeur de l'élément
    element->mot = chaine;
    element->taille = sizeof(chaine);
    element->occurence = element->occurence + 1;
    element->suivant = liste;
    liste = element;
    }
     
    mot_item* recherche(char* chaine){
    mot_item* element = liste;
     while(element != NULL && element->chaine != chaine){
    element = element->suivant;
     }
     if(strcmp(element->chaine,chaine)){
       chaine->occurence = chaine->occurence +1;
     }
     afouterFin(chaine)
    }
    // 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
    void frequenceM(char* chaine){
    int i;
    struct mot_item{
    char* mot ;          // pointer vers le mot
    int taille;      // taille du mot
    int occurence;  // compteur occurence
    mot_item *suivant;  // pointe vers le prochain element de la chaine , si c'est le
    //dernier alors il est à null
    };
    mot_item* liste = NULL;
     liste->mot = chaine;
     liste->taille = sizeof(chaine);
     liste->occurence = 0;
     liste->suivant = NULL;
     
     if(strcmp(liste->mot,buffer)){
       ajouterFin(buffer);
     }else{
       recherche(buffer);
     }
    }
    Merci de corriger ce code

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    dans ta fonction recherche il y toujours un problème ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while(element != NULL && element->chaine != chaine)

    et d'autre part avec la mauvaise indentation, je ne pense pas que cette routine fasse ce que tu veux..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. compter le nombre d'occurences d'un mot dans une chaine
    Par huître dans le forum VBA Access
    Réponses: 8
    Dernier message: 15/10/2014, 15h19
  2. [XL-2010] Compter le Nombre d'occurences d'une valeur dans une colonne
    Par smer38 dans le forum Excel
    Réponses: 3
    Dernier message: 10/06/2014, 18h48
  3. Réponses: 3
    Dernier message: 09/05/2011, 14h10
  4. Compter le nombre d'occurences d'un mot dans un texte
    Par AlexandraS dans le forum Langage
    Réponses: 13
    Dernier message: 26/03/2008, 09h12
  5. Réponses: 9
    Dernier message: 22/11/2005, 21h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo