課程作業:實現自動生成小學加減乘除題目,後續擴展為 Web/App。技術棧:Java 8、IntelliJ IDEA、Maven、Spring MVC + Bootstrap(Web 版)。代碼託管:GitHub,演示地址:在線演示。
n 個運算符 → n+1 個操作數。+-、*/、+-*/。// 操作數生成
String generateNumber(boolean hasFraction, int min, int max) {
if (!hasFraction) {
int num = min + random.nextInt(max - min + 1);
return (num == 0) ? generateNumber(...) : String.valueOf(num); // 避免 0
}
// 分數:分母≠0,1;分子≠0;分子≠分母(避免 1)
int num, den;
do {
num = min + random.nextInt(max - min + 1);
den = min + random.nextInt(max - min + 1);
} while (num == 0 || den <= 1 || num == den);
return num + "/" + den;
}
// 運算符生成
String generateOperator(int mode) { // 0:+- 1:*/* 2:+-*/
int r = random.nextInt(mode == 2 ? 4 : 2);
return new String[]{"+", "-", "*", "/"}[r];
}
ScriptEngine (JavaScript) 直接 eval() 字符串,簡潔高效。1/5+2/3 會按整數除法算出 0)。需實現分數四則運算:
lcm = a*b/gcd(a,b)。gcd(輾轉相除法/遞歸)。public class Fraction {
static int numera, denomi; // 靜態字段暫存結果
// 最大公約數(輾轉相除法)
static int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
// 最小公倍數
static int lcm(int a, int b) { return a / gcd(a, b) * b; }
void add(int n1, int d1, int n2, int d2) {
int l = lcm(d1, d2);
numera = n1 * (l/d1) + n2 * (l/d2);
denomi = l; simplify();
}
void sub(int n1, int d1, int n2, int d2) { /* 類似,減法 */ }
void mul(int n1, int d1, int n2, int d2) {
numera = n1 * n2; denomi = d1 * d2; simplify();
}
void div(int n1, int d1, int n2, int d2) {
numera = n1 * d2; denomi = d1 * n2; simplify();
}
void simplify() { int g = gcd(numera, denomi); numera /= g; denomi /= g; }
}
AutoFormulagenerate(mode, hasFraction, opCount, min, max):組裝表達式字符串,調用計算引擎得出結果。splitFraction(str):解析 "3/4" 或 "5" 為分子分母(整數視為分母=分子)。| 選項 | 評價 | 決策 |
|---|---|---|
| Python | 語法極簡,但弱類型不利大型團隊協作與長期維護 | ❌ |
| PHP | 僅限 Web,難以遷移 Android/桌面端 | ❌ |
| .NET | 綁定 Windows 生態,Linux 部署受限 | ❌ |
| Java + Spring MVC | 強類型、成熟生態、跨平台、團隊協作友好、可平滑擴展微服務 | ✅ |
IDE 選 IntelliJ IDEA:代碼提示無敵(含 CSS/JS/HTML5)、原生 Maven/Gradle、重構神器、開箱即用。
響應式佈局、卡片式題目展示、AJAX 獲取題目/驗證答案、簡單清爽 UI。截圖見演示地址。
從 Hello World 到幾百行系統,一個月的積累換來工程直覺。代碼寫十遍記不住,再寫十遍。堅持,比聰明更重要。—— 萬世想,天津大學計算機學院,2016.9.9