MathExam V2.0

# 隔壁村小學的小朋友都羨慕哭了2.0版

1、預估與實際

PSP2.1 Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘)
Planning 計劃 15 20
• Estimate • 估計這個任務須要多少時間 800 1000
Development 開發 600 600
• Analysis • 需求分析 (包括學習新技術) 30 60
• Design Spec • 生成設計文檔 20 30
• Design Review • 設計複審 10 30
• Coding Standard • 代碼規範 (爲目前的開發制定合適的規範) 10 10
• Design • 具體設計 30 40
• Coding • 具體編碼 400 500
• Code Review • 代碼複審 20 15
• Test • 測試(自我測試,修改代碼,提交修改) 60 45
Reporting 報告 60 60
• Test Repor • 測試報告 30 30
• Size Measurement • 計算工做量 20 15
• Postmortem & Process Improvement Plan • 過後總結, 並提出過程改進計劃 20 30
合計 1000

2、需求分析

我經過網上查閱和詢問擔任擔任小學老師的姑姑瞭解到,小學三年級數學四則混合運算有以下的幾個特色:數組

  • 會1000之內加減乘除法(經過查閱教材發現:要求掌握兩位數乘除兩位數)
  • 運算符在2~4個
  • 能夠加括號
  • 減法運算的結果不能有負數
  • 除法運算除數不能爲0,不能有餘數

3、設計

1. 設計思路

說明你如何設計這個程序函數

  • 首先,我先分析了三年級題目的難度,確認了生成隨機兩位數的大小
  • 而後思考如何生成無括號的四則運算
  • 最後將括號加入,計算

2. 實現方案

寫出具體實現的步驟學習

  • 分析了三年級題目的難度,確認了生成隨機數的大小
  • 而後思考如何生成無括號的四則運算

4、編碼

  • 首先我要解決的問題是,如何運算無括號的四則運算式
  • 我一樣只用優先級的方法,寫出Operation函數,先將* / 這種優先級較高的運算符運算,而後將運算過的符號與數值變爲null,而後調用去除null的函數,將null移動至數組最後一位
  • 而後剩下的只有加減法,依次運算既可得出結果
  • 而後咱們須要考慮括號因素,我打算先隨機出括號的位置,與括號中的符號的數量,而後將括號內的數值與符號存入另外一個數組,而後通過Operation函數運算,得出answer,而後將這些運算過的數值符號賦值null,調用removenull函數去除null
  • 而後我將已經去除括號的運算式再次使用Operation函數運算出結果

1. 調試日誌

  • 在數組中存入數據,調用時發生越界,空指針

2. 關鍵代碼

public static double Operation(String[] OpeMarkStrNumber, String[] OpeNumber) {          //首先遍歷一遍存儲運算符的數組,尋找到* /這種優先級較高的運算符,運算出結果,而後將運算過的符號與數值改成null,而後使用去除null的函數,去掉null數據
    while(true) {
        int PMAmount = 0;
        for(int i = 0; i < OpeMarkStrNumber.length-1; i++) {
            
            if(OpeMarkStrNumber[i] == "*") {
                
                double ans = Double.parseDouble(OpeNumber[i]) * Double.parseDouble(OpeNumber[i+1]);
                
                OpeNumber[i] = String.valueOf(ans);
                OpeNumber[i+1] = null;
                OpeMarkStrNumber[i] = null;
                OpeNumber = RemoveNull(OpeNumber);
                OpeMarkStrNumber = RemoveNull(OpeMarkStrNumber);
                
                PMAmount++;
                break;
                
            }else if(OpeMarkStrNumber[i] == "/") {
                
                double ans = Double.parseDouble(OpeNumber[i]) / Double.parseDouble(OpeNumber[i+1]);
                OpeNumber[i] = String.valueOf(ans);
                OpeNumber[i+1] = null;
                OpeMarkStrNumber[i] = null;
                OpeNumber = RemoveNull(OpeNumber);
                OpeMarkStrNumber = RemoveNull(OpeMarkStrNumber);
                PMAmount++;
                break;
            }
        }
        
        if(PMAmount == 0) {
            break;
        }
    }
    return PlusMinus(OpeMarkStrNumber, OpeNumber);
}

public static double PlusMinus(String[] OpeMarkStrNumber, String[] OpeNumber) {       //當乘除法被消除完以後,能夠依次運算加減法,最終得出結果

    int PMmarkNo = 0;
    double ans = Double.parseDouble(OpeNumber[0]) ;
    while(true) {
        if(OpeMarkStrNumber[PMmarkNo] == "+") {
            ans = ans + Double.parseDouble(OpeNumber[PMmarkNo+1]);
            PMmarkNo++;
        }else if(OpeMarkStrNumber[PMmarkNo] == "-"){
            ans = ans - Double.parseDouble(OpeNumber[PMmarkNo+1]);
            PMmarkNo++;
        }else if(OpeMarkStrNumber[PMmarkNo] == null){
            return ans;
        }
    }
}


public static String[] RemoveNull(String[] target) {     //去除null 函數,將數組中的null移動至數組後面
    for(int i = 0; i < target.length; i++) {
        if(target[i] == null) {
            for(int j = i; j < target.length; j++) {
                if(j != target.length-1) {
                    target[j] = target[j+1];
                }else {
                    target[j] = null;
                }
            }
        }
    }
    return target;
}

```測試

3. 代碼規範

請給出本次實驗使用的代碼規範:編碼

  • 第一條:不容許任何未經預先定義的常量直接出如今代碼中。
  • 第二條:大括號的使用約定。若是是大括號內爲空,則簡介地寫成{}便可,不須要換行;若是是非空代碼塊則:左大括號前不換行。左大括號後換行。右大括號前換行。右大括號後還有 else 等代碼則不換行;表示終止的右大括號後必須換行。
  • 第三條:左小括號和字符之間不出現空格;一樣的,有小括號和字符之間也不出現空格。
  • 第四條:在 if/else/for/while/do 語句中必須使用大括號。
  • 第五條:任何二目、三木運算符的左右兩邊都須要加一個空格。
  • 第六條:單行字符數限制不超過120個,超出須要換行,換行時遵循以下原則:第二行相對第一行縮進 4 個空格,從第三行開始,再也不繼續縮進,參考示例。運算符與下文一塊兒換行。方法調用的點符號與下文一塊兒換行。方法調用時,多個參數,須要換行時,在逗號後進行。

並人工檢查代碼是否符合規範設計

5、測試

  • 輸入5 3指針

  • 輸出
  • (1)10*(17-7)=
  • (2)18*9/3=
  • (3)16*3-2-10=
  • (4)20/(16-15)=
  • (5)20-16-18/9=
  • ------------------標準答案------------------
  • (1)10*(17-7)=100.0
  • (2)18*9/3=54.0
  • (3)16*3-2-10=36.0
  • (4)20/(16-15)=20.0
  • (5)20-16-18/9=2.0調試

    6、總結

  • 從剛看到題目時的不知所措,第一想法就是「我不會」,可是又想到這是一次結對做業,正所謂三個臭皮匠勝過諸葛亮,兩個「臭皮匠"來解決這個三年級四則運算應該也綽綽有餘了吧,經過相互間的討論,解決了一些數組的越界,以及空指針的錯誤,節約了一些修改BUG的時間,對於不會的東西勤百度,這是解決問題的途徑之一。日誌

相關文章
相關標籤/搜索