项目PT 运行时工具T 爱TWI []Prog1.c [程序改错] 功能:求方程a*x*x+b*x+c=0的解。10 11 方程的解有以下几种可能: 12 1)b*b-4*a*℃=0,方程有两个相等实根。 13 2)b*b-4*a*c>0,方程有两个不等实根。 14 3)b*b-4*a*c<0,方程有两个共轭复根 1516 17 #include<stdio.h> 18 #include<math.h> 19 int main() 20 21 double a,b,c,disc,x1,x2,realpart,imagpart; 22 /**********F0UND**********/ 23 scanf("%f,%lf,%lf",&a,&b,&c); 24 /**********F0UND**********/ 25 disc=b*b-4ac; 26 if(fabs(disc)<=1e-6) 27 printf("has two equal roots:%8.41f\n",-b/(2*a)); 28 else if(disc>1e-6) 29 { 30 x1=(-b+sqrt(disc))/(2*a); 31 x2=(-b-sqrt(disc))/(2*a); 32 printf("has distinct real roots:%8.41f and %8.41f\n",x1,x2); 33 35 34 if *********F0UND**********/ 程 36 37 realpart=-b/(2*a); 38 imagpart=sqrt(-disc)/(2*a); 39 printf("has complex roots:\n"); 40 41 *FOUND***--**** printf("%8.41f+%8.4lf i\n",realpart,&imagpart); 按 42 printf("%8.41f-%8.4lf i\n",realpart,imagpart); 43 44 return 0; 45 编译日志 调试 搜索结果 已选择 0 总行数:45 长度:1199 插入 已修改 23456789-
时间: 2025-05-20 10:37:26 浏览: 10
### C语言求解二次方程程序中的错误分析
在C语言中编写用于求解二次方程 \( ax^2 + bx + c = 0 \) 的程序时,通常会遇到一些常见的逻辑或语法错误。以下是关于如何正确实现该功能以及可能存在的问题。
#### 错误分析
1. **判别式的计算**
判别式 \( D = b*b - 4*a*c \)[^1] 是决定实根还是复根的关键部分。如果未正确处理此表达式,则可能导致不正确的结果。
2. **分支条件判断不足**
如果没有充分考虑三种情况(\( D > 0, D = 0, D < 0 \)),则可能会遗漏某些类型的解或者导致运行时错误。
3. **浮点数精度问题**
当涉及浮点运算时,由于计算机存储方式的原因,可能存在微小误差影响最终结果准确性[^2]。
4. **输入验证缺失**
用户输入系数a,b,c前应确认其有效性(比如防止除零操作),否则容易引发异常终止等问题。
#### 正确代码示例
下面给出一段经过改进后的C语言源码来解决这些问题:
```c
#include <stdio.h>
#include <math.h>
int main() {
double a, b, c;
printf("Enter coefficients a, b and c: ");
scanf("%lf %lf %lf", &a, &b, &c);
if (fabs(a) < 1e-9){
printf("Not quadratic equation.\n");
return 1; // Not a valid quadratic eq.
}
double discriminant = b * b - 4 * a * c;
if(discriminant >= 0){
double sqrt_val = sqrt((double)(discriminant));
double root1 = (-b + sqrt_val)/(2*a);
double root2 = (-b - sqrt_val)/(2*a);
if(root1 == root2)
printf("Root is %.2f\n",root1); /* One real root */
else{
printf("First Root Is :%.2f\nSecond Root Is :%.2f\n",root1 , root2 );/* Two distinct roots*/
}
}else{ /* Complex Roots Case */
double realPart = -b/(2*a);
double imaginaryPart =sqrt(-discriminant)/(2*a);
printf("Complex Roots Are:\n%+.2f+i*%.2f\nand\n%+.2f-i*%.2f\n",
realPart,imaginaryPart,
realPart,-imaginaryPart );
}
return 0;
}
```
#### 关键点解释
- 使用 `fabs()` 函数检测系数`a`接近于零的情况,避免非法除法操作。
- 对不同范围内的判别值分别进行了适当处理,并采用了标准库函数如`sqr`t来进行平方根提取。
- 针对虚部非负情形下的输出格式做了调整以便更直观显示复数形式的结果。
阅读全文
相关推荐

















