我对编程有点新意,我试图编写一个程序来解决二次方程,这是我的代码:
#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.000000root 1 = 6543.122070
根2 = -6545.122070
$ ./qe
输入a,b,c,用这样的语法ax ^ 2 + bx + c:
2
4
2
你的意思是2x ^ 2 + 4x + 8,delta = 0.000000root 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)
我应该怎么解决这个问题?
感谢名单。
答案 0 :(得分:3)
TL; DR 您的代码会导致undefined behavior。
详细说明,
delta = ( b * b ) - ( 4 * a * c );
a
,b
,c
未初始化使用。他们
所以,这会调用UB。
你需要
scanf()
来电delta
的计算。另外,对于托管环境,main()
的符合签名将为int main(void)
,而不是void main ()