卡在无限循环中

时间:2012-02-15 14:32:48

标签: c++ infinite-loop do-while

我试图用c ++简单地猜测我的数字游戏,但计算机需要猜测我的数字。但问题是我陷入了这种无限循环。我只是一个初学者,所以这是一个非常基本的程序。

这是我的代码:

int secretNumber = rand() %100 + 1; // random number between 1-100
int tries=0;
int input;

cout <<"typ your number\n";
cin >> input;

do
{
    cout <<secretNumber <<endl;
    ++tries;

    if (secretNumber > input)
    {
        cout <<"To high i guess?\n";
    }
    else if (secretNumber < input)
    {
        cout <<"To low I guess?\n";
    }
    else 
    {
        cout <<"Yes, i got it in " <<tries <<" tries!";
    }
}while (input != secretNumber);

return 0;

}

6 个答案:

答案 0 :(得分:5)

cin >> input放入循环体

答案 1 :(得分:4)

我认为你应该在循环中移动随机数生成。

答案 2 :(得分:3)

变量input的值永远不会在循环中更改,因此永远不会满足终止条件input != secretNumber

你应该在循环内部输入。所以在循环开始时写cin >> input

修改

如果计算机应该猜测,那么仍然需要在循环中更改input的值,这在代码中不存在。循环每次都在input中以相同的值运行。

为了让你的计算机做出猜测,你应该遵循一些方案。计算机可以随机绘制数字 - 您可以通过在循环内移动secretNumber = rand()%100 + 1来获得数字。但是这种方法可能表现不佳,循环可能仍然会持续很长时间。这在@Kaii的答案中有所体现。

更有效的方法是Binary Search。在这种情况下,您应该跟踪计算机的猜测。保留两个变量highlow,它们应分别存储高于和低于input的猜测。每当猜测高于数字时,将其存储在high中,并将任何低于input的猜测存储在low中。然后,计算机应在highlow之间尝试新猜测。随机猜测应为secretNumber = low + rand() % (high - low)。在最坏的情况下,它将需要多达100次迭代。为获得最佳效果,每个猜测应为(high + low) / 2。根据条件,highlow中的一个将在每次迭代中更新。这种方法将确保计算机在7次猜测中猜出正确的数字。

在您的代码中,它应该是这样的:

int secretNumber = rand() % 100 + 1; // random number between 1-100
int tries=0;
int input;
int low = 1, high = 100;

cout <<"typ your number\n";
cin >> input;

do
{
    secretNumber = (high + low) / 2;
    cout << secretNumber <<endl;
    ++tries;

    if (secretNumber > input)
    {
        cout << "Too high I guess?\n";
        high = secretNumber;
    }

    else if (secretNumber < input)
    {
        cout << "Too low I guess?\n";
        low = secretNumber;
    }

    else 
    {
        cout << "Yes, i got it in " << tries << " tries!";
    }        
} while (input != secretNumber);

return 0;

答案 3 :(得分:2)

计算机只在程序启动时猜测(随机),但每次循环迭代时都要猜测。你应该在循环中移动随机数生成:

int secretNumber = 0;
int tries=0;
int input;

cout <<"typ your number\n";
cin >> input;

do
{
    /* the fix is here */
    secretNumber = rand() %100 + 1; // random number between 1-100
    cout <<secretNumber <<endl;
    ++tries;

    if (secretNumber > input)
    {
        cout <<"To high i guess?\n";
    }
    else if (secretNumber < input)
    {
        cout <<"To low I guess?\n";
    }
    else 
    {
        cout <<"Yes, i got it in " <<tries <<" tries!";
    }
}while (input != secretNumber);

return 0;

答案 4 :(得分:0)

你必须在循环中进行输入。现在你在开始循环之前提示输入一个值,然后再也不要求用户输入另一个数字。如果无法改变猜测,则循环永远不会退出。

更改为

do {
    cin >> input;

将解决无限循环。

答案 5 :(得分:0)

代码中的无限循环,因为while的参数始终为true,直到得到真正的数字。

你需要添加另一个参数。例如,您希望将最大尝试次数设置为5次。那就像这样

do{
    //do your stuff here
}while((input != secretNumber)&&(tries<=5))

当您输入错误的数字5次时,应用程序将完成