带有 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
它将打破循环。
我是 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
它将打破循环。