天天看點

20165230 結對程式設計項目-四則運算 階段總結

20165230 結對程式設計項目-四則運算 階段總結

一、需求分析

  • 随機生成題目
  1. 生成的題目個數從指令行輸入
  2. 使用者可選擇生成不同難度的題目,比如通過參數指定: (1) 運算符個數範圍 (2) 運算符限定(國小一年級題目隻生成 + - 題目)
  3. 能多次生成題目
  • 題目運算(判題)
  1. 支援多運算符
  2. 支援整數
  3. 支援真分數
  4. 轉換為字尾表達式(也可以直接計算中綴表達式)
  • 題目合法性判斷
  1. 可獨立使用
  2. 可用于測試生成題目的正确性
  • 擴充需求
  1. 題目去重
  2. 支援多語言
  3. 處理生成題目并輸出到檔案
  4. 完成題目後從檔案讀入并判題

二、設計思路

  1. 設計一個

    IntNumber

    類,用來實作整數的四則運算
  2. Fraction

    類,用來實作真分數的四則運算
  3. Judgement

    類,用來判斷使用者輸入與實際計算值是否相等,并統計正确的次數
  4. 設計主類,生成随機數,生成題目,并判斷正确率
  5. 設計測試類,測試整數類與分數類的四則運算
    20165230 結對程式設計項目-四則運算 階段總結

三、核心代碼及注釋

  • Calculate
import java.text.NumberFormat;
import java.util.*;
public class Calculate {
    public static void main(String[] args) {
        NumberFormat number = NumberFormat.getPercentInstance();
        Random ran = new Random();
        Scanner scan = new Scanner(System.in);
        while (true) {
            System.out.print("請輸入要生成的題目數量:");
            int A = scan.nextInt();
            for (int i = 0; i < A; i++) {
                int B = ran.nextInt(2);
                int C = ran.nextInt(4);
                IntNumber in1 = IntNumber.obj();
                IntNumber in2 = IntNumber.obj();
                Fraction score1 = Fraction.obj();
                Fraction score2 = Fraction.obj();
                if (B == 0) {//随機生成整數的計算題目
                    switch (C) {
                        case 0:
                            int num = in1.add(in2);
                            String num1 = "" + num;
                            int n = scan.nextInt();
                            Judgement.judge(n == num, num1);
                            break;
                        case 1:
                            num = in1.subtract(in2);
                            num1 = "" + num;
                            n = scan.nextInt();
                            Judgement.judge(n == num, num1);
                            break;
                        case 2:
                            num = in1.multiply(in2);
                            num1 = "" + num;
                            n = scan.nextInt();
                            Judgement.judge(n == num, num1);
                            break;
                        case 3:
                            num1 = in1.divide(score1);
                            String Q = scan.next();
                            Judgement.judge(Q.equals(num1), num1);
                            break;
                    }
                } else {//随機生成真分數的計算題目
                    switch (C) {
                        case 0:
                            Fraction num2 = score1.add(score2);
                            String num1 = num2.toString();
                            String s = scan.next();
                            Judgement.judge(s.equals(num1), num1);
                            break;
                        case 1:
                            num2 = score1.subtract(score2);
                            num1 = num2.toString();
                            s = scan.next();
                            Judgement.judge(s.equals(num1), num1);
                            break;
                        case 2:
                            num2 = score1.multiply(score2);
                            num1 = num2.toString();
                            s = scan.next();
                            Judgement.judge(s.equals(num1), num1);
                            break;
                        case 3:
                            num2 = score1.divide(score2);
                            num1 = num2.toString();
                            s = scan.next();
                            Judgement.judge(s.equals(num1), num1);
                            break;
                    }
                }
            }
            System.out.println("你答對的題目總數:" +  Judgement.getTrues());
            double T = (double) Judgement.getTrues() / A;//計算正确率
            System.out.println("正确率為:" + number.format(T));
            System.out.println("是否繼續生成題目?(y/n):"  );//多次生成題目,直到使用者選擇退出
            String s1 = scan.next();
            if (s1.equalsIgnoreCase("n")){
                break;
            }
        }
    }
}
           

四、測試方法

  • IntNumber類的方法測試
    20165230 結對程式設計項目-四則運算 階段總結
  • Fraction類的方法測試
    20165230 結對程式設計項目-四則運算 階段總結

五、運作過程截圖

20165230 結對程式設計項目-四則運算 階段總結
20165230 結對程式設計項目-四則運算 階段總結

六、代碼托管位址

  • 四則運算

七、遇到的困難及解決方法

  • 問題1:如何實作随機生成數和題目?
  • 解決方法:上星期學了第八章常用實用類中學習過Random類,通過反複思考如何将書上給出的方法運用于實際,最終運用了
Random random = new Random()
random.nextInt()
           

并結合switch語句,成功實作生成随機數和題目

  • 問題2:如何确定取值範圍
  • 解決方法:當把上一個問題解決後,便可解決這個問題,即讓随機數生成器random傳回一個0--n之間(包括0但不包括n)的随機數,調用帶參數的

    nextInt(int m)

    方法,即可傳回[0,m)之間的某個整數
  • 問題3:如何實作多次生成題目?
  • 解決方法:将主函數裡核心部分放入while(true)循環中,當使用者選擇"n"即結束循環,通過equalsIgnoreCase("n"),比較兩個字元串具有相同的字元,而不比較其大小即可

八、對結對的小夥伴的評價

  • 結對搭檔:20165226劉香杉
  • 最開始我們看完題目要求後,都是一頭霧水,不知道該從何下手,通過與劉香杉同學交流讨論,開始了我們的頭腦風暴,先建構出基本的架構,再寫出測試代碼,一步一步的完成,在程式設計的過程中遇到了許多問題,比如如何實作真分數的運算,如何實作生成随機題目等等,最終通過我們的協作,完成了本次程式設計,收益很大,也體會到了結對程式設計的好處,當一個人構思出現瓶頸的時候,通過二人交流和互相的提示,會很快又有新的解決方案和想法,在程式設計的過程中,有文法的錯誤等等會互相檢查和改正,達到了高效率的程式設計。

九、參考或引用的設計、實作

  • 結對程式設計項目-四則運算
  • 2017-2018-2 165X 『Java程式設計』課程 結對程式設計練習_四則運算
  • 結對程式設計和兩人合作
  • Intellj IDEA 簡易教程——單元測試
  • 現代軟體工程講義 個人項目和結對項目練習 四則運算

十、PSP表格

| PSP | Personal Software Process Stages)| 預估耗時(分鐘)|實際耗時(分鐘)

| -------- | :----------------😐:----------------😐:---------------: |:-----😐

| Planning | 計劃 | | | |

| Estimate | 估計這個任務需要多少時間 | 360 | 500 | |

| Development | 開發 | | | |

| Analysis | 需求分析 (包括學習新技術) | 30 | 40 | |

| Design Spec | 生成設計文檔 | 30 |35 | |

Design Review | 設計複審 (和同僚稽核設計文檔) | 25 |20

| Coding Standard | 代碼規範 (為目前的開發制定合适的規範) | 15 | 30 | |

Design | 具體設計 |60 |75

| Coding | 具體編碼 | 180 | 255 | |

| Code Review | 代碼複審 | 30 | 25 | |

| Test | 測試(自我測試,修改代碼,送出修改) | 150 | 135 | |

| Reporting | 報告 | | | |

| Test Report | 測試報告 | 20 | 25 | |

| Size Measurement | 計算工作量 | 10 | 5 | |

| Postmortem & Process Improvement Plan | 事後總結, 并提出過程改進計劃 | 60 | 80 | |

| | 合計 | 610 |725 | |