C ++中的无限while循环

时间:2014-09-09 21:28:15

标签: c++ while-loop

我正在教自己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;
    }

5 个答案:

答案 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”输入