Java結對編程四則運算第二周總結
需求分析
- 要隨機產生規定數量的式子。
- 要對分式進行計算。
- 要支持多語言。
- 要自動判斷對錯。
設計思路
- 確定要選用的語言;
- 要產生隨機數;
- 在產生隨機數的時候就要產生隨機的運算符;
- 在產生數字與運算符時最后一個數字之后就不能再產生運算符(運算符的數量始終比數字少1);
- 在一個式子中要多次產生隨機數與運算符因此要用到循環;
- 在循環結束時就產生了一個式子就要求進行計算與輸入;
- 在產生中綴的式子后要將其轉化為后綴;
- 在輸入完之后就要判斷對錯,統計正確率;

實現過程中的關鍵代碼解釋
- 1.拆分式子
ArrayList<String> result = new ArrayList<String>();
StringTokenizer tokenizer = new StringTokenizer(str," ");
這段代碼是對上周代碼的改進,原先我用的是一個一字符的拆分的方法,這周因為要加入分數運算我發現他會把分數也當做除法進行拆分所以就不得不找到另一個方法對輸入的字符串進行拆分。StringTokenizer剛好就可以避免這個問題。
- 2.計算多個分數
public String calculate(ArrayList<String> postOrder)throws IOException {
Stack stack = new Stack();
//ArrayList<String> stack = postOrder;
String res = "";
FileWriter fm = new FileWriter("answer.txt");
BufferedWriter bufm = new BufferedWriter(fm);
for (int i = 0; i < postOrder.size(); i++) { if (res.equals("")) {
if (Character.isDigit(postOrder.get(i).charAt(0))) {
stack.push(Integer.parseInt(postOrder.get(i)));
} else {
Integer back = (Integer) stack.pop();
Integer front = (Integer) stack.pop();
stack.push(back);
Calculator calculator2 = new Calculator();
switch (postOrder.get(i).charAt(0)) {
case '+':
res = calculator2.compute(front + "/1", "+", back + "/1");
//res = (front + back);
bufm.write(res);
bufm.flush();
bufm.newLine();
break;
case '-':
res = calculator2.compute(front + "/1", "-", back + "/1");
bufm.write(res);
bufm.flush();
bufm.newLine();> break;
case '*':
res = calculator2.compute(front + "/1", "*", back + "/1");
bufm.write(res);
bufm.flush();
bufm.newLine();
break;
case '/':
res = calculator2.compute(front + "/1", "/", back + "/1");
bufm.write(res);
bufm.flush();
bufm.newLine();
break;
}
} }
else {
if (Character.isDigit(postOrder.get(i).charAt(0))) {
stack.push(Integer.parseInt(postOrder.get(i)));
} else {
Integer back = (Integer) stack.pop();
Calculator calculator2 = new Calculator();
switch (postOrder.get(i).charAt(0)) {
case '+':
res = calculator2.compute(res, "+", back + "/1");
bufm.write(res);
bufm.flush();
bufm.newLine();
break;
case '-':
res = calculator2.compute(res, "-", back + "/1");
bufm.write(res);> bufm.flush();
bufm.newLine();
break;
case '*':> res = calculator2.compute(res, "*", back + "/1");
bufm.write(res);
bufm.flush();
bufm.newLine();
break;
case '/':
res = calculator2.compute(res, "/", back + "/1");
bufm.write(res);
bufm.flush();
bufm.newLine();
break;
}
}
}
}
return res;
}
由於參考課本上的代碼只能進行兩個分數的計算所我就加了這么一個方法來進行多個這正數的運算
- 將答案寫入文件
switch (postOrder.get(i).charAt(0)) {
case '+':
res = calculator2.compute(res, "+", back + "/1");
bufm.write(res);
bufm.flush();
bufm.newLine();
break;
case '-':
res = calculator2.compute(res, "-", back + "/1");
bufm.write(res);
bufm.flush();
bufm.newLine();
break;
case '*':
res = calculator2.compute(res, "*", back + "/1");
bufm.write(res);
bufm.flush();
bufm.newLine();
break;
case '/':
res = calculator2.compute(res, "/", back + "/1");
bufm.write(res);
bufm.flush();
bufm.newLine();
break;
}
將計算的結果寫入文件有利於在判斷是將文件讀入。
運行過程截圖



測試



代碼托管地址
遇到的問題及其解決方法。
- 問題1 如何加入分數的運算。
解決:這是由於我前周寫代碼是考慮不周所帶來的問題本來一直沒找到解決的方法,后來在和結對伙伴和張旭生同學交流之后我就找到上面關鍵代碼中的第一個代碼,大大的優化了代碼的結構和運行的時間。 - 問題2(上周的問題) 如何解決無法產生括號的問題,就是當除不盡時的計算的誤差大?
這個問題再加入了分式運算之后就得到了解決。
— 對於答案的判斷
由於代碼的改動發現上周的方法已經不再適用無法直接返回答案,於是我就先將答案輸出到TXT文件中,在判斷的那個類時再讀入。就解決無法直接返回答案的這個問題。
對結對的小伙伴做出評價
- 結對伙伴: 20162312 張家鋮
這周編寫程序時幾乎都是在一起寫的,對彼此的寫代碼的方式有了進一步的了解,他的建議對我的幫助比較大。
由於結對伙伴用的是bash有很多方法有點銜接不上。
PSP
| PSP2.1 | Personal Software Process Stages | 預估耗時(小時) | 實際耗時(小時) |
|---|---|---|---|
| Planning | 計划 | 1 | 1 |
| · Estimate | · 估計這個任務需要多少時間 | 20 | 20 |
| · Analysis | · 需求分析 (包括學習新技術) | 1 | 3 |
| · Design Spec | · 生成設計文檔 | 0.5 | 0.5 |
| · Design Review | · 設計復審 (和同事審核設計文檔) | 0.5 | 0.5 |
| · Coding Standard | · 代碼規范 (為目前的開發制定合適的規范) | 1.5 | 1 |
| · Design | · 具體設計 | 2 | 2.5 |
| · Coding | · 具體編碼 | 2 | 3 |
| · Code Review | · 代碼復審 | 2 | 2 |
| · Test | · 測試(自我測試,修改代碼,提交修改) | 2 | 1 |
| Reporting | 報告 | 1 | 1.5 |
| · Test Report | · 測試報告 | 1.5 | 2 |
| · Size Measurement | · 計算工作量 | 1.5 | 1 |
| · Postmortem & Process Improvement Plan | · 事后總結, 並提出過程改進計划 | 1 | 1 |
