博客代碼地址:https://gitee.com/llQ13/four_operations/tree/master/SZYSExp_1 一、題目描述: 實踐能力的提高當然就是得多動手了,那麼就從第一個個人項目開始吧,用一周的時間完成一個基於控制台的四則運算程式,實現一個自動生成小學四則運算題目的命 ...
二、.需求分析,即使老師已經給出了題目,也要對題目的需求做分析,需求分析可以是自己的思考分析,也可以是找小學老師,學生甚至家長調查後挖掘出更細緻的需求,別小看這個過程,請真實的做這個過程。
該程式能控制需要生成多少的題跟控制操作數的生成,能在可接受範圍內生成10000道題。結果應該能接受真分數。然後,能將生成的題目與答案分別加入到相應的文件中。對於題目,能根據一定的規則進行查重。最後能進行作答併進行判錯給出相應的信息。
三、.功能設計
- 基本功能 能生成表達式,並計算出答案
擴展功能
高級功能
四、 設計實現,設計包括代碼如何組織,你會有哪些Java類,這些類分別負責什麼功能,他們之間的關係怎樣?你會設計哪些重要的函數,關鍵的函數是否需要畫出流程圖?
1、有題目subject類:生成題目的類
2、evaluateExpression類:對錶達式求解類
五、.代碼說明,你一定花了最多時間在代碼的編寫與調試上,那麼,這個環節請把你的重要代碼展示出來,代碼的排版請做好。
表達式的生成:
將符號放在數組裡面,隨機生成數來決定生成的符號。
在用隨機數來決定表達式的長度。
若生成一個左括弧就將相應右括弧生成的位置存進數組裡面,
當迴圈時,若之前有左括弧,就應該判斷當前迴圈是否是右括弧應生成的位置,進行相應的判斷。生成表達式。
若不是隨機到左括弧,則按照生成一個隨機數加一個運算符。
表達式的解答:
將中綴表達式轉換成尾碼表達式,然後進行計算。這是參考網上的一個演算法,通過棧實現。
String eHead = "" + (i + 1) + ". ";
String e ="";
int exlength = (int) (Math.random() * 4 + 2);// 表達式的長度
int lbracket = 0;
int rbracket = 0;
int[] whe = new int[exlength]; // 存放右括弧出現的地方
for (int j = 0; j < exlength; j++) {
char s = symbol[(int) (Math.random() * 5)];
// System.out.print(s+"| ");
if (j == exlength - 1 && s == '(') { // 如果最後一次是左括弧則表達式不再增加
int count1 = lbracket;
if (lbracket == 0) {
e += "" + (int) (Math.random() * range) + "";
} else {
e += "" + (int) (Math.random() * range) + "";
for (int q = 0; q < count1; q++) {
e += ")";
lbracket--;
}
}
e += "=";
continue;
}
if (lbracket == 0) { // 之前沒有左括弧
if (s == '(') {
e = e + "" + s + "" + (int) (Math.random() * range)
+ "" + symbol[(int) (Math.random() * 4)] + "";
whe[rbracket] = (int) (Math.random()
* (exlength - j - 1) + j + 1);
// System.out.print("|" + whe[rbracket] + "| ");
lbracket++;
rbracket++;
} else {
e = e + "" + (int) (Math.random() * range) + "" + s
+ "";
}
} else if (s != '(') {// 之前有左括弧
int count2 = lbracket;
int count_match = 0;// 匹配到左括弧的次數
for (int l = 0; l < count2; l++) {
if (whe[(rbracket-count2) + l ] == j) {
if (count_match == 0) {
e = e + "" + (int) (Math.random() * range)
+ ")";
count_match++;
lbracket--;
} else {
e += ')';
lbracket--;
}
}
}
if (count_match == 0) {
e = e + "" + (int) (Math.random() * range) + "" + s
+ "";
} else {
e += "" + s + "";
}
}
六、.測試運行
-
PSP2.1 Personal Software Process Stages Time Senior Student Time Planning 計劃 8 6 · Estimate 估計這個任務需要多少時間 8 6 Development 開發 82 100 · Analysis 需求分析 (包括學習新技術) 6 10 · Design Spec 生成設計文檔 5 6 · Design Review 設計覆審 4 6 · Coding Standard 代碼規範 3 3 · Design 具體設計 10 20 · Coding 具體編碼 36 21 · Code Review 代碼覆審 7 9 · Test 測試(自我測試,修改代碼,提交修改) 13 21 Reporting 報告 9 6 · 測試報告 3 2 · 計算工作量 2 1 · 並提出過程改進計劃 3 3