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

分數加減法:C語言初學者常見錯誤與代碼瑕疵分析

     編輯:關於C語言

典型錯誤代碼特徵

原文代碼片段極度混亂,提煉出初學者高頻錯誤模式:

1. 輸入解析錯誤

  • 使用 gets() 讀取整行,再手動解析 a/b+c/d 格式,極易越界、指針錯誤。
  • 正確做法:scanf("%d/%d%c%d/%d", &a, &b, &op, &c, &d) 直接按格式讀取,或用 fgets + sscanf 安全解析。

2. 最大公約數 (GCD) 實現缺陷

  • 遞歸/迭代邏輯錯誤,未處理負數、零值。
  • 標準庫替代:C++17 std::gcd(<numeric>),C 可用成熟的輾轉相除法實現。

3. 分子分母符號處理缺失

  • 結果分母為負時未統一移至分子(應保證分母 > 0)。
  • 約分後未處理整數部分(如 5/2 應輸出 2 1/2 或 2.5,視題目要求)。

4. 緩衝區與指針濫用

  • 大量裸指針運算、手動內存管理(new/malloc)卻無 delete/free,內存洩漏嚴重。
  • 字符數組越界訪問(如 a[i] = a[i]*a[j] - a[k]*a[l] 索引混亂)。

5. 輸出格式不符

  • 題目要求特定格式(如 a/b、integer、integer a/b),代碼直接 printf("%d/%d") 不分情況。

重構建議:分數類封裝

typedef struct {
    long long num;  // 分子
    long long den;  // 分母 (始終 > 0)
} Fraction;

long long gcd(long long a, long long b) {
    return b ? gcd(b, a % b) : (a > 0 ? a : -a);
}

Fraction normalize(Fraction f) {
    if (f.den < 0) { f.num = -f.num; f.den = -f.den; }
    long long g = gcd(f.num, f.den);
    f.num /= g; f.den /= g;
    return f;
}

Fraction add(Fraction a, Fraction b) {
    Fraction r = { a.num * b.den + b.num * a.den, a.den * b.den };
    return normalize(r);
}

// sub, mul, div 同理

核心原則

  1. 用結構體封裝領域概念,而非散落的變量。
  2. 輸入解析、業務邏輯、輸出格式化三層分離。
  3. 優先使用標準庫/成熟算法,勿重複造輪子。
  4. 邊界情況(零、負、溢出)逐一測試。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved