0

当给定输入时,我的 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 = %d\n\n", x, y);
                  solFound = true;
                  runAgain = false;
            }
         }
      }
      if (solFound != true)
      {
         printf("No solution found\n\n");
         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("\n\n");
   }
} ```
4

2 回答 2

2

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

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

否则它将保留循环的先前迭代的值。

在这个 if 语句中

  if (solFound != true)
  {
     printf("No solution found\n\n");
     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';
于 2021-09-29T20:34:10.453 回答
1

在您要求用户再次运行之前,您runAgain会遇到很多麻烦。false这不是你想的那样:

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

一旦solFound变为true,它就会保持这种状态,如果程序循环时没有解决方案,则无法打印“未找到解决方案”以及无法更改runAgain为 false。

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

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

这使您可以将false(如果没有解决方案)更改回true(通过输入 以外的内容'q')。但输入'q'不能更改truefalse

runAgain只有当你输入错误时,问题才会停止'q'

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

runAgain = (input != 'q');

这种方式runAgain总是改变以匹配用户的选择,永远不会单独存在。

于 2021-09-29T19:55:01.213 回答