本項目實現一個功能完整的控制台計算器,支持:
核心設計採用雙鏈表架構:一個鏈表存儲運算符(含優先級),另一個存儲分數節點;主程序調用鏈表模塊與分數運算模塊協同工作。
// 運算符節點
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;
Convert())str2int()、GetSE() 解析分子分母)level,插入運算符鏈表oper_num[]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。約分採用輾轉相除法求最大公約數。
Compute())LEVEL_NUM-1) 遞減至 0oper_num[] 與鏈表長度| 文件 | 功能 |
|---|---|
sz.h/c | 主程序、詞法分析、計算調度 |
fract.h/c | 分數結構與四則運算實現 |
list.h/c | 通用鏈表操作(下一篇文章提供) |
附件提供完整源碼 sz.7z 及基於此核心的圖形界面版 calc.7z(借用對話框模版)。
long 可能溢出,可升級為大整數庫