20202302吉相融 实验三《面向对象程序设计》实验报告

# 20202317 2021-2022-1 《数据结构与面向对象程序设计》实验报告

课程:《程序设计与数据结构》
班级: 2023
姓名:吉相融
学号:20202302
实验教师:王志强
实验日期:2021年9月30日
必修/选修: 必修

 

## 1.实验内容

下载安装并使用IDEA,完成下面实验(https://www.cnblogs.com/rocedu/p/6371315.html)。

1. 初步掌握单元测试和TDD

2. 理解并掌握面向对象三要素:封装、继承、多态

3. 初步掌握UML建模

4. 完成蓝墨云上 (1)-(5)实验。

 

## 2.实验过程及结果

1. 初步掌握单元测试和TDD

MyUtiltest是一个测试程序,运行后可以测试程序。

 2.2. 理解并掌握面向对象三要素:封装、继承、多态

封装:即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。

继承:特殊类的对象拥有一般类的全部属性与行为,称为特殊类对一般类的继承。一个类可以是多个一般类的特殊类,也可以从多个一般类中继承属性与行为,但在java语言中,不允许一个类从多个一般类中继承属性与行为,即在java语言中,只支持单继承。

多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。简单的说:就是用基类的引用指向子类的对象。

 

 

3. 初步掌握UML建模

 4. 完成蓝墨云上 (1)-(5)实验。

(1)

任务详情
参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST 
参考http://www.cnblogs.com/rocedu/p/6736847.html

提交最后三个测试用例都通过的截图,截图上要有画图加水印,输入自己的学号。
代码:
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 "错误";
    }
}

 


测试代码:
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));
    }
}

 


运行结果:

 (2)

参考 积极主动敲代码,使用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('S');
        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());
    }
}

 


测试代码
import junit.framework.TestCase;

public class StringBufferDemoTest extends TestCase {
    StringBuffer a = new StringBuffer("wanglaoshitaiqiangle");
    StringBuffer b = new StringBuffer("wanglaoshitaihaole");
    StringBuffer c = new StringBuffer("wotainanle555");

    public void testcharAt(){                    //字符索引测试
        assertEquals('w',a.charAt(0));
        assertEquals('o',b.charAt(6));
        assertEquals('5',c.charAt(10));
    }

    public void testcapacity(){                  //测试caoacity(),发现其返回的数值是length()+16
        assertEquals(36,a.capacity());
        assertEquals(33,b.capacity());
        assertEquals(29,c.capacity());
    }

    public void testlength(){                    //字符串长度测试
        assertEquals(20,a.length());
        assertEquals(17,b.length());
        assertEquals(13,c.length());
    }

    public void testindexOf(){                   //子串匹配测试
        assertEquals(0,a.indexOf("wanglaoshi"));
        assertEquals(4,b.indexOf("lao"));
        assertEquals(10,c.indexOf("555"));
    }
}

 


运行结果

 


 (3)

任务详情
实验三 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类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印

 

abstract class Data {
    abstract public void DisplayValue();
}
class Integer extends  Data {
    int value;
    Integer() {
        value=20202302%6;
    }
    public void DisplayValue(){
        System.out.println (value);
    }
}
class Byte extends  Data {
    byte value;
    Byte() {
        value=20202302%6;
    }
    public void DisplayValue(){
        System.out.println (value);
    }
}
class Short extends  Data {
    short value;
    Short() {
        value=20202302%6;
    }
    public void DisplayValue(){
        System.out.println (value);
    }
}
class Boolean extends  Data {
    boolean value;
    Boolean() {
        value=20202302%6==3;
    }
    public void DisplayValue(){
        System.out.println (value);
    }
}
class Long extends  Data {
    long value;
    Long() {
        value=20202302;
    }
    public void DisplayValue(){
        System.out.println (value);
    }
}
class Double extends  Data {
    double value;
    Double() {
        value=20202302%6;
    }
    public void DisplayValue(){
        System.out.println (value);
    }
}
class Float extends  Data {
    float value;
    Float() {
        value=20202302%6;
    }
    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 ByteFactory extends Factory {
    public Data CreateDataObject(){
        return new Byte();
    }
}
class ShortFactory extends Factory {
    public Data CreateDataObject(){
        return new Short();
    }
}
class BoolenFactory extends Factory {
    public Data CreateDataObject(){
        return new Boolean();
    }
}
class LongFactory extends Factory {
    public Data CreateDataObject(){
        return new Long();
    }
}
class DoubletFactory extends Factory {
    public Data CreateDataObject(){
        return new Double();
    }
}
class FloatFactory extends Factory {
    public Data CreateDataObject(){
        return new Float();
    }
}
//Client classes
4class Document {
    Data pd;
    Document(Factory pf){
        pd = pf.CreateDataObject();
    }
    public void DisplayData(){
        pd.DisplayValue();
    }
}
//Test class
public class MyDoc {
    static Document d;
    public static void main(String[] args) {
        d = new Document(new IntFactory());
        d.DisplayData();
        d = new Document(new ByteFactory());
        d.DisplayData();
        d = new Document(new ShortFactory());
        d.DisplayData();
        d = new Document(new BoolenFactory());
        d.DisplayData();
        d = new Document(new LongFactory());
        d.DisplayData();
        d = new Document(new DoubletFactory());
        d.DisplayData();
        d = new Document(new FloatFactory());
        d.DisplayData();
    }
}

 运行结果·:

 

(4)

码云链接:https://gitee.com/jixiangrong/jxr20202302/blob/master/Complex.java

测试代码链接:https://gitee.com/jixiangrong/jxr20202302/blob/master/ComplexTest.java

任务详情
提交:单元测试代码和运行成功截图及码云上代码链接,截图要加上学号水印

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

任务:以TDD的方式开发一个复数类Complex,要求如下:

// 定义属性并生成getter,setter
double RealPart;
double ImagePart;

 代码:

public class Complex{
    double RealPart;
    double ImagePart;

    //定义构造函数,定义复数的实部变量a和虚部变量b
    public Complex(double a,double b){
        this.RealPart = a;
        this.ImagePart = b;
    }

    //覆盖对象,判断boolean
    public String toString(){
        return "RealPart:" + RealPart + ", ImagePart:" + ImagePart;
    }
    public boolean equals(Object z1){
        if (z1 == this){
            return true;
        }
        else{
            return false;
        }
    }

    //定义加减乘除子函数
    public Complex ComplexAdd(Complex z2){
        Complex z3 = new Complex(this.RealPart + z2.RealPart,this.ImagePart + z2.ImagePart);
        return z3;
    }
    public Complex ComplexSub(Complex z2){
        Complex z3 = new Complex(this.RealPart - z2.RealPart,this.ImagePart - z2.ImagePart);
        return z3;
    }
    public Complex ComplexMulti(Complex z2){
        Complex z3 = new Complex(this.RealPart * z2.RealPart - this.ImagePart * z2.ImagePart,
                this.ImagePart * z2.RealPart + this.RealPart * z2.ImagePart);
        return z3;
    }
    public Complex ComplexDiv(Complex z2){
        double t = z2.RealPart * z2.RealPart + z2.ImagePart * z2.ImagePart;
        Complex z3 = new Complex((this.RealPart * z2.RealPart + this.ImagePart * z2.ImagePart) / t,
                (this.ImagePart * z2.RealPart - this.RealPart * z2.ImagePart) / t);
        return z3;
    }
}

测试代码:

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

public class ComplexTest extends TestCase {
    Complex z1 = new Complex(4.0,2.0);
    Complex z2 = new Complex(1.0,-1.0);
    @Test
    public void testequals() {
        assertEquals(true, z1.equals(z1));
        assertEquals(false, z1.equals(z2));
    }
    @Test
    public void testComplexAdd() {
        assertEquals("RealPart:5.0, ImagePart:1.0", z1.ComplexAdd(z2).toString());
    }
    @Test
    public void testComplexSub() {
        assertEquals("RealPart:3.0, ImagePart:3.0", z1.ComplexSub(z2).toString());
    }
    @Test
    public void testComplexMulti() {
        assertEquals("RealPart:6.0, ImagePart:-2.0", z1.ComplexMulti(z2).toString());
    }
    @Test
    public void testComplexDiv() {
        assertEquals("RealPart:1.0, ImagePart:3.0", z1.ComplexDiv(z2).toString());
    }
}

运行结果:

 (5)

任务详情
使用[WhiteStarUML](http://whitestaruml.sourceforge.net/)对实验二中的代码进行建模,发类图的截图,加上学号水印。
参考http://www.cnblogs.com/rocedu/p/6736847.html

 

 

3.实验中的问题及解决过程:

(1)调试JUnit时,迟迟找不到包的位置。下载Everything后也没有找到,最终是查找默认位置才找到JUnit.jar的位置,成功将其配置成功。

(不过后来重启电脑后找到了JUnit.jar)

 (2)写的程序许多出现了红字,程序无法正常运行,许多是由于异常导致的。。。。。

解决过程:点红色小灯泡,IDEA会给出合适的解决方法。印象深刻的是我一个程序处理完异常一共用了五六个”Try Catch“,但不得不说是真的好用!

(3)在测试程序时,IDEA经常去运行项目中其他的test程序,许多测试程序第一次运行都无法成功,运行的是其他test程序。。。

解决过程:重新创建一个项目,将之前的test程序转移,再测试当前的test程序。

(事实上,运行其他test程序的原因是两个程序调用了同一个类的方法,所以给类取名时一定要有区分!做一个实验结束后最好开一个项目或者类名要区分清楚。)

4.其他(感悟、思考)

本次实验,第一次使用了IDEA集成开发环境。不得不说集成开发环境编程效率要高出不少,解决问题的效率也大幅提升,不得不感叹与集成开发环境的伟大orz

这一次实验量较大,实验难度也较大,例如多态的程序就包含了很多个类。不得不说这实在让人痛苦,不过希望自己痛苦过后也能有相应的收获。总而言之,这几天的实验过程让我对Java的掌握程度更进一步,感觉还是很有意义的。

不过就是,,,,有亿点点多,有亿点点难。。。

 

 5.参考资料。

CSDN,云班课相关资料。

posted @ 2021-10-12 18:21  20202302吉相融  阅读(87)  评论(0编辑  收藏  举报