20165330 結對編程項目-四則運算 第二週

需求分析

  • 實現一個命令行程序,要求:自動生成小學四則運算題目(加、減、乘、除)
  • 可實現多個運算符一塊兒運算
  • 能夠真分數形式輸出結果
  • 測試結果的正確性
  • 統計題目完成數並計算正確率html

    設計思路

  • 實驗首先是完成一個計算器的功能,能夠實現簡單的+、-、*、/運算,在這裏設計一個主類生成隨機數,生成題目,並判斷正確率
  • 實現多運算符,編入四個類分別實現整數運算、真分數運算、判斷結果正確並計算正確率
  • 利用JUnit檢測非法輸入
  • 設計測試類,利用JUnit測試整數類與分數類的四則運算java

    UML類圖

    image

功能截圖

image

Junit測試

image
image

代碼託管地址

實驗過程當中遇到的困難及解決方法

在上週咱們對真分數部分的代碼存在疑惑,這周咱們將這部分做爲了重點研究。
  • 首先是用java語言描述真分數裏的加減乘除運算,而後將運算結果化簡。
  • 化簡過程須要用到求最大公因子,這時候咱們須要分子分母均爲正值,因而就有了public Fraction (int numer, int denom)方法,以及Math.abs(numerator)來保證算法不出現漏洞。
  • 除此以外還要注意分子分母計算的一些限定特性。咱們一樣加進代碼裏。git

    源代碼及分析註釋:算法

import java.util.Random;
public class Fraction {
    private int numerator, denominator;  //定義分母、分子

    public  Fraction (int numer, int denom)
    {

        if(denom == 0 )        //分子爲0
            denom = 1;
        if (denom < 0)           //若分母小於0,則取分母爲正值,分子爲負值
        {
            numer = numer * -1;
            denom = denom * -1;
        }
        numerator = numer;
        denominator = denom;

        reduce();
    }

    public int getNumerator()
    {
        return numerator;
    }

    public int getDenominator()
    {
        return denominator;
    }


    public Fraction add(Fraction op2)          //實現真分數加法運算
    {
        int commonDenominator = denominator * op2.getDenominator();   //兩隨機數a一、a2的分母相乘,進行通分
        int numerator1 = numerator * op2.getDenominator();            //a1的分子=a1的分子與a2的分母相乘
        int numerator2 = op2.getNumerator() * denominator;           //a2的分子=a2的分子與a1的分母相乘
        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);
    }

    public String toString()      //輸出格式及限定
    {
        String result;

        if (numerator == 0)               //分子爲0,結果爲0
            result = "0";
        else
        if(denominator == 0)              //分母不能爲0
            return "錯誤!分母不能爲0";
        else
        if (denominator == 1)             //分母爲1,結果取分子值
            result = numerator + "";

        else
            result = numerator + "/" + denominator;  //按分數形式輸出結果

        return result;
    }

    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(100),ran.nextInt(100));
    }
}
  • 代碼裏的去重功能沒寫出來,可是通過討論有了思路:
    • 記錄以前生成的題目
    • 用遍歷比較新生成題目與舊生成題目。若是重複,則刪除此新生成題,並再生成一個題目,從新遍歷檢查。若是不重複,則進入下一環節

結對總結及評價

  • 在以後的本週的學習中,咱們的結對學習比上週更有動力,總體思路更清晰,對彼此的督促做用也獲得增強,對代碼獲得了更深層次的理解,學習效率大大提升。但願在往後的學習中咱們能夠作到更好,獲得更大的進步!
  • 在本週學習中,在小夥伴的幫助下,我對代碼有了更深的解讀,她的認真及更高效的學習方法讓我受益,在這周的磨合中咱們的默契度也有了更大的提升,思考問題的時候,會有更多相同的思考,結對學習的過程也是咱們相互促進的過程。

參考或引用的設計、實現

步驟 耗時 百分比
需求分析 20min 16%
設計 30min 24%
代碼實現 40min 32%
測試 20min 16%
分析總結 15min 12%
相關文章
相關標籤/搜索