在Linux上运行C中的二次方程求解器

时间:2017-05-22 09:09:12

标签: c linux gcc

我对编程有点新意,我试图编写一个程序来解决二次方程,这是我的代码:

#include <stdio.h>
#include <math.h>

void main (){
  int a, b, c, delta;
  float root1, root2;
  delta = ( b * b ) - ( 4 * a * c );
  printf("enter a, b, c, in such syntax ax^2 + bx + c:\n");
  scanf("%d%d%d", &a, &b, &c);
  printf("You mean %dx^2 + %dx + %d, delta=%f\n\n", a, b, c, delta);

  if ( delta < 0 )
      printf("The equation has no roots.\n");
  if ( delta == 0 ){
      root1 = -b / (2*a);
      printf("The equaion has one root: %d\n", root1);
  }
  if ( delta > 0 ){
      root1 = (-b + sqrt(delta)) / (2*a);
      root2 = (-b - sqrt(delta)) / (2*a);
      printf("root 1 = %f\nroot 2 = %f\n", root1, root2);
  }
}

它编译时没有错误,问题是每次我运行它,输入相同,我得到不同的答案!

  

$ ./qe
  输入a,b,c,用这样的语法ax ^ 2 + bx + c:
  2
  4
  2
  你的意思是2x ^ 2 + 4x + 8,delta = 0.000000

     

这个等式没有根源   $ ./qe
  输入a,b,c,用这样的语法ax ^ 2 + bx + c:
  2
  4
  2
  你的意思是2x ^ 2 + 4x + 8,delta = 0.000000

     

root 1 = 6543.122070
  根2 = -6545.122070
  $ ./qe
  输入a,b,c,用这样的语法ax ^ 2 + bx + c:
  2
  4
  2
  你的意思是2x ^ 2 + 4x + 8,delta = 0.000000

     

root 1 = 8342.037109
  根2 = -8344.037109
  $ ./qe
  输入a,b,c,用这样的语法ax ^ 2 + bx + c:
  2
  4
  2
  你的意思是2x ^ 2 + 4x + 8,delta = 0.000000

     

这个等式没有根源   。
  。

我很困惑。有什么问题?我的gcc版本:6.3.1 20170306(GCC)
我应该怎么解决这个问题? 感谢名单。

1 个答案:

答案 0 :(得分:3)

TL; DR 您的代码会导致undefined behavior

详细说明,

 delta = ( b * b ) - ( 4 * a * c );

abc未初始化使用。他们

  • 可以有陷阱表示
  • 没有他们的地址。

所以,这会调用UB。

你需要

  • 首先检查scanf()来电
  • 是否成功
  • 在成功扫描所涉及的操作数的值后移动delta的计算。

另外,对于托管环境,main()的符合签名将为int main(void),而不是void main ()