J'écris ce code pour un devoir (juste pour commencer en C++, allez-y doucement). Nous venons de commencer la boucle while, do-while et for aujourd'hui. Le programme fonctionne correctement, sauf que si vous entrez une lettre lorsque le programme vous demande un entier, il sera bouclé indéfiniment. Que se passe-t-il? (Code ci-dessous) *** EDIT: Pour clarifier, la partie en boucle est: "Le nombre que vous avez entré est négatif. Veuillez entrer un nombre positif pour continuer." Mais l'utilisateur n'a pas la possibilité d'entrer un autre numéro. Il continue juste à imprimer ceci.
#include <iostream>
using namespace std;
int main ( )
{
//define variables
int num1, num2, total;
char answer1;
do
{
//user enters a number
cout << "\nPlease enter a positive number and press Enter: \n";
cin >> num1;
//check that the given num1 value is positive
while (num1 < 0)
{
cout << "The number you entered is negative.\nPlease enter a positive number to continue.\n";
cin >> num1;
}
cout << endl;
//add the sum of 1 through num1 value
num2 = 1;
total = 0;
while (num1 >= num2)
{
total = total + num2;
num2 ++;
}
//tell the user the sum
cout << "The total of all the integers\nfrom 1 to " << num1 << " is: \n";
cout << total;
//ask if the user wants to try again
cout << "\n\nWould you like to try again with a new number?\nEnter y for yes or n for no.\n";
cin >> answer1;
} while (answer1 == 'y');
cout << endl;
return 0;
}
Voici comment fonctionne basic_istream
. Dans votre cas, lorsque cin >> num1
reçoit une mauvaise saisie, failbit
est défini et cin
n'est pas effacé. Donc, la prochaine fois, ce sera la même mauvaise entrée. Pour gérer cela correctement, vous pouvez ajouter un contrôle de saisie et effacer & ignorer cin
en cas de saisie incorrecte. Par exemple:
#include<limits>
//user enters a number
cout << "\nPlease enter a positive number and press Enter: \n";
do {
while(!(cin >> num1)) {
cout << "Incorrect input. Please try again.\n";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
if(num1 < 0) cout << "The number you entered is negative. Please enter a positive number to continue.\n";
} while(num1 < 0);
Cette réponse devrait résoudre votre problème. En gros, vous essayez de lire un caractère dans le flux et il ne peut pas être analysé comme un int, le flux reste donc dans un état d'erreur.
Vous devez rechercher une erreur, la supprimer et réagir en conséquence.
Lorsque vous entrez une lettre, l'état d'erreur cin
est défini et aucune autre entrée n'est possible avant d'appeler cin.clear()
. En conséquence, l'instruction cin >> num1
ne modifiera pas la valeur de num1
et vous effectuerez une boucle indéfinie.
Essaye ça:
while (num1 < 0)
{
cout << "The number you entered is negative.\nPlease enter a positive number to continue.\n";
cin.clear();
cin >> num1;
}
MODIFIER:
Merci à Lightness de l'avoir signalé. Vous devriez également initialiser num1
:
int num1=-1, num2, total;
Vous pouvez utiliser un type de données "char" comme entrée de l'utilisateur Puis utiliser "static_cast (" nom de variable ");
char input;
int choose;
cin >> input;
choose = static_cast<int>(choose) - 48;///then use 'if' statement with the variable 'choose'