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 -
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
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:
- Switch Case mal conçu avec boucle infini
- Android switch - Accueil - Android
- Smart switch pc - Télécharger - Divers Bureautique
- Switch off - Télécharger - Divers Utilitaires
- Logiciel switch - Télécharger - Conversion & Extraction
- Mon pc s'allume et s'éteint en boucle - Forum Matériel & Système
4 réponses
Déjà ton programme ne peux pas commencer :
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().
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().
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");
}
/* 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");
}
"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...
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...
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.
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.
Salut,
Moi je ferais:
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.
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.