J'aimerais utiliser une valeur enum
pour une instruction switch
. Est-il possible d’utiliser les valeurs enum
incluses dans "{}"
comme choix pour switch()
"? Je sais que switch()
a besoin d’une valeur int
eger afin de diriger le flux de programmation vers le nombre case
approprié. Dans ce cas, est-ce que je crée simplement une variable pour chaque constante dans l'instruction enum
? Je souhaite également que l'utilisateur puisse choisir le choix et le transmettre à l'instruction switch()
.
Par exemple:
cout << "1 - Easy, ";
cout << "2 - Medium, ";
cout << "3 - Hard: ";
enum myChoice { EASY = 1, MEDIUM = 2, HARD = 3 };
cin >> ????
switch(????)
{
case 1/EASY: // (can I just type case EASY?)
cout << "You picked easy!";
break;
case 2/MEDIUM:
cout << "You picked medium!";
break;
case 3/HARD: // ..... (same thing as case 2 except on hard.)
default:
return 0;
}
Vous pouvez utiliser une valeur énumérée exactement comme un entier:
myChoice c;
...
switch( c ) {
case EASY:
DoStuff();
break;
case MEDIUM:
...
}
Vous êtes sur la bonne voie. Vous pouvez lire l'entrée de l'utilisateur dans un entier et switch
sur celui-ci:
enum Choice
{
EASY = 1,
MEDIUM = 2,
HARD = 3
};
int i = -1;
// ...<present the user with a menu>...
cin >> i;
switch(i)
{
case EASY:
cout << "Easy\n";
break;
case MEDIUM:
cout << "Medium\n";
break;
case HARD:
cout << "Hard\n";
break;
default:
cout << "Invalid Selection\n";
break;
}
Quelques points à noter:
Vous devez toujours déclarer votre énumération dans un espace de noms, car ces énumérations ne sont pas des espaces de nom appropriés et vous serez tenté de les utiliser comme tel.
Toujours avoir une pause à la fin de chaque clause de commutation, l’exécution se poursuivra jusqu’à la fin, sinon.
Toujours inclure le cas default:
dans votre commutateur.
Utilisez des variables de type enum pour conserver les valeurs enum pour plus de clarté.
voir ici pour une discussion sur l'utilisation correcte des énumérations en C++.
C'est ce que tu veux faire.
namespace choices
{
enum myChoice
{
EASY = 1 ,
MEDIUM = 2,
HARD = 3
};
}
int main(int c, char** argv)
{
choices::myChoice enumVar;
cin >> enumVar;
switch (enumVar)
{
case choices::EASY:
{
// do stuff
break;
}
case choices::MEDIUM:
{
// do stuff
break;
}
default:
{
// is likely to be an error
}
};
}
Vous pouvez utiliser un std::map
pour mapper l'entrée sur votre enum
:
#include <iostream>
#include <string>
#include <map>
using namespace std;
enum level {easy, medium, hard};
map<string, level> levels;
void register_levels()
{
levels["easy"] = easy;
levels["medium"] = medium;
levels["hard"] = hard;
}
int main()
{
register_levels();
string input;
cin >> input;
switch( levels[input] )
{
case easy:
cout << "easy!"; break;
case medium:
cout << "medium!"; break;
case hard:
cout << "hard!"; break;
}
}
j'avais un problème similaire en utilisant enum avec des boîtiers de commutateur.
//Menu Chooser Programe using enum
#include<iostream>
using namespace std;
int main()
{
enum level{Novice=1, Easy, Medium, Hard};
level diffLevel=Novice;
int i;
cout<<"\nenter a level: ";
cin>>i;
switch(i)
{
case Novice: cout<<"\nyou picked Novice\n"; break;
case Easy: cout<<"\nyou picked Easy\n"; break;
case Medium: cout<<"\nyou picked Medium\n"; break;
case Hard: cout<<"\nyou picked Hard\n"; break;
default: cout<<"\nwrong input!!!\n"; break;
}
return 0;
}
N'oubliez pas que si vous accédez à une énumération de classe entière à partir d'une autre fonction, même s'il s'agit d'un ami, vous devez fournir des valeurs avec un nom de classe:
class PlayingCard
{
private:
enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES };
int rank;
Suit suit;
friend std::ostream& operator<< (std::ostream& os, const PlayingCard &pc);
};
std::ostream& operator<< (std::ostream& os, const PlayingCard &pc)
{
// output the rank ...
switch(pc.suit)
{
case PlayingCard::HEARTS:
os << 'h';
break;
case PlayingCard::DIAMONDS:
os << 'd';
break;
case PlayingCard::CLUBS:
os << 'c';
break;
case PlayingCard::SPADES:
os << 's';
break;
}
return os;
}
Notez que c'est PlayingCard::HEARTS
et pas seulement HEARTS
.
#include <iostream>
using namespace std;
int main() {
enum level {EASY = 1, NORMAL, HARD};
// Present menu
int choice;
cout << "Choose your level:\n\n";
cout << "1 - Easy.\n";
cout << "2 - Normal.\n";
cout << "3 - Hard.\n\n";
cout << "Choice --> ";
cin >> choice;
cout << endl;
switch (choice) {
case EASY:
cout << "You chose Easy.\n";
break;
case NORMAL:
cout << "You chose Normal.\n";
break;
case HARD:
cout << "You chose Hard.\n";
break;
default:
cout << "Invalid choice.\n";
}
return 0;
}
L'entrée de l'utilisateur vous sera toujours donnée sous la forme d'une chaîne de caractères ... si vous voulez convertir l'entrée de l'utilisateur d'une chaîne en un entier, vous devez fournir le code pour le faire. Si l'utilisateur tape un nombre (par exemple, "1"), vous pouvez passer la chaîne à atoi () pour obtenir le nombre entier correspondant à la chaîne. Si l'utilisateur tape une chaîne anglaise (par exemple, "EASY"), vous devrez alors vérifier cette chaîne (par exemple, avec strcmp ()) et attribuer la valeur entière appropriée à votre variable en fonction des correspondances de vérification. Une fois que vous avez obtenu une valeur entière dérivée de la chaîne de saisie de l'utilisateur, vous pouvez la transmettre dans l'instruction switch () comme d'habitude.