201571030107《小學四則運算練習軟件》結對項目


201571030107/201571030121《小學四則運算練習軟件》結對項目

項目合作伙伴:馬思遠201571030121

項目Github地址

Arithmetic-Webapp_SE

項目線上演示地址

Four arithmetic applets

1、需求分析

  • 由計算機從題庫文件中隨機選擇20道加減乘除混合算式,用戶輸入算式答案,程序檢查答案是否正確,每道題正確計5分,錯誤不計分,20道題測試結束后給出測試總分。
  • 程序為用戶提供四則運算練習功能:百以內整數算式+帶括號算式。
  • 程序允許用戶進行多輪測試,提供用戶多輪測試分數柱狀圖,示例如下:
  • 程序記錄用戶答題結果,當程序退出再啟動的時候,可為用戶顯示24小時內參與測試的成績統計。
  • 測試有計時功能,測試時動態顯示用戶開始答題后的消耗時間。
  • 該程序為Web端程序,可供用戶在線使用。

2、軟件設計

系統UML
圖片名稱

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、結對編程的感受

首先,本次項目的規模相比於上一次大了不少。所以結隊編程的好處也就是提高了編碼和效率,減輕了工作量。其次兩個人不一樣的編碼方式,思維方式和語言溝通都不相同,通過項目的磨合,增加了我們在將來實際項目中的協作能力和工作經驗。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM