scanf("%f,%f,%f", &a, &b, &c); // ① 格式串含逗號,需輸入逗號分隔
else (d < 0) // ② else 後不能跟條件
pritnf("x1=%f,x2=%f", x1, x2); // ③ 拼寫錯誤:pritnf
float a,b,c,... // ④ float 精度不足,大係數易溢出/精度損失
#include <stdio.h>
#include <math.h>
int main(void) {
double a, b, c, d, x1, x2, x; // 用 double 提高精度
printf("請輸入一元二次方程係數 a b c (空格分隔): ");
if (scanf("%lf %lf %lf", &a, &b, &c) != 3) { // %lf 讀 double
fprintf(stderr, "輸入格式錯誤\n");
return 1;
}
if (a == 0) { // 退化為一元一次
if (b == 0) puts("非方程");
else printf("x = %f\n", -c/b);
return 0;
}
d = b*b - 4*a*c;
if (d > 0) {
x1 = (-b + sqrt(d)) / (2*a);
x2 = (-b - sqrt(d)) / (2*a);
printf("兩個不等實根: x1 = %.4f, x2 = %.4f\n", x1, x2);
} else if (d == 0) {
x = -b / (2*a);
printf("兩個相等實根: x = %.4f\n", x);
} else { // else 後無條件
printf("無實根 (判別式 Δ = %.4f < 0)\n", d);
}
return 0;
}
| 原代碼 | 問題 | 修正 |
|---|---|---|
scanf("%f,%f,%f",...) | 要求輸入 1,2,3 含逗號 | scanf("%lf %lf %lf",...) 空格/換行分隔 |
else (d<0) | 語法錯誤,else 不接受條件 | 改為 else 或 else if (d<0) |
pritnf | 標識符未聲明 | printf |
float | 6-7 位有效數字,大數精度差 | double 15-16 位,科學計算首選 |
d == 0 不可靠,建議 fabs(d) < 1e-9 視為零。b² ≫ 4ac 時,-b ± sqrt(d) 發生災難性抵消。穩定公式:
q = -0.5 * (b + copysign(sqrt(d), b)); x1 = q / a; x2 = c / q;
<complex.h> (C99) 使用 complex double。一元二次求根是數值計算入門典例,暴露了輸入解析、分支語法、浮點數特性、數值穩定性等核心知識點,值得反覆打磨。