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 les nombres de mots dans une chaine


Sujet :

C++

  1. #1
    Membre habitué Avatar de CLeBeR
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Points : 188
    Points
    188
    Par défaut Compter les nombres de mots dans une chaine
    Bonjour,
    Je suis confronté à un problème d'algorithmie, je voudrais m'entrainer à faire un programme qui compte les mots d'une phrase, sachant qu'un mot est séparé par un espace ou un '_'. Ce que je compte faire c'est regarder si la case de l'indice sur lequel ma boucle est vaut un espace ou un '_' et si la case de l'indice suivant est différente d'un espace ou d'un '_' (donc est une lettre ou un chiffre) alors cela est compté pour un mot.
    J'ai fais le code suivant qui ne renvoi aucune erreur mais m'affiche :
    Nombre de mots : 0 Entrez la phrase à tester
    Mon programme compte bien car la phrase revient autant de fois qu'il y a des mots !

    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
    #include <string>
    #include <cctype>
    #include <iostream>
     
    using namespace std;
     
    namespace
    {
    	unsigned CompterNombreMots(string chaine)
    	{
    		unsigned NombreDeMots = 0;
    		for(unsigned i = 0; i < chaine.size() - 1; i++)
    		{
    			if (((chaine[i] == ' ') || (chaine[i] == '_')) && ((chaine[i+1] != ' ') || (chaine[i+1] != '_')))
    			{
    				NombreDeMots++; 
    			}
    		}
    		return NombreDeMots;
    	}
    }
     
    int main ()
    {
    	for (;;)
    	{
    		cout << "Entrez la phrase à tester : " << endl;
    		string chaine;
    		cin >> chaine;
    		if (chaine == "") break;
    		cout << "Nombre de mots : " << CompterNombreMots(chaine);
    	}
    	return 0;
    } // main()
    Merci de votre aide.

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 196
    Points : 17 165
    Points
    17 165
    Par défaut
    Quel est ton problème.

    Ton programme semble légitime, même si le style laisse à désirer (par exemple, avec cette boucle for infinie)

  3. #3
    Membre habitué Avatar de CLeBeR
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Points : 188
    Points
    188
    Par défaut
    Bonsoir,
    Le problème c'est que la variable NombreDeMots est toujours à 0. La boucle for c'est pour demander en permanence la phrase à tester.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 130
    Points : 33 063
    Points
    33 063
    Billets dans le blog
    4
    Par défaut
    cin>> dans une std::string ça s'arrête pas justement au 1° mot ?
    il faudrait utiliser std::getline

  5. #5
    Membre habitué Avatar de CLeBeR
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Points : 188
    Points
    188
    Par défaut
    @Bousk
    Exact, mais même en faisant ça le problème n'était pas résolu, le comptage des mots n'était pas bon. J'ai changé de méthode de comptage. Je pars de l'index 1 de ma chaine, je regarde si le précédent n'est pas un espace et l'actuel est un caractère minuscule ou majuscule. Enfin, une fois la boucle finie, je regarde si le premier caractère est une minuscule ou majuscule et si c'est le cas, je compte un mot. Voici le code, merci de votre aide.
    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
    44
    45
     
    #include <iostream>
     
    using namespace std;
     
    namespace
    {
     
        unsigned ComptageMot(string Str) 
        {
            unsigned Count = 0;
     
            for (unsigned i = 1; Str.size() > i; ++i)
            {
                if (!isalnum(Str[i-1]) && (islower(Str[i]) || isupper(Str[i])))
                {
                    Count += 1;
                }
            }
     
            if ((islower(Str[0]) || isupper(Str[0])) && 0 < Str.size())
            {
                Count += 1;
            }
     
            return Count;
        }
     
    }
     
    int main ()
    {
        while (true)
        {
            string Str;
            cout << "Saisir une chaine de caractères (vide pour sortir) : ";
            getline(cin,Str);
            if (0 == Str.size()) break;
            cout << "Vous avez saisi \"" << Str << "\"" << endl
            << "Nombre de mots de la ligne : "
            << WordCount(Str) << endl;
        }
     
        return 0;
    }// main()

  6. #6
    Invité
    Invité(e)
    Par défaut
    salut,

    sans faire des trucs avec istream et les itérateurs, un algo classique c'est de dire

    ma ligne est composée de mots et d'espaces
    ligne:espaces?, mot, ligne
    ligne:null

    ce qui grossomodo veut dire: on lit des espaces, on lit un mot, puis on recommence

    ca se transpose ainsi:
    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
     
    mustReadWhiteSpaces = true
    i = 0
    while(i < str.size()){
      if(mustReadWhiteSpaces){
        if(str[i]!=' '){
          mustReadWhiteSpaces = false
          count++ //c'est le début d'un mot
        }
      }else{
        if(!isalpha(str[i])){
          mustReadWhiteSpaces = true //c'est la fin du mot
        }
      }
      ++i
    }
    ca t'évite de regarder le précédent caractère (l'information est stockée dans mustReadWhiteSpaces)

  7. #7
    Membre habitué Avatar de CLeBeR
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Points : 188
    Points
    188
    Par défaut
    Bonsoir,
    Ton algo marche nickel je viens de l'essayer. Bravo pour la simplification je n'y avait pas pensé .
    Voilà le programme complet pour ceux que ça intéresse :
    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
    44
    45
    46
    47
    48
    49
    50
    #include <iostream>
    #include <string>
     
    using namespace std;
     
    namespace
    {
    	unsigned renvoimot(string str)
    	{
    		unsigned count = 0;
    		bool mustReadWhiteSpaces = true;
    		unsigned i = 0;
     
    		while (i < str.size())
    		{
    			if (mustReadWhiteSpaces)
    			{
    				if (str[i] != ' ' )
    				{
    					mustReadWhiteSpaces = false;
    					count++;//c'est le début d'un mot
    				}
    			}
    			else
    			{
    				if (!isalpha(str[i]))
    				{
    					mustReadWhiteSpaces = true; //c'est la fin du mot
    				}
    			}
    			++i;
    		}
    		return count;
    	}
    }
     
    int main()
    {
    	while (true)
    	{
    		string Str;
    		cout << "Saisir une chaine de caractères (vide pour sortir) : ";
    		getline(cin, Str);
    		if (0 == Str.size()) break;
    		cout << "Vous avez saisi \"" << Str << "\"" << endl
    			<< "Nombre de mots de la ligne : "
    			<< renvoimot(Str) << endl;
    	}
    	return 0;
    }// main()

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. compter le nombre de mots dans une chaine en php
    Par hadjiphp dans le forum Langage
    Réponses: 6
    Dernier message: 22/04/2009, 21h20
  2. Réponses: 4
    Dernier message: 04/03/2009, 10h18
  3. compter le nombre de mot dans une ligne fichier sous shell
    Par ninsekh dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 18/12/2008, 17h54
  4. Compter le nombre d'occurence dans une chaine
    Par shirya dans le forum Langage
    Réponses: 2
    Dernier message: 16/10/2007, 20h39
  5. Compter le nombre de caractere dans une chaine
    Par jmjmjm dans le forum C++
    Réponses: 13
    Dernier message: 19/11/2006, 11h37

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