带有 do 函数的无限循环

Infinite loop with do function

我是 C++ 和一般编程的超级新手,我需要一些帮助。我不明白为什么电脑已经猜到我的号码就无限循环了。目前我在最后放了一个中断功能。如有任何建议,我们将不胜感激。

// Computer guesses number

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

int main()
{
    srand(static_cast<unsigned int>(time(0))); // Generates random number

    int myNumber; // My number.
    int computersNumber = 0; 
    int tries = 0;
    int highest = 100; // Highest number the computer has put.
    int lowest = 1; // Lowest number the computer has put.

    cout << "\tHello, in this game the computer will try to find your number.\n\n";
    cout << "Please insert your number ( 1 - 100 ): ";
    cin >> myNumber; // My number, that the computer is going to guess.

    while (myNumber <= 0 || myNumber >= 101) // Checks if user has inputed a legal number.
    {
        cout << "You entered an illegal number. Please type a new one.\n";
        cin >> myNumber; // If user made an illegal choice it asks to input a new one.
    } 

    do
    {
        int computersNumber = rand() % (highest - lowest) + lowest;
        ++tries; // adds +1 every time computer guesses wrong number.

        if (myNumber > computersNumber)
        {
            cout << "The computer guessed: " << computersNumber << "\n";
            lowest = computersNumber + 1;
        }
        else if (myNumber < computersNumber)
        {
            cout << "The computer guessed: " << computersNumber << "\n";
            highest = computersNumber - 1;
        }
        else
        {
            cout << "Computer guessed your number in " << tries << " tries.\n";
            break; // infinite loop if this wasn't here.
        }

    } while (myNumber != computersNumber);

    return 0;
}

您的问题是您在 do-while 循环中重新声明了 computersNumber。这将创建一个新的本地变量实例,do-while 中的所有内容都使用该实例,但 while() 语句本身的条件仍然引用 main() 方法中声明的 computersNumber 变量,这没有被改变,因为 int computersNumber = rand() % (highest - lowest) + lowest; 告诉 C++ 在 do-while 循环中创建一个新变量,而不是修改 main.

中的原始变量

要修复它,请更改此行:

int computersNumber = rand() % (highest - lowest) + lowest;

为此:

computersNumber = rand() % (highest - lowest) + lowest;

您正在 do 循环中声明一个新变量: int computersNumber = rand() % (highest - lowest) + lowest;

这个定义在循环范围内,在 do { } 块之外是不可见的。

您的 while (myNumber != computersNumber); 条件正在检查循环外的 int computersNumber = 0; 定义,该定义始终为 0。

修复方法是在循环内重用现有变量而不是创建新变量,因此从以下行中删除 int

int computersNumber = rand() % (highest - lowest) + lowest;

而是使用

computersNumber = rand() % (highest - lowest) + lowest;.

您在循环中声明了另一个名为 computersNumber 的变量。 while 语句中使用的 computersNumber 是您在 main 函数中声明的另一个变量。

您可以通过在循环中使用相同的变量来解决此问题:

更改此行

int computersNumber = rand() % (highest - lowest) + lowest;

并删除 int 关键字。

computersNumber = rand() % (highest - lowest) + lowest;

您可以在以下 link:
中阅读有关变量范围的更多信息 https://www.tutorialspoint.com/cplusplus/cpp_variable_scope.htm

您在两个地方声明 computersNumber。因此,您将一个设置为零,int computersNumber = 0;,在另一个位置,您将随机数分配给 int computersNumber = rand() % (highest - lowest) + lowest;

设置为零的就是你正在检查的那个,因为设置为随机数的那个只有它所设置的每次迭代的范围。意思是循环外computersNumber 始终为零,并且在循环内部创建了一个具有随机值的新 computersNumber 。所以只要 myNumber 不设置为零,就会有一个无限循环。

要解决此问题,只需从 int computersNumber = rand() % (highest - lowest) + lowest; 中删除 int,使其成为 computersNumber = rand() % (highest - lowest) + lowest;,每次循环时,您都会将 computersNumber 设置为一个随机值,如果该随机值值匹配 myNumber 它将打破循环。