1. 程式人生 > >2018-2019-2 20175310 實驗二《Java面向對象程序設計》實驗報告

2018-2019-2 20175310 實驗二《Java面向對象程序設計》實驗報告

logs 成績 length 加減 over 理解 整體 邊界 變量

2018-2019-2 20175310 實驗二《Java面向對象程序設計》實驗報告

一、實驗步驟及內容

(一)、面向對象程序設計-1

參考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST
參考http://www.cnblogs.com/rocedu/p/6736847.html
提交最後三個測試用例都通過的截圖,截圖上要有畫圖加水印,輸入自己的學號。

1、在IDEA中安裝JUnit插件,選擇File->Setting打開設置對話框:
技術分享圖片

2、在設置對話框中選擇Plugins, 單擊Installed,在插件安裝對話框的搜索中輸入junit,單擊JunitGenerator V2.0

,單擊右邊綠色的Install按鈕安裝:
技術分享圖片

3、我們在IDEA中新建一個項目,然後新建一個類MyUtil,我們要在一個MyUtil類中解決一個百分制成績轉成“優、良、中、及格、不及格”五級制成績的功能。
針對上面的問題,我們可以通過偽代碼這樣解決:

百分制轉五分制:
如果成績小於60,轉成“不及格”
如果成績在60與70之間,轉成“及格”
如果成績在70與80之間,轉成“中等”
如果成績在80與90之間,轉成“良好”
如果成績在90與100之間,轉成“優秀”
其他,轉成“錯誤”

4、有了偽代碼,我們用特定編程語言翻譯一下,就是可用的產品代碼了,產品代碼如下:

public class MyUtil{
    public static String percentage2fivegrade(int grade){
        //如果成績小於0,轉成“錯誤”
        if ((grade < 0))
            return "錯誤";
            //如果成績小於60,轉成“不及格”
        else if (grade < 60)
            return "不及格";
            //如果成績在60與70之間,轉成“及格”
        else if (grade < 70)
            return "及格";
            //如果成績在70與80之間,轉成“中等”
        else if (grade < 80)
            return "中等";
            //如果成績在80與90之間,轉成“良好”
        else if (grade < 90)
            return "良好";
            //如果成績在90與100之間,轉成“優秀”
        else if (grade <= 100)
            return "優秀";
            //如果成績大於100,轉成“錯誤”
        else
            return "錯誤";
    }
}

5、在 IDEA中我們把產品代碼放在src目錄中,把測試代碼放在test目錄中,右鍵單擊項目,在彈出的菜單中選擇New->Directory新建一個目錄:
技術分享圖片

6、輸入目錄名test:
技術分享圖片

7、設置SOURCEPATH環境變量,右鍵單擊test目錄,在彈出的菜單中選擇Mark Directory as->Test Sources Root
技術分享圖片

8、鼠標單擊類名會出現一個燈泡狀圖標,單擊圖標或按Alt + Entert,在彈出的菜單中選擇Create Test:
技術分享圖片

9、選擇創建JUnit3的測試用例 :
技術分享圖片

9、測試代碼如下:

import org.junit.Test;
import junit.framework.TestCase;
public class MyUtilTest extends TestCase {
    @Test
    public void testNormal() {
        assertEquals("不及格", MyUtil.percentage2fivegrade(55));
        assertEquals("及格", MyUtil.percentage2fivegrade(65));
        assertEquals("中等", MyUtil.percentage2fivegrade(75));
        assertEquals("良好", MyUtil.percentage2fivegrade(85));
        assertEquals("優秀", MyUtil.percentage2fivegrade(95));
    }
    @Test
    public void testExceptions(){//測試出錯情況
        assertEquals("錯誤", MyUtil.percentage2fivegrade(105));
        assertEquals("錯誤", MyUtil.percentage2fivegrade(-55));
    }
    @Test
    public void testBoundary(){//測試邊界情況
        assertEquals("不及格", MyUtil.percentage2fivegrade(0));
        assertEquals("及格", MyUtil.percentage2fivegrade(60));
        assertEquals("中等", MyUtil.percentage2fivegrade(70));
        assertEquals("良好", MyUtil.percentage2fivegrade(80));
        assertEquals("優秀", MyUtil.percentage2fivegrade(90));
        assertEquals("優秀", MyUtil.percentage2fivegrade(100));
    }


}

10、測試代碼及結果如下圖:
技術分享圖片

(二)、面向對象程序設計-2

參考 積極主動敲代碼,使用JUnit學習Java (http://www.cnblogs.com/rocedu/p/4837092.html)
參考http://www.cnblogs.com/rocedu/p/6736847.html
TDD的方式研究學習StringBuffer,提交你的單元測試用例和測試通過的截圖,截圖要加上學號水印。

1、產品代碼:

public class StringBufferDemo{
    StringBuffer str=new StringBuffer();
    StringBufferDemo(StringBuffer str){
        this.str=str;
    }
    public char charAt(int i){
        return str.charAt(i);
    }
    public int capacity(){
        return str.capacity();
    }
    public int length(){
        return str.length();
    }
    public int indexOf(String buf) {
        return str.indexOf(buf);
    }
}

2、測試代碼:

import junit.framework.TestCase;
import org.junit.Test;

public class StringBufferDemoTest extends TestCase {
    StringBuffer a = new StringBuffer("StringBuffer");//測試12個字符(<=16)
    StringBuffer b = new StringBuffer("StringBufferStringBuffer");//測試24個字符(>16&&<=34)
    StringBuffer c = new StringBuffer("StringBufferStringBufferStringBuffer");//測試36個字符(>34)
    @Test
    public void testcharAt(){
        assertEquals('S',a.charAt(0));
        assertEquals('B',a.charAt(6));
        assertEquals('r',a.charAt(11));
    }
    @Test
    public void testcapacity(){
        assertEquals(28,a.capacity());
        assertEquals(40,b.capacity());
        assertEquals(52,c.capacity());
    }
    @Test
    public void testlength(){
        assertEquals(12,a.length());
        assertEquals(24,b.length());
        assertEquals(36,c.length());
    }
    @Test
    public void testindexOf(){
        assertEquals(0,a.indexOf("Str"));
        assertEquals(6,a.indexOf("Buff"));
        assertEquals(10,a.indexOf("er"));
    }
}

3、測試結果截圖:
技術分享圖片

(三)、面向對象程序設計-3

實驗二 Java面向對象程序設計(http://www.cnblogs.com/rocedu/p/4472842.html)
參考http://www.cnblogs.com/rocedu/p/6736847.html
對設計模式示例進行擴充,體會OCP原則和DIP原則的應用,初步理解設計模式
讓系統支持Float類,並在MyDoc類中添加測試代碼表明添加正確,提交測試代碼和運行結的截圖,加上學號水印

1、產品代碼:

// Server Classes 
abstract class Data { 
    abstract public void DisplayValue(); 
}
class Integer extends  Data {    
    int value; 
    Integer() {
         value=100; 
    }  
    public void DisplayValue(){
        System.out.println (value);
    } 
 }
class Float extends  Data {
    float value;
    Float() {
        value=1.23456F;
    }
    public void DisplayValue(){
        System.out.println (value);
    }
}
// Pattern Classes 
abstract class Factory { 
   abstract public Data CreateDataObject(); 
}
class IntFactory extends Factory { 
   public Data CreateDataObject(){
     return new Integer();
   }
}
class FloatFactory extends Factory {
    public Data CreateDataObject(){
        return new Float();
    }
}
class Document {    //Client classes
    Data pd; 
    Document(Factory pf){ 
       pd = pf.CreateDataObject(); 
    } 
    public void DisplayData(){
       pd.DisplayValue(); 
   } 
 } 
 //Test class
 public class MyDoc {
    static Document d,f;
    public static void main(String[] args) {
            d = new Document(new IntFactory()); 
            d.DisplayData();
            f = new Document(new FloatFactory());
            f.DisplayData();
    }   
}

2、運行結果截圖:
技術分享圖片

(四)、面向對象程序設計-4

任務:以TDD的方式開發一個復數類Complex,要求如下:

// 定義屬性並生成getter,setter
double RealPart;
double ImagePart;
// 定義構造函數
public Complex()
public Complex(double R,double I)

//Override Object
public boolean equals(Object obj)
public String toString()

// 定義公有方法:加減乘除
Complex ComplexAdd(Complex a)
Complex ComplexSub(Complex a)
Complex ComplexMulti(Complex a)
Complex ComplexDiv(Complex a)

1、產品代碼:
Complex.java

public class Complex {
    // 定義屬性並生成getter,setter
    double RealPart;
    double ImagePart;
    void setRealPart(double r){
        RealPart=r;
    }
    void setImagePart(double i){
        ImagePart=i;
    }
    double getRealPart(Complex a){
        return a.RealPart;
    }
    double getImagePart(Complex a){
        return a.ImagePart;
    }
    // 定義構造函數
    public Complex(double r,double i){
        RealPart=r;
        ImagePart=i;
    }

    //Override Object

    public String toString(){
        String result = new String();
        if (ImagePart>0)
            result = RealPart+"+"+ImagePart+"i";
        if (ImagePart==0)
            result = RealPart+"";
        if (ImagePart<0)
            result = RealPart+"-"+ImagePart*(-1)+"i";
        return result;
    }


    public Complex ComplexAdd(Complex a){
        return new Complex(RealPart+a.RealPart,ImagePart+a.ImagePart);
    }

    public Complex ComplexSub(Complex a){
        return new Complex(RealPart-a.RealPart,ImagePart-a.ImagePart);
    }

    public Complex ComplexMulti(Complex a){
        return new Complex(RealPart*a.RealPart-ImagePart*a.ImagePart,RealPart*a.ImagePart+ImagePart*a.RealPart);
    }

    public Complex ComplexDiv(Complex a){
        double d = Math.sqrt(a.RealPart * a.RealPart) + Math.sqrt(a.ImagePart * a.ImagePart);
        return new Complex((RealPart*a.RealPart+ImagePart*a.ImagePart)/d,(ImagePart*a.RealPart-RealPart*a.ImagePart)/d);
    }
}

ComplexDemo.java

public class ComplexDemo {
    public static void main(String[] a) {
    Complex b = new Complex(2, 6);
    Complex c = new Complex(1, -3);
    System.out.println("("+b + ")+(" + c + ")=" + b.ComplexAdd(c));
    System.out.println("("+b + ")-(" + c + ")=" + b.ComplexSub(c));
    System.out.println("("+b + ")*(" + c + ")=" + b.ComplexMulti(c));
    System.out.println("("+b + ")/(" + c + ")=" + b.ComplexDiv(c));
    }
}

2、測試代碼:

import junit.framework.TestCase;
import org.junit.Test;
public class ComplexTest extends TestCase {
    Complex b = new Complex(2,6);
    Complex c = new Complex(1,-3);
    @Test
    public void testComplexAdd(){
        assertEquals("3.0+3.0i",b.ComplexAdd(c)+"");
    }
    @Test
    public void testComplexSub(){
        assertEquals("1.0+9.0i",b.ComplexSub(c)+"");
    }
    @Test
    public void testComplexMulti(){
        assertEquals("20.0",b.ComplexMulti(c)+"");
    }
    @Test
    public void testComplexDiv(){
        assertEquals("-4.0+3.0i",b.ComplexDiv(c)+"");
    }
}

3、測試結果截圖:
技術分享圖片

(五)、面向對象程序設計-5

使用WhiteStarUML對實驗二中的代碼進行建模,發類圖的截圖,加上學號水印。
參考http://www.cnblogs.com/rocedu/p/6736847.html
技術分享圖片

二、實驗過程中遇到的問題及其解決

  • 問題1:
    在做第四個實驗的時候,當復數的虛部為負時,表達式顯示錯誤:
    技術分享圖片

  • 問題1解決方案:
    首先用()把兩個復數隔開,更加清晰
    技術分享圖片
    然後判斷虛部的正負,當虛部為負時,將ImagePart*(-1)作為一個整體輸出。
    技術分享圖片

  • 問題2:
    測試代碼時,提示不正確
    技術分享圖片
  • 問題2解決方案:
    可以看到提示說,希望得到的和實際得到的,看起來是一樣的,但是編譯不通過,所以應該是類型不同。
    將計算結果最後加上“”,將結果轉換成字符串類型,就可以編譯通過了。
    技術分享圖片

三、碼雲鏈接

四、參考代碼

Intellj IDEA 簡易教程
實驗二《Java面向對象程序設計》的一點說明
積極主動敲代碼,使用JUnit學習Java
實驗二 Java面向對象程序設計

五、PSP時間

步驟 耗時(min) 百分比
需求分析 30 13%
設計 40 17%
代碼實現 90 39%
測試 30 13%
分析總結 40 17%

2018-2019-2 20175310 實驗二《Java面向對象程序設計》實驗報告