谁能解释一下为什么这个while循环不能正常工作?
#include <iostream>
using namespace std;
void ask_user(int a, int b){
char choice = ' ';
while(choice != 'q' && choice != 'a' && choice != 's' && choice != 'm'){
cout << "choose operation" << endl;
cout << "a to add, s to subtract, m to multiply and q to quit" << endl;
cout << "----------------------------" << endl;
cin >> choice;
switch(choice){
case 'a' : cout << "a + b = " << a + b;
break;
case 's' : cout << "a - b = " << a + b;
break;
case 'm' : cout << "a * b = " << a + b;
break;
case 'q' : break;
default: cout << "please Enter a valid choice " << endl;
}
}
}
int main(){
ask_user(7, 9);
return 0;
}
例如,如果我输入无效的p那么它会正常工作并再次要求有效输入
,但如果我输入pp,当它开始调试并打印消息两次。如果我输入ppp,它会显示
打印三次等…
首先,您对switch
的工作方式存在误解。每个case必须以break
语句结束,这样下一个就不会被执行。
这意味着break
会破坏switch
,而不是while
。
但是主要的问题是你的程序逻辑是错误的。
您不应该循环给定输入的有效性,让switch
语句在default
子句中处理它。
相反,你应该在用户按q键时设置一个标志。
考虑到您定义了以下函数,分别用于显示菜单和请求操作数(为了代码可读性而定义):
void display_menu(char & choice)
{
std::cout << "Operation:na: Additionnm: Multiplicationns: Substractionnq: Quitn";
std::cin >> choice;
}
void ask_operands(int & a, int & b)
{
std::cout << "na ?";
std::cin >> a;
std::cout << "nb ?";
std::cin >> b;
std::cout << 'n';
}
你的代码逻辑可以重写为:
int main()
{
bool quit = false;
char choice;
int a, b;
ask_operands(a, b); // Ask the user which operands to use
while(!quit) // loop over the flag
{
display_menu(choice);
switch(choice)
{
case 'a': std::cout << (a+b);
break;
case 'm': std::cout << (a*b);
break;
case 's': std::cout << (a-b);
break;
case 'q': std::cout << "Exiting...";
quit = true; // Set the flag to false
break;
default: std::cout << "Invalid choice, try again."; //Here you handle the invalid choices (i.e. let the loop iterate again)
}
std::cout << 'n';
}
return 0;
}
生活例子
注意:如果您希望用户能够在每次迭代中更改操作数的值,只需将ask_operands(a, b);
调用移动到循环中。