因此,对于此程序,用户必须输入1到4之间的数字。目前,如果用户错误地输入了不同的数字,程序会提醒用户,但问题是字符。如果用户输入除数字以外的任何类型的字符,则循环变为无限循环。
我想知道是否可以在C ++的介绍级别完成(非常类似于当前代码)
这是代码
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
int firstNum,
secondNum,
subFirstNum,
subSecNum,
operNum,
num; // User's input answer for operations
bool temBool = true; // Temporary boolean used in the while loop
unsigned seed; // Random generator seed
// Use the time function to get a "seed" value for srand
seed = time(0);
srand(seed);
//Start of the loop
while (temBool)
{
//Random generated operands
firstNum = rand() % 40 + 10;
secondNum = rand() % 40 + 10;
// Set of randoms numbers for substraction where the denominator is always
// lower than the numerator.
subFirstNum = rand() % 30 + 20;
subSecNum = rand() % 10 + 10;
// Menu of Math Tutor
cout << "Math Tutor - Main Menu";
cout << endl << endl;
cout << "1. Adittion\n";
cout << "2. Subtraction\n";
cout << "3. Multiplication\n";
cout << "4. Exit Program\n";
cout << endl << endl;
cout << "Choose your operation to practice (1-4) ";
cin >> operNum;
cout << endl << endl;
// Switch for the menu's options
switch (operNum)
{
srand(seed);
case 1:
cout << "Working with addition\n";
cout << setw(3) << firstNum << "\n"
<< "+" << secondNum << "\n"
<< "---\n";
cout << "Your answer: ";
cin >> num;
if(num == firstNum + secondNum)
{
cout << "Correct answer: "
<< firstNum + secondNum << " Congratulations!\n";
}
else
{
cout << "Correct answer: "
<< firstNum + secondNum << " Sorry!\n";
}
cout << endl << endl;
break;
case 2:
cout << "Working with subtraction\n";
cout << setw(3) << subFirstNum << "\n"
<< "-" << subSecNum << "\n"
<< "---\n";
cout << "Your answer: ";
cin >> num;
if(num == subFirstNum - subSecNum)
{
cout << "Correct answer: "
<< subFirstNum - subSecNum << " Congratulations!\n";
}
else
{
cout << "Correct answer: "
<< subFirstNum + subSecNum << " Sorry!\n";
}
cout << endl << endl;
break;
case 3:
cout << "Working with multiplication\n";
cout << setw(3) << firstNum << "\n"
<< "*" << secondNum << "\n"
<< "---\n";
cout << "Your answer: ";
cin >> num;
if(num == firstNum * secondNum)
{
cout << "Correct answer: "
<< firstNum * secondNum << " Congratulations!\n";
}
else
{
cout << "Correct answer: "
<< firstNum * secondNum << " Sorry!\n";
}
cout << endl << endl;
break;
case 4:
cout << "Thank you for using Math Tutor.\n\n";
temBool = false;
break;
default:
cout << "Incorrect menu seletion. Please choose between 1 and 4.\n\n";
break;
return 0;
}
}
}
答案 0 :(得分:1)
一旦流状态由于无效提取,格式错误等而向南移动,除了检测它之外,你几乎无能为力,确定清除失败状态是否适用,如果是,则继续进行。有时它不适用(例如到达EOF;那里不太好)。
这样的事情:
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
int firstNum,
secondNum,
subFirstNum,
subSecNum,
operNum,
num; // User's input answer for operations
bool temBool = true; // Temporary boolean used in the while loop
// Use the time function to get a "seed" value for srand
std::srand(static_cast<unsigned>(std::time(nullptr)));
//Start of the loop
while (temBool)
{
//Random generated operands
firstNum = rand() % 40 + 10;
secondNum = rand() % 40 + 10;
// Set of randoms numbers for substraction where the denominator is always
// lower than the numerator.
subFirstNum = rand() % 30 + 20;
subSecNum = rand() % 10 + 10;
// Menu of Math Tutor
cout << "Math Tutor - Main Menu";
cout << endl << endl;
cout << "1. Adittion\n";
cout << "2. Subtraction\n";
cout << "3. Multiplication\n";
cout << "4. Exit Program\n";
cout << endl << endl;
cout << "Choose your operation to practice (1-4) ";
// test for successful extraction
if (!(std::cin >> operNum))
{
// yes there are times when you actually use .eof()
if (std::cin.eof())
break;
// flush out the stream through the pending newline
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
continue;
}
cout << endl << endl;
// Switch for the menu's options
switch (operNum)
{
case 1:
cout << "Working with addition\n";
cout << setw(3) << firstNum << "\n"
<< "+" << secondNum << "\n"
<< "---\n";
cout << "Your answer: ";
cin >> num;
if(num == firstNum + secondNum)
{
cout << "Correct answer: "
<< firstNum + secondNum << " Congratulations!\n";
}
else
{
cout << "Correct answer: "
<< firstNum + secondNum << " Sorry!\n";
}
cout << endl << endl;
break;
case 2:
cout << "Working with subtraction\n";
cout << setw(3) << subFirstNum << "\n"
<< "-" << subSecNum << "\n"
<< "---\n";
cout << "Your answer: ";
cin >> num;
if(num == subFirstNum - subSecNum)
{
cout << "Correct answer: "
<< subFirstNum - subSecNum << " Congratulations!\n";
}
else
{
cout << "Correct answer: "
<< subFirstNum + subSecNum << " Sorry!\n";
}
cout << endl << endl;
break;
case 3:
cout << "Working with multiplication\n";
cout << setw(3) << firstNum << "\n"
<< "*" << secondNum << "\n"
<< "---\n";
cout << "Your answer: ";
cin >> num;
if(num == firstNum * secondNum)
{
cout << "Correct answer: "
<< firstNum * secondNum << " Congratulations!\n";
}
else
{
cout << "Correct answer: "
<< firstNum * secondNum << " Sorry!\n";
}
cout << endl << endl;
break;
case 4:
cout << "Thank you for using Math Tutor.\n\n";
temBool = false;
break;
default:
cout << "Incorrect menu seletion. Please choose between 1 and 4.\n\n";
break;
return 0;
}
}
}
答案 1 :(得分:0)
用if语句环绕开关
if (operNum==1||operNum==2||operNum==3||operNum==4){
...
}
答案 2 :(得分:0)
我的组织仅为此目的提供以下代码。
#include <cctype>
#include <cstdlib>
#include <string>
/**
* @brief function returns the integer value of the string entered, negative
numbers in the input string are not allowed. First non-digit character
(including minus sign (-)) terminates parsing of the input string
* @exception throws no exception, return value for every input
* @param[in] input string containing the response of the user
* @return <int> errorValue = -1, non-negative value is the response of the user
*/
int menuResponse(std::string input)
{
int response = 0;
int length = 0;
response = atoi(input.c_str()); // <--- magic happens here
// check for an error in the 1st character itself, only source of false 0
// as a response value
if (isdigit(input[0]))
{
return response;
}
else
{
return -1;
}
}