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

支持括號與分數的四則運算計算器:C語言實現詳解

     編輯:關於C語言

項目概覽

本項目實現一個功能完整的控制台計算器,支持:

  • 四則運算(+、-、*、/)
  • 任意層級括號嵌套
  • 分數運算(真分數、假分數、帶分數互轉)
  • 運算符優先級自動處理

核心設計採用雙鏈表架構:一個鏈表存儲運算符(含優先級),另一個存儲分數節點;主程序調用鏈表模塊與分數運算模塊協同工作。

核心數據結構

// 運算符節點
typedef struct OpNode {
    char oper;      // 運算符 + - * /
    int level;      // 優先級:加減=0,乘除=1,每層括號+2
    struct OpNode *next;
} OpNode;

// 分數節點
typedef struct Fract {
    long numer;     // 分子
    long deno;      // 分母
    struct Fract *next;
} Fract;

// 算式打包結構
typedef struct Pack {
    OpNode *oper;           // 運算符鏈表頭
    Fract *num;             // 分數鏈表頭
    int oper_num[LEVEL_NUM]; // 各優先級運算符計數
} Pack;

關鍵算法流程

1. 詞法分析與構建鏈表 (Convert())

  • 掃描字符串,識別數字構建分數節點(調用 str2int()、GetSE() 解析分子分母)
  • 識別運算符,根據當前括號深度計算 level,插入運算符鏈表
  • 統計各優先級運算符個數到 oper_num[]

2. 分數四則運算 (fract.c)

// 通分加法示例
void Plus(Fract *a, Fract *b) {
    if (a->numer == 0) { *a = *b; return; }
    if (b->numer == 0) return;
    long lcm = common_multiple(a->deno, b->deno);
    a->numer = lcm/a->deno*a->numer + lcm/b->deno*b->numer;
    a->deno = lcm;
    reduce(&a->numer, &a->deno);  // 約分
}

同理實現 Minus、Multiply、Divide。約分採用輾轉相除法求最大公約數。

3. 優先級驅動計算 (Compute())

  • 從最高優先級 (LEVEL_NUM-1) 遞減至 0
  • 遍歷運算符鏈表,遇到當前級運算符,從數值鏈表取出兩個操作數計算,結果回填,刪除已用節點
  • 更新 oper_num[] 與鏈表長度

項目結構與擴展

文件功能
sz.h/c主程序、詞法分析、計算調度
fract.h/c分數結構與四則運算實現
list.h/c通用鏈表操作(下一篇文章提供)

附件提供完整源碼 sz.7z 及基於此核心的圖形界面版 calc.7z(借用對話框模版)。

已知局限與改進方向

  • 缺少算式合法性檢查函數(如括號匹配、除零預判)
  • 分子分母用 long 可能溢出,可升級為大整數庫
  • 未支持科學計數法、三角函數等高級特性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved