[c++] nombres de couples le d'une phrase

Résolu/Fermé
benoit456 - 30 déc. 2006 à 21:45
lirey83 Messages postés 75 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 18 août 2007 - 3 janv. 2007 à 19:49
bonjour. J'ai un petit meme gros probleme pour un exercie en c++ je dois compter le nombre de couples LE d'une phrase terminée par un point.
j'ai essayé quelque chose mais cela ne me donne rien!
voila ce que j'ai tenté:
#include<iostream.h>
void main() {
int etat=1,cpt=0;
char c;
c=cin.get();
while(etat!=4){
switch(etat){
case1:switch(c){
case'l':etat=2;
break;
case'.':etat=4;
break;
default:etat=1;
break;}
break;
case2: switch(c){
case'e':etat=3;
break;
case'.':etat=4;
break;
default:etat=1;
break;}
break;
case3:cpt++;
switch(c){
case'l':etat=2;
break;
case'.':etat=4;
break;
default:etat=1;
break;}
break;
}
c=cin.get();
}
cout<<cpt++;
}

Aidez moi svp!
benoit456

8 réponses

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
1 janv. 2007 à 23:36
C'est quoi ce que tu appelles un couple LE ? Il peut y avoir des mots entre deux mots "LE" ? Que se passe t'il si tu as un nombre impair de mot "LE" ? Peux-tu donner quelques exemples de phrases et le résultat que tu attends ?

En C++ pour les std::string il y a une méthode très intéressante pour toi, c'est la méthode find :
https://community.hpe.com/t5/custom/page/page-id/HPPSocialUserSignonPage?redirectreason=permissiondenied&referer=https%3A%2F%2Fcommunity.hpe.com%2Ft5%2FServers-Systems-The-Right%2FSGI-com-Tech-Archive-Resources-now-retired%2Fba-p%2F6992583

Bonne chance
0
benoit456 Messages postés 7 Date d'inscription samedi 30 décembre 2006 Statut Membre Dernière intervention 3 janvier 2007
2 janv. 2007 à 11:31
bonjour,
enfet voila je dois compter le nombre de fois qu'un Le suit un E pour former un couple LE. le couple peut se trouver n'importe ou dans la phrase.

ex: Le lendemain elle etait toujours sur le banc. Elle etait si belle.

donc, ici dans la première phrase il y a 4 couples LE et dans la seconde, il y en a 2.

Je dois donner le nombre de couples LE dans chaque phrase et ensuite je dois les totaliser.

J'espere que c'est un peu plus clair.

Merci pour ton aide.

salutations.
benoit456
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
2 janv. 2007 à 14:40
Yep beaucoup plus :)

Alors ca se fait trivialement avec un find comme je te disais. Le find peut débuter à partir d'un index (n° de caractère de la chaine), donc à chaque fois que tu trouves un find il suffit de repartir de cet index+2.

Jète un oeil au site que je t'ai donné dans le post précédent, tu vas voir c'est facile, pas besoin de faire un automate.

Bonne chance
0
lirey83 Messages postés 75 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 18 août 2007 13
2 janv. 2007 à 14:48
Salut

Y a des million de manière de procéder ... plus ou moins sophistiqué !
En voici une avec des pointeurs fonctionnant sur une seule phrase ...

int compte(char *phrase)
{
int i = 0;
int compteur = 0;
char *le;

// Pointeur sur le début de la phrase
le = phrase;

while (i<strlen(phrase))
{
if ((*le == 'l') && (*(le+1) == 'e')) compteur++;
le++;
i++;
}
return compteur;
}

int main()
{
char *phrase = "le lendemain elle etait toujours sur le banc.";

cout << "Il y a " << compte(phrase) << " 'le' dans la phrase" << endl;
getchar();
}
0
benoit456 Messages postés 7 Date d'inscription samedi 30 décembre 2006 Statut Membre Dernière intervention 3 janvier 2007
2 janv. 2007 à 22:56
Bonjour,
merci bcp pour ton aide tu as vraiment repondu à mon attente, mais saurai-tu m'expliquer un peu le fonctionnement stp pcq je n'ai jamais travaillé avec des pointeurs.
Si pas ce n'est pa grave.
Encore un grand merci.

Salutations.

benoit456
0
benoit456 Messages postés 7 Date d'inscription samedi 30 décembre 2006 Statut Membre Dernière intervention 3 janvier 2007
2 janv. 2007 à 23:00
Mais a la place d'utiliser

while (i<strlen(phrase))
{
if ((*le == 'l') && (*(le+1) == 'e')) compteur++;
le++;
i++;

j'ai pris plutot

while (*le != 0)
{
if ((*le == 'l') && (*(le+1) == 'e')) compteur++;
le++;
}

et j'ai donc supprime int i = 0;

Donc si il ya moyen que tu m'explique un peu cela serai bien gentil.

salutations

benoit456
0
lirey83 Messages postés 75 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 18 août 2007 13
3 janv. 2007 à 11:12
Salut Benoit

Le C++ et les pointeurs sont indissociables ! et on arrive facilement à écrire des choses totalement illisible !!
Dans le cas présent, faut savoir qu'en C les chaines de caractères sont simplement identifiées par l'adresse du premier caractère, la fin de la chaîne étant matérialisé par un 0.

char *toto indique donc que toto est une chaîne de caractère (note que cela ne donne aucune information sur sa longueur). (*toto) indique donc le premier caractère (* étant l'opérateur de déréférencement qui permet d'accéder au contenu de la case mémoire pointée).
Dans le cas présent, j'ai une variable "le" qui "pointe" sur le premier caractère de la phrase que l'on teste : *le == 'l'.
(le+1) pointe sur le caractère suivant, que l'on teste aussi *(le+1) == 'e'.
Si les 2 tests sont bons, on a donc trouvé un 'le' et on incrémente le compteur.
On itère le processus jusqu'à la fin de la chaîne repéré par un 0 (boucle while ou for)

J'espère que c'est plus clair !
0
lirey83 Messages postés 75 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 18 août 2007 13
3 janv. 2007 à 12:28
Je suis d'ailleurs toujours surpris de trouver des écritures toujours plus compacte :
int compte(char *phrase)
{
  int compteur = 0;

  for (char *le = phrase; *le; le++)
    if ((*le == 'l') && (*(le+1) == 'e')) compteur++;

  return compteur;
}

Bon, là je crois que l'on peut pas faire plus court !!
0
lirey83 Messages postés 75 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 18 août 2007 13
2 janv. 2007 à 14:54
tu peux d'ailleurs simplifier le while par :
  while (*le != 0)
  {
    if ((*le == 'l') && (*(le+1) == 'e'))  compteur++;
    le++;
  }
0

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

Posez votre question
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
2 janv. 2007 à 21:49
Voire :
for(le = phrase;*le !='\0';++le){
  if ((*le == 'l') && (*(le+1) == 'e'))  compteur++;
}
0
benoit456 Messages postés 7 Date d'inscription samedi 30 décembre 2006 Statut Membre Dernière intervention 3 janvier 2007
3 janv. 2007 à 12:08
Bonjour,

merci cela réponds assez bien à ma question mais il ya juste une chose, a quoi sert ( int compte(char *phrase) ) et getchar?

Un grand merci.

Salutations.

benoit456
0
lirey83 Messages postés 75 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 18 août 2007 13
3 janv. 2007 à 12:35
he bien "int compte(char *phrase) " est la déclaration de la fonction et getchar sert juste à stopper le défilement de l'écran en attendant que l'utilisateur appuie sur "Entrée"
0
lirey83 Messages postés 75 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 18 août 2007 13
3 janv. 2007 à 19:49
En relisant ton essai de code, je me suis dit que tu voulais peut-être compter les 'le' au fur et à mesure que l'on tapait la phrase. Dans ce cas, voilà une solution :
void main()
{
  int cpt = 0;
  char c;
  bool un_l = false;

  while ((c = cin.get()) != '.')
  {
    if (un_l && (c == 'e')) cpt++;
    un_l = (c == 'l');
  }

  cout << "Il y a " << cpt << " 'le' dans la phrase." << endl;
}
0