1.注意事项
这里是问题所在:
```c
x1 =(- b + sqrt(ant)) / 2 * a;
x2 =(- b - sqrt(ant)) / 2 * a;
```
由于`/`和`*`具有相同的优先级,并且从左到右进行运算,所以`2 * a`实际上是与`sqrt(ant)`相乘,而不是与整个除法结果相乘。因此,你会得到一个非常小的数(如果`a`不是非常大)除以`2 * a`,结果接近0。
为了修复这个问题,你需要用括号将除法运算包围起来,确保`2 * a`是在分母中:
```c
x1 = (-b + sqrt(ant)) / (2 * a);
x2 = (-b - sqrt(ant)) / (2 * a);
```
此外,当`ant`等于0时,你试图将`x1`的值赋给`x2`,但是实际上你再次将`-b / 2 * a`的结果赋给了`x1`,而没有将`x1`的值赋给`x2`。你应该直接这样做:
```c
else if (ant == 0)
{
x1 = -b / (2 * a);
x2 = x1; // 或者简单地不设置x2,因为x1和x2现在是相同的
printf("方程有两个相同的根\nx1=%d x2=%d", x1, x2);
}
```
请注意,如果`a`为0,则方程不是一个二次方程,而且除以0会导致运行时错误。在实际的程序中,你应该检查`a`是否不为0。
我还添加了`#include<math.h>`来包含`sqrt`函数的定义,并将`ant`、`x1`和`x2`的类型更改为`double`,因为方程的解可能是浮点数。此外,我还使用了`%.2f`来格式化输出浮点数,以便结果更易于阅读。
2.正确全部代码:
#include<stdio.h>
#include<math.h>
int main(){
int a, b, c;
double ant = 0.0;
double x1 = 0.0;
double x2 = 0.0;
printf("请输入一元二次方程的三个系数:");
scanf("%d%d%d", &a, &b, &c);
if (a == 0) {
printf("这不是一个方程");
return 1;
}
ant = b * b - 4 * a * c;
if (ant > 0) {
x1 =(- b + sqrt(ant)) / (2 * a);
x2 =(- b - sqrt(ant)) /( 2 * a);
printf("方程有两个不同的根\nx1=%.2f x2=%.2f",x1,x2);
}
else if (ant == 0)
{
x1 = -b / (2 * a);
x1 = x2;
printf("方程有两个相同的根\nx1=%.2f x2=%.2f", x1, x2);
}
else {
printf("方程无解");
}
return 0;
}