我正在教自己c ++并正在构建一个简单的菜单程序。我是一个完整的C ++菜鸟所以我提前为这个问题道歉,如果它看起来很愚蠢。我的代码不断调用getNum()并且永远不会退出,尽管选择了正确的菜单。我究竟做错了什么?这是我的代码:
#include <iostream>
#include <string>
using namespace std;
void calc();
void pass();
string getNum(string num);
int main(int argc, const char * argv[])
{
string num = "0";
string menu = "Enter... \n 1 For calculator \n 2 for Passwords";
cout << "Hello this is a sample menu program" << endl;
while(num != "1" || num != "2")
{
getNum(num);
cout << "You selected: " << num << endl;
}
if(num == "1"){
calc();
}
else {
pass();
}
}
void calc() {
cout << " You are running the calculator" << endl;
}
void pass() {
cout << "You are running passwords" << endl;
}
string getNum(string num) {
cout << "What would you like to do?" << endl;
cout << "Enter... \n 1 For calculator \n 2 for Passwords" << endl;
getline(cin, num);
return num;
}
答案 0 :(得分:4)
更改此条件
while(num != "1" || num != "2")
到
while(num != "1" && num != "2")
要正确写入条件,您应该考虑如果num等于“1”或“2”则不应重复循环。这个条件可以写成
num == "1" || num == "2"
但是,如果不满足该条件,则应重复循环。因此循环的条件将重复显示为
! ( num == "1" || num == "2" )
根据数学逻辑,这个条件相当于
num != "1" && num != "2"
最好像
一样重写循环string num;
//...
do
{
getNum(num);
cout << "You selected: " << num << endl;
} while ( num != "1" && num != "2")
在任何情况下都不应该进行至少一次迭代吗?
还将功能定义为
void getNum(string &num);
//...
void getNum( string &num) {
cout << "What would you like to do?" << endl;
cout << "Enter... \n 1 For calculator \n 2 for Passwords" << endl;
getline(cin, num);
}
答案 1 :(得分:1)
getNum(num);
在getNum
中,您有一个返回用户输入内容的return语句。当您致电getNum
时,您不会保存该返回值。
num = getNum(num);
为了使事情更清楚,我会从getNum
中删除输入参数。你不需要传递任何东西,因为它的工作是提示输入一个数字并返回该数字。
string getNum() {
cout << "What would you like to do?" << endl;
cout << "Enter... \n 1 For calculator \n 2 for Passwords" << endl;
string num;
getline(cin, num);
return num;
}
然后将通话更改为:
num = getNum();
另一个问题是你的循环条件。
while(num != "1" || num != "2")
如果num
是"1"
,请考虑一下这会做什么。你想让循环停止,对吗?看看如果我们逐位评估和减少表达式会发生什么:
while(num != "1" || num != "2")
while("1" != "1" || "1" != "2")
while(false || true)
while(true)
那不对。它应该评估为false
。 ||
应为&&
。
while(num != "1" && num != "2")
答案 2 :(得分:1)
行
while(num != "1" || num != "2")
是DeMorgan法律与
相同while(!(num == "1" && num == "2"))
所以你需要
(num == "1" && num == "2")
是真的
因此难度
除了出错的代码的其他位
答案 3 :(得分:1)
你写的是(num!=&#34; 1&#34; || num!=&#34; 2&#34;)
所以num等于&#34; 1&#34;或&#34; 2&#34;或者都没有。在任何情况下,其中一个条件为真(即num不等于1,这是真或num不等于2,这是真的),因此你的while循环始终为true并且连续运行而不停止
答案 4 :(得分:0)
这种情况
while(num != "1" || num != "2")
对于所有输入,将始终返回true。例如,“1”,它在num != "1"
上是假的,但在另一个条件num != 2
上仍然会返回true,因此它永远不会退出(true || false == true)
也应该是
else if(num == '2') {
pass();
}
正确的条件应该while(!(num != "1" && num != "2"))
只允许“1”和“2”输入