201571030107/201571030121《小學四則運算練習軟件》結對項目
項目合作伙伴:馬思遠201571030121
項目Github地址
項目線上演示地址
1、需求分析
- 由計算機從題庫文件中隨機選擇20道加減乘除混合算式,用戶輸入算式答案,程序檢查答案是否正確,每道題正確計5分,錯誤不計分,20道題測試結束后給出測試總分。
- 程序為用戶提供四則運算練習功能:百以內整數算式+帶括號算式。
- 程序允許用戶進行多輪測試,提供用戶多輪測試分數柱狀圖,示例如下:
- 程序記錄用戶答題結果,當程序退出再啟動的時候,可為用戶顯示24小時內參與測試的成績統計。
- 測試有計時功能,測試時動態顯示用戶開始答題后的消耗時間。
- 該程序為Web端程序,可供用戶在線使用。
2、軟件設計
3、核心代碼
- 將算術表達式(中綴表達式)轉換為后綴表達式:
eg. 89-(44/(56*33)) 中綴表達式轉換為后綴表達式
后綴表達式:89 44 56 33 * / -,元素之間用空格隔開。
從左到右遍歷中綴表達式的每一個數字和運算符
如果是數字就輸出(即存入后綴表達式)
如果是右括號,則彈出左括號之前的運算符
如果優先級低於棧頂運算符,則彈出棧頂運算符加入后綴表達式,並將當前運算符加入后綴表達式
遍歷結束后,將棧則剩余運算符彈出。
public static String prefixToSuffix(String express) throws Exception {
String[] expression = express.split(",");
StringBuffer suffixStr = new StringBuffer();
String temp = "";
try {
for (int i = 0; i < expression.length; i++) {
if (SuffixToValueUtil.isNum(expression[i])) {
suffixStr.append(expression[i]).append(" ");
} else if (expression[i].equals(")")) {
temp = stack.pop();
while (!temp.equals("(")) {
suffixStr.append(temp).append(" ");
temp = stack.pop();
}
} else if (expression[i].equals("(") ||
priority.get(expression[i]) >= priority.get(getTopOperator())) {
stack.push(expression[i]);
} else {
temp = stack.pop();
suffixStr.append(temp).append(" ").append(expression[i]).append(" ");
}
}
} catch (Exception e) {
throw e;
}
while (stack.size() > 0) {
suffixStr.append(stack.pop());
}
return suffixStr.toString();
}
- 根據中綴表達式計算結果
eg. 根據后綴表達式:89 44 56 33 * / - 計算結果。
從左到右遍歷后綴表達式
遇到數字就進棧
遇到符號,就將棧頂的兩個數字出棧運算,運算結果進棧,直到獲得最終結果。
public static int compute(String expression) throws Exception {
int numOne, numTwo;
String temp = "";
String[] express = expression.split(" ");
Stack<String> stack = new Stack<>();
for (int i = 0; i < express.length; i++){
if (isNum(express[i])){
stack.push(express[i]);
}
else
{
numTwo = Integer.parseInt(stack.pop());
numOne = Integer.parseInt(stack.pop());
temp = CalculateUtil.compute(numOne, numTwo, express[i]).toString();
if (Integer.parseInt(temp) < 0){
throw new Exception("Negative numbers in operation");
}
stack.push(temp);
}
}
return Integer.parseInt(stack.pop());
}
4、程序運行
5、結對編程
6、PSP
PSP2.1 | 任務內容 | 計划完成的時間(min) | 實際完成需要的時間(min) |
---|---|---|---|
PLanning | 計划 | 40 | 40 |
Estimate | 估計這個任務需要多少時間,並規划大致工作步驟 | 40 | 40 |
Developmet | 開發 | 162 | 180 |
Analysis | 需求分析(包括學習新技術) | 12 | 22 |
Design Spec | 生成設計文檔 | 5 | 3 |
Design Revie | 設計復審(和同事審核設計文檔) | 3 | 3 |
Coding Standard | 代碼規范 | 2 | 2 |
Design | 具體設計 | 45 | 50 |
Coding | 具體編碼 | 75 | 70 |
Code Review | 代碼復審 | 5 | 5 |
Test | 測試(自我測試,修改代碼,提交修改) | 15 | 25 |
Reporting | 報告 | 30 | 40 |
Test Report | 測試報告 | 20 | 30 |
Size Measurement | 計算工作量 | 3 | 3 |
Postmortem & Process Improvement Plan | 事后總結,並提出過程改機計划 | 7 | 7 |
7、使用漢堡評價法給小伙伴的一些點評
在本次項目中,我的小伙伴是馬思遠同學,這個項目相比於上一個項目來說主要增加了對圖形用戶界面的要求。剛開始思遠同學建議我們采用Java的圖形界面庫來做軟件的界面。而我又覺得那個界面有點土,我認為web界面效果會比較好。所以這里我們倆兒就起了沖突。在我向他詳細介紹了采用web界面的優勢后,小馬同意了我的建議,在兩人合作編程中,兩個人有意見上的沖突,通過多交流沖突就會迎刃而解。本次項目感謝思遠同學和我的默契合作。
8、結對編程的感受
首先,本次項目的規模相比於上一次大了不少。所以結隊編程的好處也就是提高了編碼和效率,減輕了工作量。其次兩個人不一樣的編碼方式,思維方式和語言溝通都不相同,通過項目的磨合,增加了我們在將來實際項目中的協作能力和工作經驗。