1. 程式人生 > >20165230 結對編程項目-四則運算 階段總結

20165230 結對編程項目-四則運算 階段總結

之間 最終 i++ 判斷 system 報告 基本 alt 結對編程

20165230 結對編程項目-四則運算 階段總結

一、需求分析

  • 隨機生成題目
  1. 生成的題目個數從命令行輸入
  2. 用戶可選擇生成不同難度的題目,比如通過參數指定: (1) 運算符個數範圍 (2) 運算符限定(小學一年級題目只生成 + - 題目)
  3. 能多次生成題目
  • 題目運算(判題)
  1. 支持多運算符
  2. 支持整數
  3. 支持真分數
  4. 轉換為後綴表達式(也可以直接計算中綴表達式)
  • 題目合法性判斷
  1. 可獨立使用
  2. 可用於測試生成題目的正確性
  • 擴展需求
  1. 題目去重
  2. 支持多語言
  3. 處理生成題目並輸出到文件
  4. 完成題目後從文件讀入並判題

二、設計思路

  1. 設計一個IntNumber類,用來實現整數的四則運算
  2. 設計一個Fraction
    類,用來實現真分數的四則運算
  3. 設計一個Judgement類,用來判斷用戶輸入與實際計算值是否相等,並統計正確的次數
  4. 設計主類,生成隨機數,生成題目,並判斷正確率
  5. 設計測試類,測試整數類與分數類的四則運算
    技術分享圖片

三、核心代碼及註釋

  • 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類的方法測試
    技術分享圖片

  • Fraction類的方法測試
    技術分享圖片

五、運行過程截圖

技術分享圖片

技術分享圖片

六、代碼托管地址

  • 四則運算

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

  • 問題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

20165230 結對編程項目-四則運算 階段總結