首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

現代軟件工程實戰:四則運算表達式隨機生成與計分系統設計

     編輯:Java 綜合教學

從需求到代碼:支持分數、括號、運算符優先級的表達式生成評測系統

本項目實現一個數學練習系統:用戶指定運算符上限,系統隨機生成含整數、真分數、括號的四則運算表達式,用戶作答後自動判分統計。

系統架構模塊劃分

模塊職責核心類
表達式生成遞歸構建中綴表達式,控制運算符數量與嵌套深度GenerateFormula
中綴轉後綴Shunting-yard 算法處理運算符優先級與括號MidToPosT
後綴表達式求值棧式計算,支持分數精確運算Calculation, FractionCalculation
分數數據模型分子/分母存儲,自動約分、符號標準化Fraction
交互控制用戶輸入、答案比對、統計記分Test

核心算法亮點

1. 表達式隨機生成(遞歸+機率控制)

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(); // 數字/分數葉子節點
    }
}

2. 中綴轉後綴(Dijkstra Shunting-yard)

// 運算符優先級定義
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(); }
}

3. 分數精確運算(最大公約數約分)

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)); // 遞歸求最大公約數約分
}

4. 用戶答案智能解析與比對

  • 支持帶分數格式:2'3/4 → 11/4
  • 負分數處理:-1'2/3 正確轉換
  • 結果標準化:分母為 1 輸出整數,負號統一歸屬分子

項目結構與運行截圖

運行界面 項目結構

工程化啟示

  • 領域建模:Fraction 封裝有理數運算細節,上層業務零感知
  • 算法分層:生成、解析、計算三階段解耦,各自可獨立測試替換
  • 邊界處理:除零檢查、分數約分、括號匹配、輸入容錯
  • 擴展性:新增運算符只需擴展優先級表與計算邏輯

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

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