Comment Limiter les Entrées de Numéros Seulement
J'ai récemment créé un programme qui va créer un problème de mathématiques, basée sur la saisie de l'utilisateur. En entrant 1-4 le programme peut générer un problème ou l'utilisateur peut quitter en entrant 5. Le seul problème que j'ai c'est que quand je tape un caractère, le programme entre dans une boucle infinie. Quelle fonction dois-je utiliser pour vérifier si l'entrée n'est pas un numéro afin que je puisse afficher un message d'erreur?
//CIS180 Assignment #4
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
//Declare variables.
int num1, num2, menuNum;
int addInput, subInput, multInput, divInput;
int addAnswer, subAnswer, multAnswer, divAnswer;
int addSolution, subSolution, multSolution, divSolution;
srand(time(0));
//Display menu.
cout << "Menu" << endl;
cout << "1. Addition problem" << endl;
cout << "2. Subtraction problem" << endl;
cout << "3. Multiplication problem" << endl;
cout << "4. Division problem" << endl;
cout << "5. Quit this program" << endl << endl;
cout << "Enter your choice (1-5): " << endl;
cin >> menuNum;
//Loop that will provide math problems when user inputs number.
while(menuNum != 5)
{
//Check if the input is valid.
while((menuNum < 1) || (menuNum >5))
{
cout << "The valid choices are 1, 2, 3 , 4, and 5. Please choose: " << endl;
cin >> menuNum;
}
//Generate two random numbers for addition and display output.
if(menuNum == 1)
{
num1 = rand()%500 + 1;
num2 = rand()%500 + 1;
addSolution = num1 + num2;
cout << setw(5) << right << num1 << endl;
cout << setw(2) << left << "+" << setw(3) << right << num2 << endl;
cout << setw(5) << fixed << "-----" << endl;
cin >> addAnswer;
//Check if the addition answer input is correct.
if(addAnswer != addSolution)
cout << "Sorry, the correct answer is " << addSolution << "." << endl;
else if(addAnswer == addSolution)
cout << "Congratulations! That's right." << endl << endl;
}
.
.
.
Pouvez-vous limiter le problème à partir de plus de 100 lignes de code?
En passant, vous n'avez pas besoin de déclarer toutes les variables au début de votre programme. Au lieu de cela, les déclarer, d'où elles sont effectivement utilisées. De cette façon, vous aurez toujours se rappeler que
En passant, vous n'avez pas besoin de déclarer toutes les variables au début de votre programme. Au lieu de cela, les déclarer, d'où elles sont effectivement utilisées. De cette façon, vous aurez toujours se rappeler que
menuNum
est un int
et ne pas oublier de les initialiser.OriginalL'auteur big_beef | 2013-09-21
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous devez détecter si votre entrée tentative a été un succès: toujours vérifier après lecture lire la tentative a été couronnée de succès. Ensuite, si vous constatez que vous ne pouvez pas lire une valeur que vous aurez besoin de réinitialiser le flux à un bon état à l'aide de
clear()
et vous aurez besoin de se débarrasser de tous les mauvais caractères, par exemple, à l'aide deignore()
. Étant donné que les personnages sont généralement entrée, c'est à dire, l'utilisateur devait de frapper de retour avant que les caractères ont été utilisés, il est généralement reaonable pour obtenir de l'ensemble de la ligne. Par exemple:L'utilisation de
std::numeric_limits<std::streamsize>::max()
est la façon d'obtenir le nombre magique qui rendignore()
autant de caractères que nécessaire, jusqu'à un personnage de la valeur de son deuxième argument est trouvé.OriginalL'auteur Dietmar Kühl
En fait, oubliez l'étape 2. Il suffit de vérifier s'il a été l'un des chiffres que vous voulez vraiment (
'1'
,'2'
,'3'
,'4'
,'5'
):Bien que je n'ai pas utiliser le code fourni par vous, il a été très utile. J'ai simplement déclaré char menuNum[4], car il ne sera pas utilisé dans les calculs et changé le reste en conséquence, il fonctionne parfaitement bien maintenant. Merci!!!!
Cette solution n'est pas destiné à s'étendre à deux chiffres des choix. Dietmar la solution est différente (et pour un chiffre un peu trop, à mon avis), et c'est pourquoi j'ai posté cette réponse, au lieu de votre standard "lire, tester, claire de" de routine. Les deux sont valables).
OriginalL'auteur Zeta
Vous pouvez utiliser appel isdigit de ctype.h
OriginalL'auteur Simon