Un menu avec des controles d'erreur de saisie

Résolu
valveur Messages postés 2 Date d'inscription dimanche 28 mars 2010 Statut Membre Dernière intervention 11 mai 2010 - 11 mai 2010 à 13:05
valveur Messages postés 2 Date d'inscription dimanche 28 mars 2010 Statut Membre Dernière intervention 11 mai 2010 - 11 mai 2010 à 15:41
Bonjour,
Voila mon simple programme, le problème est sur la saisie du choix:
Si je tape une lettre mon programme ne s'arrête pas.
Est ce que mon exception est mal placé?

#include
#include <string>
#include <vector>
//#include <stdexception>
#include <exception>
using namespace std;

int displayMenu()// fonction afichage menu avec retour du choix
{
int selection;
cout<<"[-------------------------Menu--------------------]"<<endl;
cout<<"1. Consultez vos rdv"<<endl;
cout<<"2. Inserez un rdv"<<endl;
cout<<"3. Supprimer un rdv"<<endl;
cout<<"4. Quitter"<<endl;
cout<<"Votre choix : "; cin >> selection;
return selection;
}

int main(){

//-------------------------------mon menu---------------------------------------------------------------
bool choix = false;
try{
while (!choix)
{
int selection = displayMenu();

switch(selection)
{
case 1: ;
break;
case 2: ;
break;
case 3: ;
break;
case 4: system("cls"); choix = true; cout<< "fin du programme" <<endl;
break;
default: throw
cout << "!!!!!! Veuillez faire un choix de 1 a 4 svp !!!!!!" << endl << endl;

}
}

}
catch(...){ cout<<"ERROR: fin du prog"<<endl; exit(0); }
system("pause");
return 0;
}

2 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
11 mai 2010 à 14:28
Attention "throw", qui veut dire "relancer la dernière exception catchée", n'est pas standard.
De plus, inclure <exception> n'est pas utile. Enfin, utiliser une exception juste pour ça, c'est un peu du gachis.
Autre remarque:
* Évite les "using namespace std", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
* Évite les "system" (sauf quand tu debug). Tu perds la portabilité de ton programme pour une fonctionnalité très discutable.

Pour faire propre (Gestion des caractères invalides + gestion du nombre de choix):
#include 
#include <limits>

/*!
** Permet de gerer tout type de menu.
** Gere les entrees invalides, en forcant l'utilisateur
** a entree une donnee valide.
**
** @param message Le message a affiche
** @param nbChoice Le nombre de choix que le menu aura
**
** @return Le choix de l'utilisateur
*/
int getChoice(const std::string& message, int nbChoice)
{
  int choix = 0;

  while (choix < 1 || choix > nbChoice)
  {
    std::cout << message;
    std::cin >> choix;
    if (std::cin.fail())
    {
      std::cin.clear();
      std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
  }
  return choix;
}

int main()
{
  int choice = getChoice("1. Consultez vos rdv\n"
 "2. Inserez un rdv\n"
 "3. Supprimer un rd\n"
 "4. Quitter\n", 4);

  std::cout << "Votre choix: " << choice << std::endl;

  return 0;
}



_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
3
valveur Messages postés 2 Date d'inscription dimanche 28 mars 2010 Statut Membre Dernière intervention 11 mai 2010
11 mai 2010 à 15:41
Salut CptPingu,
Merci pour ton programme. C'est exactement ça.
Sinon je ne connaissais pas <limits>. Je vais aller de suite l'étudier de plus près.
Et pour using namespace std aussi. Ceci dit les profs nous ont appris comme ça ( par paresse je pense ).

Et encore merci
0
Rejoignez-nous