首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言一元二次方程求根:scanf 格式、else 語法、浮點精度全修正

     編輯:C 語言問答

原代碼四大錯誤

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
float6-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。

一元二次求根是數值計算入門典例,暴露了輸入解析、分支語法、浮點數特性、數值穩定性等核心知識點,值得反覆打磨。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved