1. 程式人生 > >小學生最愛的計算題生成器

小學生最愛的計算題生成器

過大 stand 自我 int 減法 字符 測試結果 ++ 一段

最可愛的標題

一、預估與實際

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

二、需求分析

我通過查詢教學大綱及研究相關試卷的方式了解到,小學一年級及二年級數學有如下的幾個特點:

  • 特點1
    • 加法的和應該小於等於100
  • 特點2
    • 減法的差應該大於0
  • 特點3
    • 無論是加法還是減法,兩側數都不應該超過100
  • 特點4
    • 乘法只在99乘法表範圍內
  • 特點5
    • 被除數要大於0小於100
  • 特點6
    • 除數應該是個位數

經過分析,我認為,這個程序應當:

  • 使用的數字小於100
  • 要保證加法時的不超過100
  • 要保證減法時的差不為負數
  • 乘法時左右兩邊都應該是個位數
  • 除法時要保證被除數大於除數
  • 被除數及除數不能為0
  • 除數及商需要為個數

三、設計

1. 設計思路

  • 這個程序有一個類,3個函數
    • 主函數負責判斷傳入參數是否合法並將合法參數傳給math函數生成題目
    • check函數負責生成相應隨機數並判斷是否合適
    • math函數負責調用check函數獲取合適的數值及符號最後寫入文件
  • 算法的關鍵的關鍵是什麽?
    • 生成合適的隨機數
    • 各函數之間的功能聯系
    • 出錯後的提示,並且讓程序順利結束

2. 實現方案

  • 準備工作:先在Github上創建倉庫,克隆到本地
  • 技術關鍵點:梳理一下設計思路,可能遇到哪些技術關鍵點
    • 隨機數的使用,本程序需要大量的使用Math.random()方法
    • 全局靜態變量的使用,本程序需要多個靜態函數共享數據
    • ArrayList數組的使用,用該數組存儲題目及答案的字符串,相比普通數組,該數組可以動態增加空間

四、編碼

1. 調試日誌

  • 在代碼的什麽位置,代碼出現了什麽問題,問題會導致什麽結果,怎麽解決的
    • 在主函數中判斷參數時我直接將String類型的參數通過Integer.parseInt()方法轉換成數值,當參數為非數值時程序則會出錯。處理方法:用一個函數判斷輸入參數是否為數字字符串,最後再將字符串參數轉為int型數值

    • 在主函數中,將字符串轉為int型數值時,若傳入參數數值超過int型數值範圍則程序出錯。處理方法:考慮到實際情況,用戶需要的題目數量本就不需要太多,則可以直接限制出題數量,在判斷完傳入的參數字符串是數字串後直接限制字符串的長度不超過4,則可以保證數值不大於9999。

2. 關鍵代碼

請展示一段程序的關鍵代碼,並解釋代碼的作用

public static boolean checkOne() {
        a = (int) (0 + Math.random() * (100 - 0 + 1));
        b = (int) (0 + Math.random() * (100 - 0 + 1));
        // sym為1即為正,2即為負
        sym = (int) (1 + Math.random() * (2 - 1 + 1));
        if (sym == 1) {
            if ((a + b) > 100) {
                return false;
            } else {
                return true;
            }
        } else {
            if ((a - b) < 0) {
                return false;
            } else {
                return true;
            }
        }
    }
public static void mathOne(int n) {
        String prob;
        String ans;
        ArrayList<String> probs = new ArrayList<String>();
        ArrayList<String> anss = new ArrayList<String>();
        boolean end = false;
        for (int i = 1; i <= n; i++) {
            do {
                end = checkOne();
            } while (!end);
            // sym為1即為正,2即為負
            if (sym == 1) {
                prob = "(" + i + ")" + " " + a + " " + "+" + " " + b;
                ans = "(" + i + ")" + " " + a + " " + "+" + " " + b + " " + "=" + " " + (a + b);
            } else {
                prob = "(" + i + ")" + " " + a + " " + "-" + " " + b;
                ans = "(" + i + ")" + " " + a + " " + "-" + " " + b + " " + "=" + " " + (a - b);
            }
            probs.add(prob);
            anss.add(ans);
        }
    }
  • 該段代碼有兩個方法,math方法調用check方法用來生成符號及符號兩邊的數,並且判斷生成的數是否合適,合適的時候該函數才會返回真,此時math才能繼續執行,將問題及答案存入ArrayList數組。

3. 代碼規範

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

  • 第一條、代碼中的命名嚴禁使用拼音與英文混合的方式,更不允許直接使用中文的方式。
  • 第二條、類名使用UpperCamelCase風格
  • 第三條、方法名、參數名、成員變量、局部變量都統一使用 lowerCamelCase 風格,必須遵循駝峰形式。
  • 第四條、方法名、參數名、成員變量、局部變量都統一使用 lowerCamelCase 風格,必須遵循駝峰形式。

五、測試

請思考並記錄你認為必要的測試點,並記錄測試用例與測試結果

測試項目 測試語句 預期結果 測試結果
不輸入任何參數 java MathExam4269 輸入的參數個數不為2,請重試 輸入的參數個數不為2,請重試
輸入一個參數 java MathExam4269 20 輸入的參數個數不為2,請重試 輸入的參數個數不為2,請重試
輸入二個參數 java MathExam4269 20 1 成功寫入20道一年級題目到文件out.txt 成功寫入20道一年級題目到文件out.txt
輸入二個參數且第一個參數小於0 java MathExam4269 -10 1 輸入有誤,請重新輸入 輸入有誤,請重新輸入
輸入二個參數且第一個參數大於9999 java MathExam4269 10000 1 輸入題數過大,請重試 輸入題數過大,請重試
輸入二個參數且第二個參數不為1和2 java MathExam4269 20 5 輸入的年級有誤,請重試 輸入的年級有誤,請重試

六、總結

  • 開始時應該花更多時間分析需求,設計程序架構,能為後續的開發提高很多效率

  • 要考慮到後續可能的升級,把需要的功能拆分成函數,專門的功能由專門的函數處理

  • 重復的代碼太多,需要進一步優化

  • 調試程序時要考慮到盡可能多的情況

小學生最愛的計算題生成器