Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1735 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Probleme indefini (debutant).

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme indefini (debutant).

n°2218477
MontGros
Posté le 03-02-2014 à 19:10:40  profilanswer
 

Bonjour je débute en C++ et pour m'entrainer j'ai fait un petit programme pour calculer le volume d'un cylindre. Mais quand on entre un caractère par erreur, une lettre par exemple, le programme entre dans une boucle ou il répété la question à l'infini sans attendre la réponse... Je m'attendais à ce que le programme mette 0 en résultat...Je ne sais pas ou est le problème alors google à eu du mal à m'aider.
 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. void messageerreur (double dimension)
  4.      {
  5.          if (dimension <=0)
  6.         {
  7.             cout << " Entrez un nombre positif. " << endl;
  8.         }
  9.      }
  10. int main()
  11. {
  12.     cout << "Calcul du volume d'un cylindre." << endl;
  13.    
  14.     double const pi(3.14);
  15.     double r(0),h(0),resultat(1);
  16.     //Demander d'entrer le rayon et la hauteur n'autoriser que les nombres positifs.
  17.      while (r<=0)
  18.      {
  19.         cout << "Rayon:"<<endl;
  20.         cin >> r;
  21.         messageerreur (r);
  22.      }
  23.      while (h<=0)
  24.      {
  25.         cout << "Hauteur:" <<endl;
  26.         cin >> h;
  27.         messageerreur (h);
  28.      }
  29.    
  30.         resultat = (pi*(r*r))*h;
  31.    
  32.         cout << "Le volume du cylindre est de: " << resultat << endl;
  33.     return 0;
  34. }


 
Comment afficher le message d'erreur si l'utilisateur entre une lettre ou tout autre caractere que le type double au lieu de cette boucle ? Merci

mood
Publicité
Posté le 03-02-2014 à 19:10:40  profilanswer
 

n°2218478
WiiDS
20 titres en GC, 0 abandon, 0 DQ
Posté le 03-02-2014 à 19:20:58  profilanswer
 

Ton problème doit venir du fait que cin ne peut pas mettre une lettre dans une variable de type double. Sauf que j'imagine que du coup, le caractère sur l'entrée standard n'est jamais supprimé. Du coup quand ton programme réexécute l'instruction cin >> r, il retente de mettre le caractère dans la variable double. Ce qui provoque ta boucle infinie.

 

Je crois que tu peux tester si tu as reçu une valeur adéquate de ton entrée standard en testant le failbit de cin. Si tu n'as pas reçu la donnée que tu voulais (dans ton cas, si tu as reçu une lettre au lieu d'un chiffre), tu dois pouvoir "nettoyer" cin de manière à ce que le caractère soit ignoré.

 

Donc en gros dès que tu fais

 
Code :
  1. cin >> r;
 

Tu rajoutes le test, et tu "supprimes" le caractère de l'entrée standard

 
Code :
  1. cin >> r;
  2. if (!cin)
  3. {
  4.   cout << "Erreur d'entree" << endl;
  5.   cin.clear();
  6.   cin.ignore(std::numeric_limits<std::streamsize>::max())
  7. }
 

Tout ça à prendre avec des pincettes, ça fait longtemps que j'ai pas touché à ça :D

 

EDIT: Je me suis renseigné, cin.clear() ne supprime pas du tout la mauvaise entrée utilisateur de cin. A priori il faut utiliser cin.ignore(std::numeric_limits<std::streamsize>::max()) pour ignorer tout ce qui a été écrit sur l'entrée standard.


Message édité par WiiDS le 03-02-2014 à 19:26:36

---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
n°2218489
MontGros
Posté le 03-02-2014 à 22:35:10  profilanswer
 

Je crois que j'ai visé un peu haut avec ce contrôle d'erreurs, je ne connais pas ces notions de failbit mais je vais essayer.
J'ai trouvé ca aussi  
http://cpp.developpez.com/faq/cpp/ [...] cin_verify
 
ca a éliminé le probleme de boucle sans fin mais ca deconne maintenant :D
 

Code :
  1. #include <iostream>
  2. #include <limits>
  3. using namespace std;
  4. bool messageerreur (double dimension)
  5.      {
  6.             while ( ! ( cin >> dimension ) )
  7.     {
  8.         if ( cin.eof() )
  9.         {
  10.            
  11.             return false;
  12.         }
  13.         else if ( cin.fail() )
  14.         {
  15.             cout << "Entrez un nombre positif : "<< endl;
  16.             cin.clear();
  17.             cin.ignore( numeric_limits<streamsize>::max(), '\n' );
  18.     }
  19.     }
  20.         return true; // succès
  21.      }
  22. int main()
  23. {
  24.     cout << "Calcul du volume d'un cylindre." << endl;
  25.     //Variables: constante pi, double rayon, hauteur, resultat.
  26.     double const pi(3.14);
  27.     double r(0),h(0),resultat(1);
  28.    
  29.         cout << "Rayon:"<<endl;
  30.         cin >> r;
  31.         messageerreur (r);
  32.         cout << "Hauteur:" <<endl;
  33.         cin >> h;
  34.         messageerreur (h);
  35.         resultat = (pi*(r*r))*h;
  36.         cout << "Le volume du cylindre est de: " << resultat << endl;
  37.     return 0;
  38. }


 
Il faut que je tapes 2 fois la variable.  
En tous cas merci d'avoir répondu aussi vite.


Message édité par MontGros le 03-02-2014 à 22:37:01

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Probleme indefini (debutant).

 

Sujets relatifs
[C]Problème affichage Calendrier en C (débutant)problème Javascript sous safari
[ PHP / Probleme ] PHP indisponible sur mon site[RESOLU][ PHP / Probleme ] unexpected end of file
probleme de taille d'un tableau excel envoyé par mailProblème de between sans datetime
Problème d'analyse[HTML] Problème alignement logos
Plus de sujets relatifs à : Probleme indefini (debutant).


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR