Switch Case mal conçu avec boucle infini

phube008 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention   -  
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je suis un débutant en C++.

Voici mon problème, j'ai un switch case en C++ où les options sont liés à une variable (choix) entière entre 1 et 5.

Si l'utilisateur tape un nombre fractionnaire, un caractère ou un symbole, ma boucle s'exécute à l'infini. J'aimerais améliorer la robustesse de mon programme.
Contraintes: utiliser seulement la bibliothèque #include <iostream>

Qu'elle est la meilleure solution pour qu'un nombre fractionnaire, un caractère ou un symbole me retourne "Choix INVALIDE"?


// Au départ, mon code n'est pas parfait
//---------------------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
int choix = 0;

while (choix!=0) // Vérifier si choix est un entier? while (choix == (int)choix)?
{
do
{
// Demander et redemander après l'affichage du choix
cout << "Entrez un nombre ENTIER entre 1 et 5" << endl;
cin >> choix;
switch (choix)
{

case 1 :

cout << "Votre choix est 1"<< endl;
break;

case 2 :

cout << "Votre choix est 2"<< endl;
break;

case 3 :

cout << "Votre choix est 3"<< endl;
break;

case 4 :

cout << "Votre choix est 4"<< endl;
break;

case 5 :

cout << "Votre choix est 5"<< endl;
break;

default :

cout << "Choix INVALIDE"<< endl;
}
} while (choix<1 || choix >5);
}
system("pause");
return 0;
}

/* Je voudrais obtenir:

Entrez un nombre ENTIER entre 1 et 5
3
Votre choix est 3

Entrez un nombre ENTIER entre 1 et 5
3,1
Choix INVALIDE

Entrez un nombre ENTIER entre 1 et 5
m
Choix INVALIDE

Entrez un nombre ENTIER entre 1 et 5
A voir également:

4 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Déjà ton programme ne peux pas commencer :

int choix = 0; 

while (choix!=0)

Il faut plutôt utiliser une boucle do while ici afin d'entrer une première valeur avant de regarder si elle mauvaise.

Après ce qui se passe c'est que tu lis un entier. Or comme tu lui donnes autre chose qu'un entier, alors il passe à autre chose, sans lire la ligne mais en conservant la valeur précédente de ton choix (par exemple le 0 par défaut).

Du coup quand tu boucles, tu essaies toujours de lire la même ligne, toujours avec la même valeur de choix, donc ça boucle...

Il vaut mieux utiliser getline().
1
phube008 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
Je peux seulement utiliser <iostream>. Je crois que getline() est une fonction seulement incluse dans la librairie <string>.

/* TEST: entrez une lettre ou un nombre fractionnaire au-lieu d'un entier et vous trouverez une boucle infini. Comment faire pour empêcher les boucles infinis si l'utilisateur veut mettre une valeur invalide. EX: entrer une "double" dans un "int"*/


// Voici le code qui fonctionne un peu mieux
//-------------------------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
int choix = 0, min =1 ,max=5;

do
{
// Demander et redemander après l'affichage du choix
cout << "Entrez un nombre ENTIER entre 1 et 5" << endl;
cin >> choix;

if (choix>=1 && choix<= 5) // Vérifier si choix est un entier? while (choix == (int)choix)?
{
switch (choix)
{

case 1 :

cout << "Votre choix est 1"<< endl;
break;

case 2 :

cout << "Votre choix est 2"<< endl;
break;

case 3 :

cout << "Votre choix est 3"<< endl;
break;

case 4 :

cout << "Votre choix est 4"<< endl;
break;

default :

cout << "Votre choix est 5"<< endl;
break;
}
cout << endl;
}
// Sortie du IF
else
{
cout << "Choix INVALIDE"<< endl;
}
}while (choix>=1 || choix <=5);

system("pause");
}
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
"TEST: entrez une lettre ou un nombre fractionnaire au-lieu d'un entier et vous trouverez une boucle infini. Comment faire pour empêcher les boucles infinis si l'utilisateur veut mettre une valeur invalide. EX: entrer une "double" dans un "int"

Si je comprends bien, le but de l'exercice est que tu trouves toi même cette alternative, alors on ne vas pas la faire à ta place...
0
phube008 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
En fait, je dois trouver des informations à ce sujet sur le Web et ensuite les citer en écrivant l'adresse de la page.

Si vous avez une idée de comment faire pour que le choix de l'utilisateur, même s'il est différent d'un entier retourne "Valeur invalide", ça m'aidera énormément. (Il faut vraiment entrez des nombres fractionnaires pour comprendre mon problème après l'exécution du code et en se rappelant que je dois seulement utiliser la librairie #include <iostream>.

Je n'ai aucune idée de la condition qui serait meilleure et pourtant j'ai essayé de déclarer choix en "char" et ensuite convertir en "int", mais je dois faire la mauvaise chose.
0
matmat42 Messages postés 124 Date d'inscription   Statut Membre Dernière intervention   40
 
Salut,
Moi je ferais:

int main()
{
int choix = 0, min =1 ,max=5;


do
{
// Demander et redemander après l'affichage du choix
cout << "Entrez un nombre ENTIER entre 1 et 5" << endl;
cin >> choix;


switch (choix)
{


case 1 :


cout << "Votre choix est 1"<< endl;
break;


case 2 :


cout << "Votre choix est 2"<< endl;
break;


case 3 :


cout << "Votre choix est 3"<< endl;
break;


case 4 :


cout << "Votre choix est 4"<< endl;
break;

case 5 :
cout<<"choix 5<<endl;


default :
cout << "Invalide"<< endl;
break;
}



}while (choix>=1 || choix <=5);


system("pause");
}


Le default sert à dire la condition qui sera remplie si aucune des 'case' n'a été valide.
Cordialement (et corriger moi si je dis des bêtises ^^)




Celui qui pose une question est bête cinq minute, celui qui n'en pose pas l'est toute sa vie.
0
phube008 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
Il y a juste une petite faute au case 5: "Votre choix est 5".

Regarder ce que cela fait si vous entrer volontairement une lettre comme "m". Vous tombez dans une boucle infini.
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Il faut peut être nettoyer le tampon/flux d'entré.
0