实验3

20182320 2019-2020-1 《数据结构与面向对象程序设计》实验3报告

课程:《程序设计与数据结构》
班级: 1823
姓名: 郑力元
学号:20182320
实验教师:王志强
实验日期:2019年9月27日
必修/选修: 必修

1.实验内容

(1)初步掌握单元测试和TDD

(2)理解并掌握面向对象三要素:封装、继承、多态(自己去学!)

(3)初步掌握UML建模

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

2. 实验过程及结果

2.1 第一个提交点

首先,参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST 完成单元测试的学习,并写出用于检测成绩的类。

代码如下:

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 "错误";
    }
}

因为这里没有构造方法,因此这些代码无法运行。

第二步,编写类的测试代码,并按照实验要求,提交最后三个JUnit测试用例(正常情况,错误情况,边界情况)都通过的截图。

代码如下:

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(-55));
        assertEquals("错误", MyUtil.percentage2fivegrade(105));
    }
    @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));
    }
}

运行结果如下:

2.2 第二个提交点

第一步,参考 积极主动敲代码,使用JUnit学习Java,以TDD的方式研究学习StringBuffer。

用普通测试方法探究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());
         }
}

运行结果如下:

用TDD探究StringBuffer,代码如下:

import junit.framework.TestCase;

public class StringBufferDemoTest extends TestCase {
    StringBuffer a = new StringBuffer("qwerabcdhij");
    StringBuffer b = new StringBuffer("qwer12345678910");
    StringBuffer c = new StringBuffer("tiyioyuoiyu");

    public void testcharAt() throws Exception{
        assertEquals('q',a.charAt(0));
        assertEquals('1',b.charAt(4));
        assertEquals('o',c.charAt(4));
    }

    public void testcapacity() throws Exception{
        assertEquals(27,a.capacity());
        assertEquals(31,b.capacity());
        assertEquals(27,c.capacity());
    }

    public void testlength() throws Exception{
        assertEquals(11,a.length());
        assertEquals(15,b.length());
        assertEquals(11,c.length());
    }

    public void testindexOf() throws Exception{
        assertEquals(0,a.indexOf("qwer"));
        assertEquals(4,b.indexOf("123"));
        assertEquals(5,c.indexOf("yuo"));
    }
}

运行结果如下:

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)

代码如下:

public class Complex{
    private double RealPart;
    private double ImagePart;

        //构造函数
        public Complex(){}
        public Complex(double R,double I){
            RealPart=R;
            ImagePart=I;
        }

        //返回
        public double getRealPart(){
        return RealPart;
        }

        public double getImagePart(){
        return ImagePart;
        }

        //接收
        public void setRealPart(double realPart){
            RealPart=realPart;
        }

        public void setImagePart(double imagePart){
            ImagePart=imagePart;
        }

        //重写函数toString
        public String toString(){
            return "Complex{" +
            "RealPart=" + RealPart +
            ", ImagePart=" + ImagePart +
            '}';
        }
        public boolean equals(Object a){
            if (a==this){
                return true;
        }
            else{
                return false;
        }
        }

        // 定义公有方法:加减乘除
        public Complex ComplexAdd(Complex a){
            Complex b = new Complex(this.RealPart+a.RealPart,this.ImagePart+a.ImagePart);
            return b;
        }
        public Complex ComplexSub(Complex a){
            Complex b = new Complex(this.RealPart-a.RealPart,this.ImagePart-a.ImagePart);
            return b;
        }
        public Complex ComplexMulti(Complex a){
            Complex b = new Complex(this.RealPart*a.RealPart-this.ImagePart*a.ImagePart,this.ImagePart*a.RealPart+this.RealPart*a.ImagePart);
            return b;
        }
        public Complex ComplexDiv(Complex a){
            double scale = a.getRealPart()*a.getRealPart() + a.getImagePart()*a.getImagePart();
            Complex b = new Complex(a.getRealPart() / (a.getRealPart()*a.getRealPart() + a.getImagePart()*a.getImagePart()),
            - a.getImagePart() / (a.getRealPart()*a.getRealPart() + a.getImagePart()*a.getImagePart()));
            return this.ComplexMulti(b);
        }
}

第二步,编写测试代码。

代码如下:

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


public class ComplexTest extends TestCase {
    Complex a=new Complex(8.0,4.0);
    Complex b=new Complex(-4.0,2.0);
    @Test
    public void testComplexAdd() {
        assertEquals(4.0, a.ComplexAdd(b).getRealPart());
        assertEquals(6.0,a.ComplexAdd(b).getImagePart());
    }
    @Test
    public void testComplexSub() {
        assertEquals(12.0, a.ComplexSub(b).getRealPart());
        assertEquals(2.0,a.ComplexSub(b).getImagePart());
    }
    @Test
    public void testComplexMulti() {System.out.println(a.ComplexMulti(b).getImagePart());
        assertEquals(-40.0, a.ComplexMulti(b).getRealPart());
        assertEquals(0.0,a.ComplexMulti(b).getImagePart());
    }
    @Test
    public void testComplexDiv() {
        assertEquals(-1.2000000000000002, a.ComplexDiv(b).getRealPart());
        assertEquals(-1.6,a.ComplexDiv(b).getImagePart());
    }
}

结果如下:

2.5 第五个提交点

第一步:参考 https://www.cnblogs.com/rocedu/p/4472842.html 中的UML建模规范,对某一自编写的类的代码进行建模。

编写类的代码如下:

public class Complex{
    private double RealPart;
    private double ImagePart;

        //构造函数
        public Complex(){}
        public Complex(double R,double I){
            RealPart=R;
            ImagePart=I;
        }

        //返回
        public double getRealPart(){
        return RealPart;
        }

        public double getImagePart(){
        return ImagePart;
        }

        //接收
        public void setRealPart(double realPart){
            RealPart=realPart;
        }

        public void setImagePart(double imagePart){
            ImagePart=imagePart;
        }

        //重写函数toString
        public String toString(){
            return "Complex{" +
            "RealPart=" + RealPart +
            ", ImagePart=" + ImagePart +
            '}';
        }
        public boolean equals(Object a){
            if (a==this){
                return true;
        }
            else{
                return false;
        }
        }

        // 定义公有方法:加减乘除
        public Complex ComplexAdd(Complex a){
            Complex b = new Complex(this.RealPart+a.RealPart,this.ImagePart+a.ImagePart);
            return b;
        }
        public Complex ComplexSub(Complex a){
            Complex b = new Complex(this.RealPart-a.RealPart,this.ImagePart-a.ImagePart);
            return b;
        }
        public Complex ComplexMulti(Complex a){
            Complex b = new Complex(this.RealPart*a.RealPart-this.ImagePart*a.ImagePart,this.ImagePart*a.RealPart+this.RealPart*a.ImagePart);
            return b;
        }
        public Complex ComplexDiv(Complex a){
            double scale = a.getRealPart()*a.getRealPart() + a.getImagePart()*a.getImagePart();
            Complex b = new Complex(a.getRealPart() / (a.getRealPart()*a.getRealPart() + a.getImagePart()*a.getImagePart()),
            - a.getImagePart() / (a.getRealPart()*a.getRealPart() + a.getImagePart()*a.getImagePart()));
            return this.ComplexMulti(b);
        }
}

测试代码如下:

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


public class ComplexTest extends TestCase {
    Complex a=new Complex(8.0,4.0);
    Complex b=new Complex(-4.0,2.0);
    @Test
    public void testComplexAdd() {
        assertEquals(4.0, a.ComplexAdd(b).getRealPart());
        assertEquals(6.0,a.ComplexAdd(b).getImagePart());
    }
    @Test
    public void testComplexSub() {
        assertEquals(12.0, a.ComplexSub(b).getRealPart());
        assertEquals(2.0,a.ComplexSub(b).getImagePart());
    }
    @Test
    public void testComplexMulti() {System.out.println(a.ComplexMulti(b).getImagePart());
        assertEquals(-40.0, a.ComplexMulti(b).getRealPart());
        assertEquals(0.0,a.ComplexMulti(b).getImagePart());
    }
    @Test
    public void testComplexDiv() {
        assertEquals(-1.2000000000000002, a.ComplexDiv(b).getRealPart());
        assertEquals(-1.6,a.ComplexDiv(b).getImagePart());
    }
}

根据以上代码建模,图如下:

3. 实验过程中遇到的问题和解决过程

在使用IDEA的Git功能时,遇到许多困难与阻碍,并且由于当时解决问题心情急切,没有截图。

  • 问题1:在使用Git上传代码的时候,右下角弹窗提示上传被拒绝。目前原因未知。
  • 问题1解决方案:
    首先,将本地的代码库删除并提前备份代码。

其次,将码云上的代码重新clone至本地。

最后,将备份好的代码复制到本地的库中,再一起上传。

  • 问题2:在使用IDEA时,环境设置比较复杂,很多配置需要手动设置,例如生成.class文件的路径、手动设置源代码文件夹和测试文件夹等等。
  • 问题2解决方案:参考 https://www.cnblogs.com/rocedu/p/4472842.html ,但是有许多图片无法加载,所提供的帮助有限。

其他(感悟、思考等)

虽然集成开发环境IDEA很强大,但是它的强大建立在我们熟练运用的基础上。因此我们要认真阅读IDEA的使用教程,充分利用它的优势为我们编写代码提供便利。

参考资料

原文地址:https://www.cnblogs.com/leonzheng/p/11602196.html