OVH Cloud OVH Cloud

Newbie: vidage du tampon (cin)

12 réponses
Avatar
Dudule
Hello,

Afin d'effectuer une minuscule routine de saisie de donnés sur le prompt
(je suis en phase d'apprentissage), j'utilise un while avec une condition
de garde. Je teste ensuite la validité des valeurs entrées avec un switch.
Dans le default, je mets un message d'erreur, et je relance la saisie des
données.
Le problème est que lorsque je suis tombé dans le cas du default, je ne peux
plus rentrer de données, et ça boucle à l'infini. Je suppose que c'est lié
au vidage du tampon. Je n'ai pas ce problème avec les autre cases,

Merci pour votre aide.

        cout << "Saisissez les commandes sous la forme:   référence  quantité <<
endl;
        cout << "Entrez 0 0 pour terminer." <<  endl << endl;
        
        cout << "Produit (1-5) / Quantité: ";
        cin >> reference >> quantity;
        
        while (reference !=0 && quantity !=0)
        {
                switch (reference)
                {
                        case 1: quantity1 += quantity;
                                        break;
                        case 2: quantity1 += quantity;
                                        break;
                        case 3: quantity1 += quantity;
                                        break;
                        case 4: quantity1 += quantity;
                                        break;
                        case 5: quantity1 += quantity;
                                        break;
                        default:cout << "Erreur sur la saisie de la référence !" <<
endl << endl;
                                        break;
                }
                cout << "Produit (1-5) / Quantité: ";
                cin >> reference >> quantity;
        }

2 réponses

1 2
Avatar
Dudule
wrote:

Aussi, et plus important, il faut qu'il teste la réussite des
entrées avant le switch. Parce que s'il y a erreur, les valeurs
précédantes ne seront pas modifiées, et il ne veut pas faire un
switch sur elles.


C'est fait ! (voir réponse à Cyrille).

Dans son cas, je verrais bien ce code dans un boucle do...while
(avec la sortie de l'invitation aux entrées en tête de la
boucle).


Ben pour tester la condition de garde lors de la première invite, je dois
faire le test en début de boucle...

Avatar
kanze
Dudule wrote:
Cyrille wrote:


[...]
J'ai donc pondu le code suivant, et sorti le test du switch,
comme indiqué par l'autre contributeur, mais j'ai un petit
soucis: les valeurs saisies sont réaffichées.

Voici une sortie écran:

--------------------------------------------------------------------
Saisissez les commandes sous la forme: référence quantité
Entrez 0 0 pour terminer.

Produit (1-5) / Quantité: a b
Erreur sur la saisie de la référence !

Produit (1-5) / Quantité: 2 4
24Produit (1-5) / Quantité: 0 0
00 Produit Prix unitaire Quantité Montant total
Produit 1 $2.98 0 $ 0.00
Produit 2 $4.50 4 $11.92
Produit 3 $9.98 0 $ 0.00
Produit 4 $4.49 0 $ 0.00
Produit 5 $6.87 0 $ 0.00

--------------------------------------------------------------------

Le code est:
--------------------------------------------------------------------
cout << "Saisissez les commandes sous la forme: référence
quantité" <<

endl;
cout << "Entrez 0 0 pour terminer." << endl << endl;

cout << "Produit (1-5) / Quantité: ";
cin >> reference >> quantity;

while (reference !=0 && quantity !=0)
{
if (cin.fail()==true)
{
cout << "Erreur sur la saisie de la référence !" <<
endl << endl;

cin.clear();
cin.ignore(std::numeric_limits<int>::max(),'n');
}
else
switch (reference)
{
case 1: quantity1 += quantity;
break;
case 2: quantity2 += quantity;
break;
case 3: quantity3 += quantity;
break;
case 4: quantity4 += quantity;
break;
case 5: quantity5 += quantity;
break;
}
cout << "Produit (1-5) / Quantité: ";
cin >> reference >> quantity;


Là, tu les lis.

cout << reference << quantity;


Et ici, tu les réaffiches.

}
--------------------------------------------------------------------


Attention aussi : tu testes reference et quantity en tête de la
boucle. Seulement, s'il y a une erreur d'entrée, ils ne sont pas
positionnés ; ils gardent leurs valeurs d'avant (qui pourrait
être, la première fois, indéfinies).

Pratiquement parlant, la lecture exige sa boucle à elle, aussi
une boucle et démi. Selon les goûts, donc :

cin >> reference >> quantity ;
while ( ! cin ) {
cin.clear() ;
cin.ignore( INT_MAX, 'n' ) ;
cout << "Erreur sur la saisie de la référence !" << endl <<
endl;
cin >> reference >> quantity ;
}

Boucle que je mettrais dans une fonction à part. Peut-être du
genre :

bool
getValues( int& reference, int& quantity )
{
cin >> reference >> quantity ;
while ( ! cin ) {
cin.clear() ;
cin.ignore( INT_MAX, 'n' ) ;
cout << "Erreur sur la saisie de la référence !" << endl
<< endl;
cin >> reference >> quantity ;
}
return reference != 0 && quantity != 0 ;
}

ce qui permet à écrire la boucle principale :

while ( getValues( reference, quantity ) {
switch ( reference ) {
// ...
}
}

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

1 2