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;
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...
kanze@gabi-soft.fr 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...
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...
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é" <<
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 :
-- 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
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é" <<
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 :
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é" <<
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 :