Forcer l'entré d'un int par l'utilisateur C++

Résolu
Lanthane -  
 Lanthane -
Bonjour,

Étant débutant en programmation je me suis occupé a créer un programme simple de calcul d'heure. En gros en fonction d'une heure d'arrivé cela renvoi une heure de sortie en ajoutant une durée prédéterminée.

Tout marche nickel SAUF un petit détails dont je ne comprend pas l'origine (rendant difficile toute recherche pour résoudre mon problème).

Je demande à l'utilisateur d'entrer une valeur type int (nombre d'heures ou de minutes) afin de faire les calculs nécessaires. Cela marche tant que l'utilisateur rentre bien un nombre entier.
CEPENDANT si l'utilisateur entre un autre caractère (comme une lettre), mon programme plante complétement...

Comment dois je procéder? Je pensais forcer l'entrée d'un int mais comment? Existe t il une solution mieux adaptée?

Je vous envoie la partie de mon code qui pause problème afin de mieux comprendre.
Merci de votre aide.

#include <iostream>     
using namespace std;     

bool valideHeure (int heure)     
    {return (heure>= 7 && heure<= 19); }     

bool valideMinute (int minute)     
    {return (minute>= 0 && minute<= 60); }     


int main()     
{     
  int hArrivee;     
  int mArrivee;     

        do     
        {     
        cout << endl << endl << "Indiquer l'heure d'arrivee en heure (sans les minutes) : ";     
            cin >> hArrivee;     
        } while (!valideHeure (hArrivee));     

        do     
        {     
        cout << endl << "Indiquer les minutes de votre heure d'arrivee : ";     
            cin >> mArrivee;     
        } while (!valideMinute (mArrivee));     

    cout << endl << "Vous etes arrivee a : " << hArrivee << "h" << mArrivee << endl;     

    return 0;     
}     
A voir également:

23 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Bonjour,

Forcer l'entrée d'un int par l'utilisateur n'est pas possible nativement. En revanche, il est tout à fait possible de contrôler la valeur et de vérifier qu'il s'agit d'un int.
Voici un exemple :
int nbJoueur=0;
cout << "nombre:";
while( !(cin >> nbJoueur) ) {
    string tmp;
    cin.clear();
    cin >> tmp;
    cout << "incorrect" << endl;
}
issu de https://forums.commentcamarche.net/forum/affich-13403731-verifier-si-une-valeur-est-un-nombre-c
0
Lanthane
 
Merci pour le code, mais la personnellement je ne comprend pas grand chose XD!

sinon j'ai trouvé ceci dans mes recherches du soir (suite aux information fournies par mattoffman) :
http://www.siteduzero.com/tutoriel-3-308268-la-saisie-securisee-en-c.html

Tres intéressant, mais est ce vraiment nécessaire d'avoir un code si énorme pour ce problème???

Enfin si cela peu aider d'autre personnes!
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
C'est quoi que tu ne comprends pas ?
int nbJoueur=0; //déclaration de la variable
cout << "nombre:"; //affichage de "nombre:"
while( !(cin >> nbJoueur) ) { //lecture du clavier en tentant de stockant dans la variable nbJoueur. On boucle jusqu'à ce que l'affectation de la variable se fasse sans erreur.
    string tmp; //déclaration de tmp
    cin.clear(); //on efface les bits d'erreur
    cin >> tmp; //ce qui n'a pa pas pu être stocké dans nbJoueur le sera dans tmp (cela videra le buffer. Mais ça sera mieux de tout simplement purger le buffer clavier)
    cout << "incorrect" << endl;
}
0
Lanthane
 
Bonjour fiddy,

Je n'avais pas vu ton post dsl!

Quand je disais ne pas comprendre c'était au sujet du code en C donné par ZeRo0Cold (le sujet ayant été upé apparemment).
0
Lanthane
 
Sinon en effet ton code est très intéressant je te remercie! Le seul détails c'est que l'utilisateur peu entré tout ce qu'il désire avec un chiffre... Par contre il est vrai que cela ne renvoi qu'une seule erreur et non plusieurs comme le problème que j'avais il y a peu de temps ^^.

Maintenant que mon problème est résolu, je n'ai plus qu'a planché sur ces différentes solutions histoire d'être sur de bien avoir tout assimilé ^^

Merci encore a vous.
0
Lanthane
 
matthoffman,

Je te remercie, après avoir effectué quelques tests sur le code que tu m' fourni, cela marche impeccable.
Quand j'aurais un peu plus de temps je relirai un peu tout ca histoire de bien comprendre le système.
Ensuite je vais l'appliquer aux différentes sections de mon programme qui on ce même problème.

Grâce a toi je vais enfin pouvoir finalisé mon programme et obtenir quelque chose de propre (et à l'abri des utilisateurs maladroits XD).

Pour le petit lien que j'ai trouvé et posté ci dessus, qu'en pense tu?
0
matthoffman Messages postés 405 Date d'inscription   Statut Membre Dernière intervention   47
 
De rien, content d'avoir pu t'aider.

En ce qui concerne le lien que tu as poste, en effet il a l'air tres interessant pour expliquer tout ca, j'ai lu en diagonale vu la longueur du tuto, mais on retrouve bien certains principes qui sont dans les quelques lignes de code que je t'ai donne.

"Ensuite je vais l'appliquer aux différentes sections de mon programme qui on ce même problème. "

Pense a faire un code generique alors:
Une fonction de verification qui prends ton entier en argument (et pourquoi pas un message d'erreur), et tu n'as plus qu'a faire l'appel a la fonction.

Bon courage pour la suite.
0
Lanthane
 
Oui j'ai justement trouvé ce tuto par hasard en tapant certaines fonctions que TU m'avais fourni ^^ alors que je voulais bien en comprendre le principe.

Pour les fonctions recurante je les place habituellement dans un fichier cpp afin de les apeller ensuite :). Le tuto dont je me sert (du site du zero d'ailleurs) m'y a déjà habitué ainsi que les bases de programmation que j'avais reçu avant ca.

Maintenant j'ai du boulot pour le week end pour appliquer tous ca correctement ^^.

Merci beaucoup pour ta patience et tes conseils adaptées.
0