Un menu avec des controles d'erreur de saisie [Résolu]

Signaler
Messages postés
2
Date d'inscription
dimanche 28 mars 2010
Statut
Membre
Dernière intervention
11 mai 2010
-
Messages postés
2
Date d'inscription
dimanche 28 mars 2010
Statut
Membre
Dernière intervention
11 mai 2010
-
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

Messages postés
3813
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
12 juin 2020
109
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]
Messages postés
2
Date d'inscription
dimanche 28 mars 2010
Statut
Membre
Dernière intervention
11 mai 2010

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