C++

Résolu/Fermé
sanaa1 Messages postés 64 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 20 septembre 2008 - 2 janv. 2008 à 21:06
mamiemando Messages postés 33113 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 mai 2024 - 3 janv. 2008 à 10:11
Bonjour,
Ecrire un programme qui saisit une chaîne pouvant contenir des espaces et qui affiche chaque mot de la chaîne, le séparateur étant l'espace.
Exemple, on tape : je pense donc je suis
Le programme affiche :
mot 1 : je
mot 2 : pense
mot 3 : donc
mot 4 : je
mot 5 : suis

voila l'ennonce de mon exercice ,j'ai trouve la solution mais j'ai rien compris si qql pourrait m'expliquer d'avantage ce serait tres sympa.
merci bcpppp
#include<iostream>
using namespace std;


int main()
{
char t[50];
char mot[50];

int i=0,j=0,etat=1,num=0;

cout<<"Tapez une phrase : ";cin.getline(t,50);

while(t[i]!='\0'){
if(etat==1)
{
if(t[i]!=' ')
{
etat=2;j=0;mot[0]=t[i];j++;
}
}
else
{
if(t[i]!=' '){mot[j]=t[i];j++;}
else
{
etat=1;
num++;
mot[j]='\0';
cout<<"mot "<<num<<" : "<<mot<<endl;
}
}
i++;
}
if(etat==2)
{
num++;
mot[j]='\0';
cout<<"mot "<<num<<" : "<<mot<<endl;
}
return 0;
}

4 réponses

sanaa1 Messages postés 64 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 20 septembre 2008 6
2 janv. 2008 à 22:16
slt
qql pourrait m'aider ?svp
0
mamiemando Messages postés 33113 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 mai 2024 7 753
2 janv. 2008 à 23:50
Bah en fait c'est plutôt on t'a donné la solution alors ?
Enfin peu importe. Le principe c'est de parcourir la phrase entrée par l'utilisateur (t). A noter que si la phrase fait plus de 50 caractères le programme plante.

Il suffit ensuite de parcourir t du début à la fin (\0). La suite est codée de manière assez étrange... en particulier je ne comprends pas trop pourquoi il y a des états (et en plus c'est pas indenté). Visiblement i correspond au caractère courant, etat = 1 à "mot en cours de lecture, etat = 2 à "mot lu", et num compte le nombre de mots lus.

En fait le programme serait beaucoup plus simple (et lisible) en utilisant la fonction strtok.
http://www.cplusplus.com/reference/cstring/strtok/

En gros ca donne :
#include <cstring>
#include <iostream>

int main (){
        const char *sep = " ";
        char str[] = "je pense donc je suis";
        char *pch = strtok(str,sep);
        for(unsigned i = 0 ; pch != NULL ; ++i){
                std::cout << "mot " << i << '\t' << pch << std::endl;
                pch = strtok (NULL,sep);
        }
        return 0;
}

ce qui est à mon humble avis un poil plus lisible...

Bonne chance
0
sanaa1 Messages postés 64 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 20 septembre 2008 6
3 janv. 2008 à 00:02
salut
ok.........je pense que j'ai compris un peu ,merci bcp pour ta reponse
0
mamiemando Messages postés 33113 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 mai 2024 7 753
3 janv. 2008 à 10:11
Ok bonne continuation :-)
0