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 :

Programme qui reste en suspend


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Avril 2012
    Messages : 6
    Par défaut Programme qui reste en suspend
    Helloo tout le monde!

    J'suis nouvelle sur le site, debutante en C++ (je fais quelques cours en fait) et il se trouve en fait que le programme que j'ai ecrit ne fonctionne pas sans que je comprenne la cause exacte en fait. J'ai pas de warning ni rien, juste que il ne fait pas ce que je veux.

    Alors en fait j'avais trouvé un exo qui demandait d'ecrire un programme quit :

    -1. demande à l’utilisateur d’entrer une phrase ou bien un mot qui peut aller jusqu'a80 caractères,

    -2 qui reconstruit une chaîne de caractères (la chaîne peut contenir un ou plusieurs caractères vides) où les caraceteres identiques qui se suivent sont réduits à un seul caractère.

    comme Bbonjour qui sera transformé en bonjour.

    Voila ce que j'ai ecrit
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    #include <iostream>
    # include <string>
    using namespace std;
     
    void saisir(string&chaine);
    void transformer(string&chaine);
    void afficher (string&chaine);
     
    int main ()
    {
    	string chaine;
    	unsigned int taille_max = 80;
    	saisir(chaine);
     
    	while ((taille_max) < (chaine.size()) )
    	{ saisir(chaine); }
     
    	transformer(chaine);
     
    	afficher(chaine);
     
     
    	return 0;
    }
     
     
    void saisir(string&chaine)
    {  
    	cout << " Entrer une phrase d'au plus de 80 mots" << endl;
       getline(cin,chaine); 
    }
     
     
    void transformer(string&chaine)
    {   unsigned int k = 0;
    	for (unsigned int j = 0; j < chaine.size() ; j=k)
     
    	{  k = j++;
    	   while (chaine [j] == chaine [k]);
     
    	{  chaine[k]='0';
    	if ( k < chaine.size())
    		k++;
     
    	}
    	}
    }
     
     
     
    void afficher(string&chaine)
    {
         for (unsigned int i =0; i< (chaine.size()) ; i++)
     
    	{ if (chaine[i]!='0')
    	cout << chaine[i] << endl; }
     
    }
    Donc quand j'execute mon programme, il me demande de taper mon mot. Mais quand je vais ecrire par exemple : bbonjour, il doit me le corriger et afficher : bonjour. Sauf que le programme ne fait rien. Il ne se termine même pas, il reste comme ca. Je pense que mon probleme est au niveau de mes boucles dans la fonction transformer mais j'ai beau avoir modifié, changé...regardé looonguement...je ne vois absolument pas ce qui cloche. Donc si vous pouvez m'aidez ce serait sympa! Merci d'avance

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    Sûrement à cause du ; du while de transformer(...)

  3. #3
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    si tu pouvais utiliser les balises CODE, ça serait pratique pour nous, et indenter mieux ton code ça serait pratique pour toi également.

    Tu as une boucle infinie dans transformer().

    Tu devrais passer par des itérateurs pour réaliser facilement ceci, avec erase. D'ailleurs, je ne suis pas sûr que ta fonction fonctionnerait, puisque tu ne décales pas les caractères par la suite, ce qui me semble indispensable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void transformer(string&chaine)
    { 
    std::string::iterator it = chaine.begin() + 1;
    while (it != chaine.end())
    {
      if (*it == *(it-1))
        it = chaine.erase(it);
      else
        ++it;
    }
    }
    On commence par le 2° caractère, et on vérifie s'il est identique au caractère précédent. Si oui, on le supprime.

    Edit:
    En fait ça fonctionnerait sûrement à l'affichage, je viens de voir ta fonction afficher. Mais ça me semble bancal, cela dit l'astuce est louable.
    Mais si tu peux conserver le fait que la chaîne est correct (sans trou au milieu), tu peux simplifier l'affichage comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void afficher(string&chaine)
    {
    cout<<chaine<<endl;
    }
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    Voire même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <algorithm>
    ...
    std::unique(chaine.begin(), chaine.end());

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Avril 2012
    Messages : 6
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Bonjour,

    si tu pouvais utiliser les balises CODE, ça serait pratique pour nous, et indenter mieux ton code ça serait pratique pour toi également.

    Tu as une boucle infinie dans transformer().

    Tu devrais passer par des itérateurs pour réaliser facilement ceci, avec erase. D'ailleurs, je ne suis pas sûr que ta fonction fonctionnerait, puisque tu ne décales pas les caractères par la suite, ce qui me semble indispensable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void transformer(string&chaine)
    { 
    std::string::iterator it = chaine.begin() + 1;
    while (it != chaine.end())
    {
      if (*it == *(it-1))
        it = chaine.erase(it);
      else
        ++it;
    }
    }
    On commence par le 2° caractère, et on vérifie s'il est identique au caractère précédent. Si oui, on le supprime.

    Edit:
    En fait ça fonctionnerait sûrement à l'affichage, je viens de voir ta fonction afficher. Mais ça me semble bancal, cela dit l'astuce est louable.
    Mais si tu peux conserver le fait que la chaîne est correct (sans trou au milieu), tu peux simplifier l'affichage comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void afficher(string&chaine)
    {
    cout<<chaine<<endl;
    }
    merci pour vos reponses mais... Disons que je n'ai pas encore travaillé sur les iterateurs alors exsite t-il d'autres moyens a par les iterauteurs pour resoudre mon probleme ou il s'agit de l'unique solution?
    Et puis en essayant avec les modifications de ce transformer , le code se ferme seul sans meme qe j'ai le temps d'apercevoir les modifications effectuées.

  6. #6
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Polychin-elle Voir le message
    merci pour vos reponses mais... Disons que je n'ai pas encore travaillé sur les iterateurs alors exsite t-il d'autres moyens a par les iterauteurs pour resoudre mon probleme ou il s'agit de l'unique solution?
    Et puis en essayant avec les modifications de ce transformer , le code se ferme seul sans meme qe j'ai le temps d'apercevoir les modifications effectuées.
    C'est la meilleure solution. Après tu es libre de faire ce que tu veux, les itérateurs ne sont en rien obligatoire.

    La fenêtre se ferme toute seule, parce que le programme fonctionne correctement.
    Voir http://c.developpez.com/faq/index.ph...S_system_pause
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Avril 2012
    Messages : 6
    Par défaut
    Ah..mais avec la boucle que j'ai fait, c'est pas possible de la modifier de telle sorte que ca marche?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Par défaut
    salut
    tu peux utiliser si tu veux faire une pause.
    Apres on c'est pas ce que tu utilise comme environnent, certain terminal font une pause "automatiquement" ou presque.
    Quelle ide utilise tu ?

Discussions similaires

  1. [LG]programme qui renomme des fichiers
    Par Ne0taku dans le forum Langage
    Réponses: 9
    Dernier message: 16/02/2005, 21h18
  2. programme qui consomme beaucoup de memoire
    Par gaut dans le forum Windows
    Réponses: 10
    Dernier message: 01/02/2005, 20h33
  3. Programme qui analyse un fichier log
    Par abdou.sahraoui dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 20/08/2004, 14h27
  4. [LG]Programme qui n'affiche rien
    Par ousunas dans le forum Langage
    Réponses: 4
    Dernier message: 17/02/2004, 19h38
  5. Recherche programme qui convertit les chiffres arabes en nb
    Par oli57 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 15/06/2002, 03h11

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