一、小組成員及分工
- 楊愛清
1.學号:201421123099
2.部落格連結
- 楊立鑫
1.學号:201421123100
2.部落格連結(本部落格)
- 分工
1.在提取計算子產品上,楊愛清同學扮演領航員的角色,楊立鑫同學扮演駕駛員。
楊愛清同學提出了提取出來的類應該包含以下幾個函數:
- add() (加)
- sub() (減)
- mul() (乘)
- div() (除)
- compare() (分數大小比較)
- GCD() (計算最大公約數)
- CreatFrac() (建立随即分數)
楊立鑫同學根據根據同伴所說,在原程式中提取出了計算子產品,并單獨建立了一個類Fraction。(下方有Fraction代碼)
2.在單元測試上,楊立鑫同學扮演領航員的角色,楊愛清同學扮演駕駛員。
楊立鑫同學提出,通過單元測試代碼,要測試加法是否能正确工作,加減乘除功能,測試計算類對于各種參數的支援。針對提取出的子產品楊愛清同學使用junit選擇并建構了FractionTest類.
二、實驗步驟
(1)需求分析:
1、通過單元測試代碼,測試加法是否能正确工作;
2、通過單元測試代碼,測試加減乘除功能。
3、通過單元測試代碼,測試計算類對于各種參數的支援:
- 輸入是有錯誤的,例如 “1 ++ 2”,
- 在數值範圍是 -1000 .. 1000 的時候,傳進去 “10000 + 32768”,
- 或者是 “ 248 / 0” 怎麼辦?
- 怎麼告訴函數的調用者 “你錯了”? 把傳回的字元串定義為 “-1” 來表示?
- 那麼如果真的計算結果是 “-1” 又怎麼處理呢?
4、通過增量修改的方式,改程序式, 完成對各種錯誤情況的處理。
(2)單元測試:
通過産生随機數方法,反複測試所有單元;
單元測試代碼:
package test;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
public class FractionTest {
Fraction fraction=new Fraction();
Fraction f1 = fraction.CreatFrac();
Fraction f2 = fraction.CreatFrac();
@Before
public void setUp() throws Exception {
}
@Test
public void testFraction() {
}
@Test
public void testAdd() {
fraction.add(f1, f2);
}
@Test
public void testSub() {
fraction.sub(f1, f2);
}
@Test
public void testMul() {
fraction.mul(f1, f2);
}
@Test
public void testDiv() {
fraction.div(f1, f2);
}
@Test
public void testCompare() {
fraction.compare(f1, f2);
}
@Test
public void testCreatFrac() {
}
}
(3)測試結果截圖:

(4)代碼覆寫率
三、PSP
PSP2.1 | Personal Software Process Stages | Time (%) Senior Student(/hour) | Time (%)(/hour) |
· Planning | 計劃 | 2 | 1 |
· Estimate | 估計這個任務需要多少時間 | 15 | 13 |
· Analysis | 需求分析 (包括學習新技術) | 1.5 | |
· Coding Standard | 代碼規範 | 0.5 | |
· Design | 具體設計 | ||
· Coding | 具體編碼 | 10 | 7 |
· Test | 測試(自我測試,修改代碼,送出修改) | ||
Reporting | 報告 |
四、總結
因為對GIT的不熟悉不熟練浪費了很多時間。經常送出不成功。但是在老師的幫助下,還是成功的送出了代碼,并基本的學會了使用,收獲還是蠻多的。
結對程式設計的幾次作業都是我和愛清一起完成,經常一起約圖書館,一起探讨,互相學習。并且在領航員與駕駛員的角色切換中,收獲了合作的快樂。一起我都是喜歡什麼事情什麼程式都自己來做,這樣才能更加清楚地了解哪部分代碼是做什麼,非常怕和别人合作後不清楚對方做的什麼,不利于自己地程式設計。當合作并且扮演好角色才發現,合作不是兩個人孤立地獨自地各敲各地代碼,而是在一人領航指揮,一人動手操作地模式下互相促進,而且增加了團隊之間地交流,能夠更加完善的實作項目。
經過這兩次程式設計,我覺得能夠為我未來進入社會進行團隊協作時提供了思路與基礎。
五、附錄
1.碼雲位址
2.小組成員探讨照片
3.特别鳴謝張敏老師有問題問她幾乎都是秒回,而且特别耐心詳細地回答我的每個問題有圖有真相~
4.Fraction代碼
package test;
public class Fraction {
private int fenzi;
private int fenmu;
public Fraction() {
super();
}
public Fraction(int fenzi, int fenmu) {
super();
this.fenzi = fenzi;
this.fenmu = fenmu;
this.simplify(fenzi, fenmu); //在構造函數中直接化簡分數(感覺此方法欠妥)
}
public static Fraction add(Fraction f1, Fraction f2) {
int fz1 = f1.getFenzi();
int fz2 = f2.getFenzi();
int fm1 = f1.getFenmu();
int fm2 = f2.getFenmu();
Fraction f = new Fraction(fz1 * fm2 + fm1 * fz2, fm1 * fm2);
return f;
}//加法運算
public static Fraction sub(Fraction f1, Fraction f2) {
int fz1 = f1.getFenzi();
int fz2 = f2.getFenzi();
int fm1 = f1.getFenmu();
int fm2 = f2.getFenmu();
Fraction f = new Fraction(fz1 * fm2 - fm1 * fz2, fm1 * fm2);
return f;
}//減法運算
public static Fraction mul(Fraction f1, Fraction f2) {
int fz1 = f1.getFenzi();
int fz2 = f2.getFenzi();
int fm1 = f1.getFenmu();
int fm2 = f2.getFenmu();
Fraction f = new Fraction(fz1 * fz2, fm1 * fm2);
return f;
}//乘法運算
public static Fraction div(Fraction f1, Fraction f2) {
int fz1 = f1.getFenzi();
int fz2 = f2.getFenzi();
int fm1 = f1.getFenmu();
int fm2 = f2.getFenmu();
Fraction f = new Fraction(fz1 * fm2, fm1 * fz2);
return f;
}//除法運算
public static boolean compare(Fraction f1, Fraction f2) {
int fz1 = f1.getFenzi();
int fz2 = f2.getFenzi();
int fm1 = f1.getFenmu();
int fm2 = f2.getFenmu();
if (fz1 * fm2 >= fz2 * fm1) {
return true;
} else {
return false;
}
}//比較兩分數的大小
public static int GCD(int m, int n) {
while (true) {
if ((m = m % n) == 0) {
return n;
}
if ((n = n % m) == 0) {
return m;
}
}
}//計算最大公約數
public void simplify(int fenzi, int fenmu) {
int GCD = GCD(fenzi, fenmu);
this.fenzi = fenzi / GCD;
this.fenmu = fenmu / GCD;
}//化簡分數
@Override
public String toString() {
if (fenzi == 0) {
return 0 + "";
} else if (fenzi % fenmu == 0) {
return fenzi / fenmu + "";
} else {
return fenzi + "/" + fenmu;
}
}//改寫toString,輸出為分數形式
public int getFenzi() {
return fenzi;
}
public void setFenzi(int fenzi) {
this.fenzi = fenzi;
}
public int getFenmu() {
return fenmu;
}
public void setFenmu(int fenmu) {
this.fenmu = fenmu;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + fenmu;
result = prime * result + fenzi;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Fraction other = (Fraction) obj;
if (fenmu != other.fenmu) {
return false;
}
if (fenzi != other.fenzi) {
return false;
}
return true;
}
public static Fraction CreatFrac() {
int fz, fm;
fz = (int) (0 + Math.random() * (100 - 0 + 1));//分子取0--100的随機數
fm = (int) (1 + Math.random() * (10 - 1 + 1));//分母取1--100的随機數
Fraction frac = new Fraction(fz, fm);
return frac;
}//建立随機分數
}