天天看點

20165230 結對程式設計項目-四則運算 整體總結

20165230 結對程式設計項目-四則運算 整體總結

一、需求分析

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

二、設計思路

  1. 設計一個

    IntNumber

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

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

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

三、核心代碼及注釋

  • 支援生成題目并寫入到檔案
import java.util.*;
public class Calculate {
    public static void main(String[] args) {
        NumberFormat nf = NumberFormat.getPercentInstance();
    ···
        Random ran = new Random();
        Scanner scan = new Scanner(System.in);
        IOFile iof = new IOFile("Exercises.txt");//處理生成題目并輸出到檔案
        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);
                in1 = IntNumber.obj();
                in2 = IntNumber.obj();
                score1 = Score.obj();
                score2 = Score.obj();
                if (B == 0) {
                    switch (C) {
                        case 0:
                            num = in1.add(in2);
                            S1 =in1.toString()+ " + " + in2.toString() + "=";
                            num1 = "" + num;
                            iof.WriteQuestionsToFile(S1);//調用append方法,将題目寫入檔案
                            N = scan.nextInt();
                            CorrectJudgment.judgment(N == num, num1);
                            break;
                        case 1:
                           ···
                        case 2:
                           ···
                        case 3:
                           ···
                    }
                } else {
                    switch (C) {
                        case 0:
                             num2 = score1.add(score2);
                            num1 = num2.toString();
                            Q = scan.next();
                            S2 =score1.toString()+"+"+score2.toString()+"=";
                            iof.WriteQuestionsToFile(S2);//調用append方法,将題目寫入檔案
                            CorrectJudgment.judgment(Q.equals(num1), num1);
                            break;
                        case 1:
                           ···
                        case 2:
                           ···
                        case 3:
                           ···
                    }
                }
            }

            System.out.println("你答對的題目總數:" + CorrectJudgment.getTrues());
            double T = (double) CorrectJudgment.getTrues() / A;
            System.out.println("您的正确率為:" + nf.format(T));
            System.out.println("是否繼續生成題目?(y/n):"  );
            String s1 = scan.next();
            if (s1.equalsIgnoreCase("n")){
                break;
            }
        }
    }
}
                        
           
import java.util.Random;
public class Fraction {
    private int numerator, denominator;

···
    public Fraction add(Fraction op2)//實作真分數加法
    {
        int commonDenominator = denominator * op2.getDenominator();
        int numerator1 = numerator * op2.getDenominator();
        int numerator2 = op2.getNumerator() * denominator;
        int sum = numerator1 + numerator2;
        System.out.print("("+this.toString()+")" + " + " + "("+op2.toString()+")" + "=");
        return new Fraction (sum, commonDenominator);
    }

    public Fraction subtract(Fraction op2)//實作真分數減法
    {
        int commonDenominator = denominator * op2.getDenominator();
        int numerator1 = numerator * op2.getDenominator();
        int numerator2 = op2.getNumerator() * denominator;
        int difference = numerator1 - numerator2;
        System.out.print("("+this.toString()+")" + " - " + "("+op2.toString()+")" + "=");
        return new Fraction(difference,commonDenominator);
    }

    public Fraction multiply (Fraction op2)//實作真分數乘法
    {
        int numer = numerator * op2.getNumerator();
        int denom = denominator * op2.getDenominator();
        System.out.print("("+this.toString()+")" + " * " + "("+op2.toString()+")" + "=");
        return new Fraction (numer, denom);
    }

    public Fraction divide (Fraction op2)//實作真分數除法
    {

        int numer = numerator * op2.getDenominator();
        int denom = denominator * op2.getNumerator();
        System.out.print("("+this.toString()+")" + " / " + "("+op2.toString()+")" + "=");
        return new Fraction (numer, denom);
    }

···

    private void reduce()//化簡
    {
        if (numerator != 0)
        {
            int common = gcd (Math.abs(numerator), denominator);

            numerator = numerator / common;
            denominator = denominator / common;
        }
    }


    private int gcd (int num1, int num2)//求最大公因子
    {
        if(num2==0)
            return num1;
        else
            return gcd(num2,num1%num2);

    }
    public static Fraction obj(){
        Random ran = new Random();
        return new Fraction(ran.nextInt(20),ran.nextInt(20));
    }
}
           

四、測試方法

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

五、運作過程截圖

20165230 結對程式設計項目-四則運算 整體總結
20165230 結對程式設計項目-四則運算 整體總結

六、代碼托管位址

https://gitee.com/BESTI-IS-JAVA-2018/20165230/commit/a8633b2aec49a9632cfea1e732035e8f86073b73

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

  • 問題1:如何實作輸出到檔案?
  • 問題1解決方案:用到了PrinterStream類的append方法。将表達式作為一個字元串傳入參數即可。
  • 問題2:在實作支援輸出到檔案功能時,題目不能正常顯示數字,顯示的是其引用
  • 問題2解決方案:發現定義字元串時,把int型資料直接添入,結果隻能顯示其引用,通過

    toString()

    方法即可顯示

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

  • 結對搭檔:20165226劉香杉
  • 本周主要是在上一周的基礎上進行需求擴充,我們分工獨立完成,最終進行彙總并總結。由我實作支援自動生成題目并寫入到檔案的功能。在擴充的過程中發現自己學過的許多知識不會運用于實際,通過不斷的查資料,查書,通過部落格進行再學習,才獨立完成了該功能的實作。在這個過程中将所學過的知識融會貫通,運用于實際,使我對知識點有了更深的了解與掌握。通過和杉杉交流總結,我們體會到了“紙上得來終覺淺,絕知此事要躬行”,不僅如此,還應多擴充知識的深度和廣度,等到需要用時,便不會像無頭蒼蠅一樣東拼西湊。

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

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

十、PSP表格

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

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

| Planning | 計劃 | | | |

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

| Development | 開發 | | | |

| Analysis | 需求分析 (包括學習新技術) | 60 | 65 | |

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

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

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

Design | 具體設計 |75 |95

| Coding | 具體編碼 | 230 | 300 | |

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

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

| Reporting | 報告 | | | |

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

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

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

| | 合計 | 730 |820 | |