我目前正在用C ++编写一个简单的计算器程序,每当我想检查cin
值是否有效时,如果所述输入无效,则向用户提供反馈,我必须重用该条件我的do-while循环和它的嵌套if语句给出了反馈。这感觉多余。
以下是相关代码:
do {
cout << "Enter operator: "; cin >> operatorSign;
if ( operatorSign != '*' && operatorSign != '/'
&& operatorSign != '+' && operatorSign != '-' )
cout << "Must be a valid operator sign (*, /, + or -).\a\n\n";
} while ( operatorSign != '*' && operatorSign != '/'
&& operatorSign != '+' && operatorSign != '-' );
正如您所看到的,我已经两次使用完全相同的条件反馈(如果)和以在输入无效时继续循环。我的问题是,如何减少上面代码的冗余?你可以将条件存储在变量中吗?
答案 0 :(得分:3)
像
这样的东西bool isValid;
do {
isValid = true;
cout << "Enter operator: ";
cin >> operatorSign;
if ( operatorSign != '*' && operatorSign != '/' && operatorSign != '+' && operatorSign != '-' )
{
cout << "Must be a valid operator sign (*, /, + or -).\a\n\n";
isValid = false;
}
} while (!isValid);
答案 1 :(得分:1)
只需编写一个功能
bool isOpInvalid(char op) {
return op != '*' && op != '/' && op != '+' && op != '-';
}
并将循环更改为
do {
cout << "Enter operator: ";
cin >> operatorSign;
if (isOpInvalid(operatorSign))
cout << "Must be a valid operator sign (*, /, + or -).\a\n\n";
} while (isOpInvalid(operatorSign));
或写一个while
循环
while (true) {
cout << "Enter operator: ";
cin >> operatorSign;
if (operatorSign != '*' && operatorSign != '/'
&& operatorSign != '+' && operatorSign != '-')
cout << "Must be a valid operator sign (*, /, + or -).\a\n\n";
else
break;
}
答案 2 :(得分:1)
是的,您可以将条件存储在变量中。有点。 C ++中的bool
类型变量可以存储true
/ false
个值。
bool isInvalid = peratorSign != '*' && operatorSign != '/'
&& operatorSign != '+' && operatorSign != '-';
然后if (isInvalid)
和while (isInvalid)
您应该查看设置变量的位置。
但是,我要做的是创建一个函数来检查选择是否有效并调用它。
bool isInvalid(operatorSign)
{
return peratorSign != '*' && operatorSign != '/'
&& operatorSign != '+' && operatorSign != '-';
}
然后if (isInvalid(operatorSign))
和while (isInvalid(operatorSign))
我不想一次更改太多,但似乎最好创建isValid
/ isValid()
并使用它们的否定。
答案 3 :(得分:1)
使用lambda的许多方法中的另一种:
// use zero value as an error indicator and initial condition
char operatorSign = '\0';
auto check_ok = [&]
{
switch(operatorSign)
{
case '*': case '/': case '+': case '-':
break;
default:
std::cout << "Must be a valid operator sign (*, /, + or -).\a\n\n";
operatorSign = '\0';
break;
}
};
while(!operatorSign)
{
cout << "Enter operator: "; cin >> operatorSign;
check_ok();
}