1. 程式人生 > 實用技巧 >20192327 2020-2021-1 《資料結構與面向物件程式設計》實驗三報告

20192327 2020-2021-1 《資料結構與面向物件程式設計》實驗三報告

20192327 2020-2021-1 《資料結構與面向物件程式設計》實驗三報告

課程:《程式設計與資料結構》
班級: 1923
姓名: 何源
學號: 20192327
實驗教師:王志強
實驗日期:2020年10月11日
必修/選修: 必修

1.實驗內容

下載安裝並使用IDEA,完成下面實驗(https://www.cnblogs.com/rocedu/p/6371315.html)。

  1. 初步掌握單元測試和TDD
  2. 理解並掌握面向物件三要素:封裝、繼承、多型
  3. 初步掌握UML建模
  4. 完成藍墨雲上 (1)-(5)實驗。

2. 實驗過程及結果

提交點一

參考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST


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

程式程式碼如下

public class MyUtil{
    public static String carspeed(int speed){
        //如果車速小於0,轉成“錯誤”
        if ((speed < 0))
            return "錯誤";
            //如果車速小於20,轉成“一檔”
        else if (speed < 20)
            return "一檔";
            //如果車速在20與40之間,轉成“二檔”
        else if (speed < 40)
            return "二檔";
            //如果車速在40與60之間,轉成“三檔”
        else if (speed < 60)
            return "三檔";
            //如果車速在60與75之間,轉成“四檔“
        else if (speed < 75)
            return "四檔";
            //如果車速在75與180之間,轉成“五檔”
        else if (speed <= 180)
            return "五檔";
            //如果車速大於180,轉成“錯誤”
        else
            return "錯誤";
    }
}

程式執行結果如下

測試程式碼如下

import junit.framework.TestCase;

public class MyUtilTest extends TestCase {
    @Test
    public void testNormal()
    {
        assertEquals("一檔", MyUtil.carspeed(15));
        assertEquals("二檔", MyUtil.carspeed(35));
        assertEquals("三檔", MyUtil.carspeed(55));
        assertEquals("四檔", MyUtil.carspeed(70));
        assertEquals("五檔", MyUtil.carspeed(95));
    }
    @Test
    public void testException()
    {
        assertEquals("錯誤", MyUtil.carspeed(185));
    }
    @Test
    public void testBoundary()
    {
        assertEquals("一檔", MyUtil.carspeed(0));
        assertEquals("二檔", MyUtil.carspeed(20));
        assertEquals("三檔", MyUtil.carspeed(40));
        assertEquals("四檔", MyUtil.carspeed(60));
        assertEquals("五檔", MyUtil.carspeed(75));
        assertEquals("五檔", MyUtil.carspeed(180));
    }
}

測試結果如下

根據執行及測試結果可以看到,全部通過測試

提交點二

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

程式程式碼如下

public class StringBufferDemo {
	public static void main(String [] args){
		StringBuffer buffer = new StringBuffer();
		buffer.append('T');
		buffer.append("tringBuffer");
		System.out.println(buffer.charAt(1));
		System.out.println(buffer.capacity());
		System.out.println(buffer.indexOf("tring"));
		System.out.println("buffer = " + buffer.toString());
		System.out.println(buffer.length());
	}
}

程式執行結果如下

測試程式碼如下

import junit.framework.TestCase;
import org.junit.Test;
public class StringBufferDemoTest extends TestCase {
    StringBuffer a = new StringBuffer("StringBuffer");
    StringBuffer b = new StringBuffer("Thisismytestingstring");
    StringBuffer c = new StringBuffer("Thisismytestingstringandihavechangedmuch");
    @Test
    public void testcharAt() throws Exception {
        assertEquals('t', a.charAt(1));
        assertEquals('g', a.charAt(5));
        assertEquals('r', a.charAt(11));
    }
    @Test
    public void testcapacity() throws Exception {
        assertEquals(28, a.capacity());
        assertEquals(37, b.capacity());
        assertEquals(56, c.capacity());
    }
    @Test
    public void testlength() throws Exception {
        assertEquals(12, a.length());
        assertEquals(21, b.length());
        assertEquals(40, c.length());
    }
    @Test
    public void testindexOf() throws Exception {
        assertEquals(0, a.indexOf("Str"));
        assertEquals(6, b.indexOf("my"));
        assertEquals(21, c.indexOf("and"));
    }
}

測試結果如下

根據執行及測試結果可以看到,全部通過測試

提交點三

實驗三 Java面向物件程式設計(http://www.cnblogs.com/rocedu/p/4472842.html)

參考http://www.cnblogs.com/rocedu/p/6736847.html

對設計模式示例進行擴充,體會OCP原則和DIP原則的應用,初步理解設計模式
用自己的學號%6進行取餘運算,根據結果進行程式碼擴充:
0:讓系統支援Byte類,並在MyDoc類中新增測試程式碼表明新增正確,提交測試程式碼和執行結的截圖,加上學號水印
1:讓系統支援Short類,並在MyDoc類中新增測試程式碼表明新增正確,提交測試程式碼和執行結的截圖,加上學號水印
2:讓系統支援Boolean類,並在MyDoc類中新增測試程式碼表明新增正確,提交測試程式碼和執行結的截圖,加上學號水印
3:讓系統支援Long類,並在MyDoc類中新增測試程式碼表明新增正確,提交測試程式碼和執行結的截圖,加上學號水印
4:讓系統支援Float類,並在MyDoc類中新增測試程式碼表明新增正確,提交測試程式碼和執行結的截圖,加上學號水印
5:讓系統支援Double類,並在MyDoc類中新增測試程式碼表明新增正確,提交測試程式碼和執行結的截圖,加上學號水印
參考 積極主動敲程式碼,使用JUnit學習Java (http://www.cnblogs.com/rocedu/p/4837092.html)
參考http://www.cnblogs.com/rocedu/p/6736847.html
以 TDD的方式研究學習StringBuffer,提交你的單元測試用例和測試通過的截圖,截圖要加上學號水印。

程式程式碼如下

import java.util.Objects;
abstract class Data {
    abstract public void DisplayValue();
}
class Integer extends Data {
    int value;
    Integer() {
        value=120;
    }
    public void DisplayValue(){
        System.out.println (value);
    }
}
class Long extends Data {
    long value;
    Long() {
        value=(long)20192327;
    }
    public void DisplayValue(){
        System.out.println (value);
    }
}
abstract class Factory {
    abstract public Data CreateDataObject();
}
class IntFactory extends Factory {
    public Data CreateDataObject(){
        return new Integer();
    }
}
class LongFactory extends Factory {
    public Data CreateDataObject(){
        return new Long();
    }
}
class Document {
    Data data;
    Document(Factory factory){
        data = factory.CreateDataObject();
    }
    public void DisplayData(){
        data.DisplayValue();

    }
}
public class MyDoc {
    static Document a;
    static Document b;
    public static void main(String[] args) {
        a = new Document(new IntFactory());
        a.DisplayData();
        b = new Document(new LongFactory());
        b.DisplayData();
    }
}

程式執行結果如下

提交點四

提交:單元測試程式碼和執行成功截圖及碼雲上程式碼連結,截圖要加上學號水印

參考http://www.cnblogs.com/rocedu/p/6736847.html

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

// 定義屬性並生成getter,setter
double RealPart;
double ImagePart;

碼雲連結
https://gitee.com/besti1923/hy20192327/blob/master/src/Imaginarycalculator.java
https://gitee.com/besti1923/hy20192327/blob/master/test/imaginarycalculatorTest.java

程式程式碼如下

import java.util.Scanner;

public class imaginarycalculator
{
    double Realpart;
    double Imagepart;
    public double getRealpart()
    {
        return Realpart;
    }
    public double getImagepart()
    {
        return Imagepart;
    }
    public void setRealpart(double realpart)
    {
        Realpart = realpart;
    }
    public void setImagepart(double imagepart)
    {
        Imagepart = imagepart;
    }
    public imaginarycalculator() {
    }
    public imaginarycalculator(double R, double I)
    {
        Realpart = R;
        Imagepart = I;
    }
    public static imaginarycalculator addition(imaginarycalculator a, imaginarycalculator b)
    {
        imaginarycalculator temp = new imaginarycalculator();
        temp.Realpart = a.Realpart + b.Realpart;
        temp.Imagepart = a.Imagepart + b.Imagepart;
        return temp;
    }
    public static imaginarycalculator subtraction(imaginarycalculator a, imaginarycalculator b)
    {
        imaginarycalculator temp = new imaginarycalculator();
        temp.Realpart = a.Realpart - b.Realpart;
        temp.Imagepart = a.Imagepart - b.Imagepart;
        return temp;
    }
    public static imaginarycalculator multiplication(imaginarycalculator a, imaginarycalculator b)
    {
        imaginarycalculator temp = new imaginarycalculator();
        temp.Realpart = a.Realpart * b.Realpart - a.Imagepart * b.Imagepart;
        temp.Imagepart = a.Realpart * b.Imagepart + a.Imagepart * b.Realpart;
        return temp;
    }
    public static imaginarycalculator division(imaginarycalculator a, imaginarycalculator b)
    {
        imaginarycalculator temp = new imaginarycalculator();
        double t = Math.pow(b.Realpart, 2) + Math.pow(b.Imagepart, 2);
        temp.Realpart = (a.Realpart * b.Realpart + a.Imagepart * b.Imagepart) / t;
        temp.Imagepart = (a.Imagepart * b.Realpart - a.Realpart * b.Imagepart) / t;
        return temp;
    }
    public static void main(String[] args)
    {
        imaginarycalculator a=new imaginarycalculator();
        imaginarycalculator b=new imaginarycalculator();
        imaginarycalculator result=new imaginarycalculator();

        String operate;
        Scanner scan=new Scanner(System.in);
        System.out.println("input the first number");
        a.Realpart=scan.nextDouble();
        a.Imagepart=scan.nextDouble();
        System.out.println(a.Realpart+"+"+"("+a.Imagepart+"i"+")");
        System.out.println("choose the type: ");
        operate=scan.next();
        System.out.println("input the first number");
        b.Realpart=scan.nextDouble();
        b.Imagepart=scan.nextDouble();
        System.out.println(b.Realpart+"+"+"("+b.Imagepart+"i"+")");
        if(operate.equals("+"))
        {
            result=addition(a,b);
        }
        else if(operate.equals("-"))
        {
            result=subtraction(a,b);
        }
        else if(operate.equals("*"))
        {
            result=multiplication(a,b);
        }
        else if(operate.equals("/"))
        { result=division(a,b);}
        System.out.println(a.Realpart+"+"+"("+a.Imagepart+"i"+")"+operate+b.Realpart+"+"+"("+b.Imagepart+"i"+")"+"=="+result.Realpart+"+"+"("+result.Imagepart+"i"+")");
    }
}

執行結果如下

測試程式碼如下

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

import static org.junit.Assert.assertEquals;

public class imaginarycalculatorTest extends TestCase {
    imaginarycalculator a = new imaginarycalculator(1.0, 2.0);
    imaginarycalculator b = new imaginarycalculator(1.0, -4.0);
    imaginarycalculator c = new imaginarycalculator(19.0, 0.0);
    imaginarycalculator d = new imaginarycalculator(0.0, -3.0);

    @Test
    public void testAddition() {
        assertEquals(2.0d, imaginarycalculator.addition(a, b).Realpart, 1d);
    }

    @Test
    public void testSubtraction() {
        assertEquals(18.0d, imaginarycalculator.subtraction(c, b).Realpart, 1d);
    }

    @Test
    public void testMultiplication() {
        assertEquals(-57.0d, imaginarycalculator.multiplication(c, d).Imagepart, 1d);
    }

    @Test
    public void testDivision() {
        assertEquals(-57.0d, imaginarycalculator.multiplication(c, d).Imagepart, 1d);
    }
}

測試結果如下

提交點五

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

類圖中只少兩個類

根據執行及測試結果可以看到,全部通過測試

3. 實驗過程中遇到的問題和解決過程

  • 問題1:提示變數不存在
  • 問題1解決方案:找到相關缺失的變數並宣告
  • 問題2:無法解析相關方法
  • 問題2解決方案:更改方法名
  • 問題3:case語句在switch外部
  • 問題3解決方案:補加“()”
  • 問題4:在測試時提示“不能解決符號XXX”
  • 問題4解決方案:更改錯誤的方法名
  • 問題5:提示警告“條件 'i <= 0' 始終為 'false' ”
  • 問題5解決方案:將“i<=0”改為“i>=0”
  • 問題6:提示找不到相關的類
  • 問題6解決方案:宣告相關的類
  • 問題7:不能解決符號“TestCas”
  • 問題7解決方案:修改指示出的相關符號為“TestCase”
  • 問題8:java: 需要')'
  • 問題8解決方案:新增“)”
  • 問題9:java: 找不到符號;符號: 變數 b;位置: 類 MyDoc
  • 問題9解決方案:新增“static Document b;”

其他(感悟、思考等)

這次程式可以說是編得非常複雜了,究其原因還是因為編寫之前沒有對實驗做一個足夠細緻的規劃才導致的這種情況,同時在命名變數時也出現了因為命名不夠準確而導致的各種問題,以後在編寫實驗室應該對此多加註意。編寫程式終歸是一個非常複雜的過程,需要我們去多加練習和思考。
這次試驗比上次複雜多了,可以說是用上了java畢生所學==,直接造就了我們宿舍有史以來最有學習氛圍的一個週末,不得不說還是收穫頗豐的。
說到底還是得多練

參考資料