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

20165230 結對編程項目-四則運算 整體總結

ber idea 匯總 .com soft ESS tip 完成 需求

20165230 結對編程項目-四則運算 整體總結

一、需求分析

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

二、設計思路

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

三、核心代碼及註釋

  • 支持生成題目並寫入到文件
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類的方法測試
    技術分享圖片

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

五、運行過程截圖

技術分享圖片
技術分享圖片

六、代碼托管地址

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

20165230 結對編程項目-四則運算 整體總結