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 :

problème non identifié (boucle peut être ?)


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2014
    Messages : 7
    Points : 6
    Points
    6
    Par défaut problème non identifié (boucle peut être ?)
    Bonjour !

    Tout d'abord, désolé pour ce titre très peu évocateur mais je ne vois pas du tout d'ou vient mon problème dans ce code suivant.
    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
    #include "stdafx.h"
    #include <iostream>
     
     
    using namespace std;
     
    int main()
    {
     
    	int a, b;
    	a = 11;
    	do
    	{
     
    		cout << "choisis un nombre entre 1 et 100 ? " << endl;
    		cin >> b;
    		if (a == b)
    			cout << "Bravo !" << endl;
    		else
    		{
    			if (b > a)
    			cout << "trop grand" << endl;
    			else
    			{
    				if (b < a)
    					cout << "trop petit" << endl;
    				else
    				{
    					if (a =! b)
    					cout << "j'ai dis de taper un chiffre !" << endl;
     
     
    				}
    			}
    		}
    	}
    	while (a != b);
    	}
    Le programme fonctionne bien si on reste "dans les clous" cela dit lorsque l'on rentre une donnée non numérique le résultat est surprenant : la boucle s’exécute ignorant la ligne suivante:
    Toute idée est là bienvenue !

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    En lisant ceci: http://www.cplusplus.com/reference/i...perator%3E%3E/
    On se dit que la manière standard de tester si l'entrée était conforme est de tester failbit sur cin...sinon on se retrouve en train de tester la valeur d'une variable non-initialisée, ce qui peut entraîner des résultats "suprenants": on appelle cela un comportement indéfini...et c'est à éviter comme la peste

  3. #3
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Bonjour !

    else if existe !

    L'utilisation du cin est un peut plus complexe pour gerer les erreurs (Le buffer clavier ne se vide pas toujours etc...)

    Le mieux est d'utiliser une chaine de caractères, string, la fonction std::getline(), et le tout accompagné de std::stringstream pour la convertion :

    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
    #include <iostream>  // getline / cout /(string)
    #include <sstream>  // stringstream
    #include <string>     // string
     
    int main()
    {
    	int a, b;
    	a = 11;
    	do
    	{
    		std::cout << "choisis un nombre entre 1 et 100 ? " << std::endl;
     
    		std::string buffer_clavier;                        //Creer une chaine de caractère vide
    		std::getline(std::cin, buffer_clavier);          //Recupere TOUT le buffer clavier
     
    		std::stringstream ssbuffer(buffer_clavier); //stringstream permet la convertion de string en int (et plein d'autres)
     
                    if( ! (ssbuffer >> b))                            //Si n'arrive pas à convertir
                    {
                            std::cout << "j'ai dis de taper un chiffre !" << std::endl;
                    }
    		else if(b > a)
    		{
    			std::cout << "trop grand" << std::endl;
    		}
                    else if(b < a)
                    {
                           std::cout << "trop petit" << std::endl;
                    }
    		else if (a == b)
                    {
    			std::cout << "Bravo !" << std::endl;
                    }
    	}
    	while (a != b);
     
    	return 0;
    }

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2014
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Merci pour vos réponses !
    therwald > je n'ai pas tout compris à la page que tu as linkée... Je pense que ce n'est pas encore de mon niveau ! A failbit est associé le terme Flag (drapeau??) Il s'agit juste d'un terme qui décrit une erreur ? Peut on magouiller un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if failbit
    cout << "merci d'entrée un nomber !" ;
    C'est une idée comme ca que je recherche afin d'explorer un peu les limites de chaque fonctions: quelque chose qui utilise cin tout en incluant quelques lignes qui serviraient de poubelle à toute autre éventualité que les entrées numériques ?
    En gros ce qu'a proposé PilloBuenaGente mais avec cin ^^

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    j'étais un peu lapidaire, je l'avoue: ces flags sont dans cin (dans tout istream, dont cin dérive, en fait), et sont accessibles par des fonctions membres telles que fail(), ou operator!().
    Le test !(cin>>b) proposé par PilloBuenaGente est un appel à l' operator!() de cin. (qui fonctionne car la fonction istream& operator>>(istream& s,int &b) qui est appelée quand on écrit cin>>b renvoie une référence à cin).

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2014
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Oula ! Alors quand je tente de comprendre ca donne ca : failbit (entre autre flags) sont des partis intégrante de la fonction cin qu'on ne voit pas au premier abord mais que l'on peut extraire ou utilisé via d'autres fonctions comme fail() ou operator(). Ca ok !
    En revanche, ce que je ne comprends pas, pourquoi n'utilise t on pas ces fonctions membres directement et passons par "!(cin>>b)" ?

    2H après ces réflexions je me rends compte d'une chose : cin ça serait pas un peu de la m**** ? J'ai la sensation que cette fonction à de nombreuses limites auxquels je ne cesse de me frotter. A niveau professionnel utilise t on cin ? ou alors c'est une fonction très simpliste conçue pour débutant ?

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    cin n'est pas une fonction.
    C'est un objet qui représente un flux (l'entrée standard). Il possède des indicateurs de statut qui ne sont pas des fonctions, mais des variables membres internes. Comme pour tout objet (principe d'encapsulation) on n'accède pas directement à l'état, mais on y accède en appelant des fonctions.
    l'utilisation d'operator! (qui se traduit par le symbole ! avant cin>>b) permet de tester le résultat juste après avoir lu l'entrée et avoir tenté de l'affecter à b,
    cin est couramment utilisé,

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2014
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Merci ! C'est bien plus clair à présent !

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

Discussions similaires

  1. Le TDD est mort ? non, pas vraiment, peut-être que oui
    Par Arsene Newman dans le forum ALM
    Réponses: 61
    Dernier message: 16/07/2014, 15h44
  2. Problème d'encodage (et peut-être de chiffrement)
    Par GiZeus dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 02/06/2011, 19h12
  3. problème de connexion, MTU peut-être
    Par bilouchka dans le forum Réseau
    Réponses: 0
    Dernier message: 26/04/2011, 14h32
  4. Problème non identifié, bug boucle perl
    Par Adrien_13 dans le forum Langage
    Réponses: 1
    Dernier message: 09/03/2010, 10h07
  5. problème bizarre de mémoire(peut-être)
    Par s3b18 dans le forum SL & STL
    Réponses: 3
    Dernier message: 30/04/2008, 21h04

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