本項目實現一個數學練習系統:用戶指定運算符上限,系統隨機生成含整數、真分數、括號的四則運算表達式,用戶作答後自動判分統計。
| 模塊 | 職責 | 核心類 |
|---|---|---|
| 表達式生成 | 遞歸構建中綴表達式,控制運算符數量與嵌套深度 | GenerateFormula |
| 中綴轉後綴 | Shunting-yard 算法處理運算符優先級與括號 | MidToPosT |
| 後綴表達式求值 | 棧式計算,支持分數精確運算 | Calculation, FractionCalculation |
| 分數數據模型 | 分子/分母存儲,自動約分、符號標準化 | Fraction |
| 交互控制 | 用戶輸入、答案比對、統計記分 | Test |
public static String fourRan(int pre) {
n++; if (n >= nMax) return operand(); // 終止條件
switch(random(6)) {
case 1: return fourRan(1) + "+" + fourRan(1);
case 5: return "(" + fourRan(5) + ")"; // 括號節點
case 6: return randomOperand(); // 數字/分數葉子節點
}
}
// 運算符優先級定義
static int Precedence(char op) {
switch(op) { case '+': case '-': return 1; case '*': case '/': return 2; default: return 0; }
}
// 核心轉換邏輯
while (token != '#') {
if (operand) outputQueue.add(token);
else if (operator) { while (precedence(stack.top) >= precedence(token)) outputQueue.add(stack.pop()); stack.push(token); }
else if ('(') stack.push(token);
else if (')') { while (stack.top != '(') outputQueue.add(stack.pop()); stack.pop(); }
}
public Fraction fraccalculate(Fraction a, char op, Fraction b) {
int num, den;
switch(op) {
case '+': num = a.num*b.den + a.den*b.num; den = a.den*b.den; break;
case '-': num = a.num*b.den - a.den*b.num; den = a.den*b.den; break;
case '*': num = a.num*b.num; den = a.den*b.den; break;
case '/': num = a.num*b.den; den = a.den*b.num; break;
}
return simplify(new Fraction(num, den)); // 遞歸求最大公約數約分
}
2'3/4 → 11/4-1'2/3 正確轉換

這個「小而全」的項目完美展示了編譯原理基礎知識在工程落地中的轉化價值。