C++ Do-while循环停止
C++ Do-while loop stopping
我接到了一项作业,我们要显示一个 cmd 提示符并显示一个用于乘法的抽认卡游戏。输入正确答案后,会出现一个提示,要求用户去 "Again? Y/N.",在第二次输入回答后,询问用户的提示没有出现,而是停留在 "congratulations" 消息上。当我编写代码为游戏随机生成两个数字时,就会发生这种情况。一个在 while 循环外,一个在 while 循环内。如果我在随机数的第二个代码中遗漏一个,它将 运行 正常,但只会再次显示相同的数字。我想问的是如何修复它以便在输入第二个答案后不会卡住?
示例代码如下:
#include <iostream>
using namespace std;
int main()
{
int num1, num2, ans, guess, count = 0;
char choice;
num1 = rand() % 12 + 1;
num2 = rand() % 12 + 1;
//first number generator.
ans = num1 * num2;
do
{
{
cout << num1 << " X " << num2 << " = ";
cin >> guess;
cout << "Wow~! Congratulations~! ";
count++;
num1 = rand() % 12 + 1;
num2 = rand() % 12 + 1;
//second number generator.
} while (guess != ans);
cout << "\nAgain? Y/N: ";
cin >> choice;
} while ((choice == 'y') || (choice == 'Y'));
//after two turns the loop stops. Can't make a choice.
cout << " Thanks for playing! Number of tries:" << count << endl;
return 0;
}
问题可以在这里找到:
do
{
{
cout << num1 << " X " << num2 << " = ";
cin >> guess;
如您所见,第二个作用域没有 do
语句。结果它只是一个代码块。
第二个代码块写do
语句即可解决
因为 do
不在第二个括号 ({
) 中,所以 while
被解释为 while
循环:
while (guess != ans);
或
while (guess != ans) {
}
这样一直循环直到guess
不等于ans
。但是由于在循环中不修改两个变量中的任何一个,所以循环会一直迭代。
其他错误:请注意程序仍然不正确,因为它会声称您已经回答了问题,而不管答案是什么。您可以通过如下方式实现它来修复它:
int main()
{
int num1, num2, ans, guess, count = 0;
char choice;
do {
num1 = rand() % 12 + 1;
num2 = rand() % 12 + 1;
ans = num1 * num2;
do {
cout << num1 << " X " << num2 << " = ";
cin >> guess;
if(guess == ans) {
cout << "Wow~! Congratulations~! ";
} else {
cout << "No, wrong!\n";
}
count++;
} while (guess != ans);
cout << "\nAgain? Y/N: ";
cin >> choice;
} while ((choice == 'y') || (choice == 'Y'));
//after two turns the loop stops. Can't make a choice.
cout << " Thanks for playing! Number of tries:" << count << endl;
return 0;
}
我猜问题出在你的循环和你想象的不一样。
do
{
上面的代码启动了一个 do
循环。
{
我怀疑您打算在此处开始另一个(嵌套的)do
循环——但是您离开了 do
,因此它只是一个进入、执行和退出的块。在这种情况下毫无用处和意义。
cout << num1 << " X " << num2 << " = ";
cin >> guess;
cout << "Wow~! Congratulations~! ";
count++;
num1 = rand() % 12 + 1;
num2 = rand() % 12 + 1;
//second number generator.
} while (guess != ans);
您将其格式化为好像 while
正在关闭嵌套的 do
循环——但是由于您实际上并没有创建嵌套的 do
循环,所以这只是while
循环体为空。稍微重新格式化一下,其含义会更加明显:
// second number generator
}
while (guess != ans)
/* do nothing */
;
我接到了一项作业,我们要显示一个 cmd 提示符并显示一个用于乘法的抽认卡游戏。输入正确答案后,会出现一个提示,要求用户去 "Again? Y/N.",在第二次输入回答后,询问用户的提示没有出现,而是停留在 "congratulations" 消息上。当我编写代码为游戏随机生成两个数字时,就会发生这种情况。一个在 while 循环外,一个在 while 循环内。如果我在随机数的第二个代码中遗漏一个,它将 运行 正常,但只会再次显示相同的数字。我想问的是如何修复它以便在输入第二个答案后不会卡住?
示例代码如下:
#include <iostream>
using namespace std;
int main()
{
int num1, num2, ans, guess, count = 0;
char choice;
num1 = rand() % 12 + 1;
num2 = rand() % 12 + 1;
//first number generator.
ans = num1 * num2;
do
{
{
cout << num1 << " X " << num2 << " = ";
cin >> guess;
cout << "Wow~! Congratulations~! ";
count++;
num1 = rand() % 12 + 1;
num2 = rand() % 12 + 1;
//second number generator.
} while (guess != ans);
cout << "\nAgain? Y/N: ";
cin >> choice;
} while ((choice == 'y') || (choice == 'Y'));
//after two turns the loop stops. Can't make a choice.
cout << " Thanks for playing! Number of tries:" << count << endl;
return 0;
}
问题可以在这里找到:
do
{
{
cout << num1 << " X " << num2 << " = ";
cin >> guess;
如您所见,第二个作用域没有 do
语句。结果它只是一个代码块。
第二个代码块写do
语句即可解决
因为 do
不在第二个括号 ({
) 中,所以 while
被解释为 while
循环:
while (guess != ans);
或
while (guess != ans) {
}
这样一直循环直到guess
不等于ans
。但是由于在循环中不修改两个变量中的任何一个,所以循环会一直迭代。
其他错误:请注意程序仍然不正确,因为它会声称您已经回答了问题,而不管答案是什么。您可以通过如下方式实现它来修复它:
int main()
{
int num1, num2, ans, guess, count = 0;
char choice;
do {
num1 = rand() % 12 + 1;
num2 = rand() % 12 + 1;
ans = num1 * num2;
do {
cout << num1 << " X " << num2 << " = ";
cin >> guess;
if(guess == ans) {
cout << "Wow~! Congratulations~! ";
} else {
cout << "No, wrong!\n";
}
count++;
} while (guess != ans);
cout << "\nAgain? Y/N: ";
cin >> choice;
} while ((choice == 'y') || (choice == 'Y'));
//after two turns the loop stops. Can't make a choice.
cout << " Thanks for playing! Number of tries:" << count << endl;
return 0;
}
我猜问题出在你的循环和你想象的不一样。
do
{
上面的代码启动了一个 do
循环。
{
我怀疑您打算在此处开始另一个(嵌套的)do
循环——但是您离开了 do
,因此它只是一个进入、执行和退出的块。在这种情况下毫无用处和意义。
cout << num1 << " X " << num2 << " = ";
cin >> guess;
cout << "Wow~! Congratulations~! ";
count++;
num1 = rand() % 12 + 1;
num2 = rand() % 12 + 1;
//second number generator.
} while (guess != ans);
您将其格式化为好像 while
正在关闭嵌套的 do
循环——但是由于您实际上并没有创建嵌套的 do
循环,所以这只是while
循环体为空。稍微重新格式化一下,其含义会更加明显:
// second number generator
}
while (guess != ans)
/* do nothing */
;