我的while循环在C中比它应该在结束之前重放一次



当给定输入时,我的while循环在结束循环之前额外打印一次。例如,8 7 38 3 -5 -1 q是我的输入,打印出

为蛮力方程求解器提供6个整数系数:解:x = 3, y = 2

再次运行程序?键入'q'退出或任何其他键继续:

为蛮力方程求解器提供6个整数系数:解:x = 3, y = 2

再次运行程序?键入'q'退出或任何其他键继续:

在第一次迭代后何时结束。有人能帮我一下吗?我的代码粘贴在

下面
#include <stdio.h>
#include <math.h>
#include <stdbool.h>
int main(void) 
{
//Equations should be a1x + b1y = c2 and a2x + b2y = c2
int a1, b1, c1, a2, b2, c2, x, y;
char input;
bool solFound = false;
bool runAgain = true;

//brute force x and y [-10, 10]
while (runAgain == true) 
{
printf("Provide 6 integer coefficients for the brute force equation solver: ");
scanf("%d %d %d %d %d %d", &a1, &b1, &c1, &a2, &b2, &c2);
for (x = -10; x<=10; x++)
{
for (y = -10; y<=10; y++)
{
if (a1*x + b1*y == c1 && a2*x + b2*y == c2)
{
printf("nSolution found: x = %d, y = %dnn", x, y);
solFound = true;
runAgain = false;
}
}
}
if (solFound != true)
{
printf("No solution foundnn");
runAgain = false;
}
scanf("%c", &input);
printf("Run program again? Type 'q' to quit or any other key to continue:");
if (input != 'q')
{
runAgain = true;
}
printf("nn");
}
} ```

对于初学者来说,变量sqlFound应该在while循环中声明,或者至少在while循环中重新初始化。例如

while (runAgain == true) 
{
bool solFound = false;
//...

否则,它将保留循环前一次迭代的值。

if语句

if (solFound != true)
{
printf("No solution foundnn");
runAgain = false;
}

设置变量runAgain

runAgain = false;

没有意义,因为在这个if语句之后,您再次询问是否重复循环

printf("Run program again? Type 'q' to quit or any other key to continue:");
if (input != 'q')
{
runAgain = true;
}

所以删除这个设置

runAgain = false;

if语句。

另一个问题是scanf 的调用
scanf("%c", &input);

必须跟在问题后面

printf("Run program again? Type 'q' to quit or any other key to continue:");

而且格式字符串必须包含前导空白

scanf(" %c", &input);
^^^^^

否则将从输入流中读取空白字符。也就是你需要写

printf("Run program again? Type 'q' to quit or any other key to continue:");
scanf(" %c", &input);
runAgain = input != 'q' && input != 'Q';

在您要求用户再次运行之前,您将花费很多精力来确保runAgainfalse。这不是你想的那样:

if (solFound != true)
{
printf("No solution foundnn");
runAgain = false;
}

一旦solFound变成true,它就保持这种状态,如果程序循环时没有解决方案,则无法打印&;no solution found&;以及未能将runAgain更改为false。

如果runAgain已经是true,这会导致一个问题:

if (input != 'q')
{
runAgain = true;
}

这允许您将false(如果没有解决方案)更改回true(通过输入'q'以外的其他内容)。但是输入'q'不能将true更改为false!

只有当runAgain为false时,输入'q',问题才会停止。

如果您希望仅基于q条目停止,您可以消除solFoundrunAgain之间的第一个块中的连接,并将第二个块替换为:

runAgain = (input != 'q');

这样,runAgain总是根据用户的选择进行更改,而不是单独更改。

相关内容

  • 没有找到相关文章

最新更新