20165330 結對編程項目-四則運算 第二周
阿新 • • 發佈:2018-04-23
清晰 二周 不重復 我們 dea 加減乘除 問題 static BE
需求分析
- 實現一個命令行程序,要求:自動生成小學四則運算題目(加、減、乘、除)
- 可實現多個運算符一起運算
- 可以真分數形式輸出結果
- 測試結果的正確性
統計題目完成數並計算正確率
設計思路
- 實驗首先是完成一個計算器的功能,可以實現簡單的+、-、*、/運算,在這裏設計一個主類生成隨機數,生成題目,並判斷正確率
- 實現多運算符,編入四個類分別實現整數運算、真分數運算、判斷結果正確並計算正確率
- 利用JUnit檢測非法輸入
設計測試類,利用JUnit測試整數類與分數類的四則運算
UML類圖
功能截圖
Junit測試
代碼托管地址
- 四則運算
實驗過程中遇到的困難及解決方法
在上周我們對真分數部分的代碼存在疑惑,這周我們將這部分作為了重點研究。
- 首先是用java語言描述真分數裏的加減乘除運算,然後將運算結果化簡。
- 化簡過程需要用到求最大公因子,這時候我們需要分子分母均為正值,於是就有了
public Fraction (int numer, int denom)
方法,以及Math.abs(numerator)
來保證算法不出現漏洞。 除此之外還要註意分子分母計算的一些限定特性。我們同樣加進代碼裏。
源代碼及分析註釋:
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(); //兩隨機數a1、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)); } }
- 代碼裏的去重功能沒寫出來,但是經過討論有了思路:
- 記錄之前生成的題目
- 用遍歷比較新生成題目與舊生成題目。如果重復,則刪除此新生成題,並再生成一個題目,重新遍歷檢查。如果不重復,則進入下一環節
結對總結及評價
- 在之後的本周的學習中,我們的結對學習比上周更有動力,整體思路更清晰,對彼此的督促作用也得到加強,對代碼得到了更深層次的理解,學習效率大大提高。希望在日後的學習中我們可以做到更好,得到更大的進步!
- 在本周學習中,在小夥伴的幫助下,我對代碼有了更深的解讀,她的認真及更高效的學習方法讓我受益,在這周的磨合中我們的默契度也有了更大的提高,思考問題的時候,會有更多相同的思考,結對學習的過程也是我們相互促進的過程。
參考或引用的設計、實現
- 結對編程項目-四則運算
- Intellj IDEA 簡易教程——單元測試
- 現代軟件工程講義 個人項目和結對項目練習 四則運算
- 2017-2018-2 165X 『Java程序設計』課程 結對編程練習_四則運算
- 編寫一個能自動生成小學四則運算題目的程序
步驟 | 耗時 | 百分比 |
---|---|---|
需求分析 | 20min | 16% |
設計 | 30min | 24% |
代碼實現 | 40min | 32% |
測試 | 20min | 16% |
分析總結 | 15min | 12% |
20165330 結對編程項目-四則運算 第二周