2017-2018-2 20165221实验二《Java面向对象程序设计》实验报告

JAVA实验二报告

课程:Java程序设计
姓名:谭笑
学号:20165221 实验时间:2018.4.13--2018.4.15

实验2--1

实验内容

实现百分制成绩转成“优、良、中、及格、不及格”五级制成绩的功能

提交要求

提交最后三个测试用例都通过的截图,截图上要有画图加水印,输入自己的学号。

实验具体操作
  • 先通过思考产生伪代码,再选择用Java语言描述,即产生了产品代码
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 "错误";
    }
}
  • 写测试代码
    正常值,错误值,边界值,三个角度对代码进行测试
    (
    在对边界值的错误进行测试时,发现了一个bug,即在判断优秀时,未将100包含在内。

    然后,我修改了产品代码,做了如下改动

    此时再运行测试用例,显示正常

但是就上图如果真的出现test failed,想要解决的话,则需要新建测试,具体操作见下

重新编写测试代码

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--2

实验内容

以TDD的方式研究学习StringBuffer

实验操作

StringBuffer( ):分配16个字符的缓冲区

length():返回字符串的长度

harAt(int i) :返回此序列中指定索引处的 char 值。第一个 char 值在索引 0 处,第二个在索引 1 处,依此类推

indexOf(String s):返回输入的子字符串的第一个字母在母字符串的位置

capacity():返回string分配的存储容量

  • 然后自己设置了几个长度不同的字符串进行测试
    我按照自己的学号设置了字符串5221xuexijava,在增长代码长度时,选择了重复上述字符串,测试代码如下

实验代码

import org.junit.Test;
import junit.framework.TestCase;
public class StringBufferDemoTest extends TestCase {
    StringBuffer a = new StringBuffer("5221xuexijava");
    StringBuffer b = new StringBuffer("5221xuexijava5221xuexijava");
    StringBuffer c = new StringBuffer("5221xuexijava5221xuexijava5221xuexijava");

    @Test
    public void testcharAt() throws Exception {
        assertEquals('u', a.charAt(5));
        assertEquals('2', c.charAt(1));
        assertEquals('j', c.charAt(9));
    }

    @Test
    public void testcapacity() throws Exception {
        assertEquals(29, a.capacity());
        assertEquals(55, c.capacity());
        assertEquals(55, c.capacity());

    }

    @Test
    public void testlength() throws Exception {
        assertEquals(13, a.length());
        assertEquals(39, c.length());
        assertEquals(39, c.length());
    }
}
  • 其运行结果如下:

实验2-3

实验内容

对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式
用自己的学号%6进行取余运算

  • 0:让系统支持Byte类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印

  • 让系统支持Short类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印

  • 让系统支持Boolean类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印

  • 让系统支持Long类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印

  • 让系统支持Float类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印

  • 让系统支持Double类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印

实验操作

我选择第一个:即支持byte类,实验代码如下:

import java.util.Objects;
abstract class Data {
    abstract public void DisplayValue();
}
class Integer extends Data {
    int value;
    Integer() {
        value=100;
    }
    public void DisplayValue(){
        System.out.println (value);
    }
}
class Long extends Data {
    long value;
    Long() {
        value=(long)20165221;
    }
    public void DisplayValue(){
        System.out.println (value);
    }
}
class Byte extends Data {//Byte继承Data类
    byte value;
    Byte() {
        value=(byte)20165221;
    }
    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 LongFactory extends Factory {
    public Data CreateDataObject(){
        return new Long();
    }
}
class ByteFactory extends Factory {//ByteFactory继承工厂类
    public Data CreateDataObject(){
        return new Byte();
    }
}
//Client classes
class Document {
    Data data;
    Document(Factory factory){
        data = factory.CreateDataObject();
    }
    public void DisplayData(){
        data.DisplayValue();

    }
}
public class StringBufferDemoTest {
    static Document d;
    static Document c;
    public static void main(String[] args) {
        d = new Document(new ByteFactory());
        d.DisplayData();
        c = new Document(new LongFactory());
        c.DisplayData();
    }
}

测试代码如下:


import static org.junit.Assert.*;
import org.junit.Test;
import junit.framework.TestCase;
public class ComplexTest  extends TestCase {
    Complex complex = new Complex(1,1);
    @Test
    public void testAdd(){
        assertEquals(new Complex(2.0,1.6), complex.ComplexAdd(new Complex(5.2,2.1)));
    }
    //测试加法
    @Test
    public void testSub()
        assertEquals(new Complex(-2.0,-1.6), complex.ComplexSub(new Complex(5.2,3.0)));
    }
    //测试减法
    @Test
    public void testMulti(){
        assertEquals(new Complex(3.0,2.0), complex.ComplexMulti(new Complex(3.0,2.0)));
    }
    //测试乘法
    @Test
    public void testDiv(){
        assertEquals(new Complex(1.0,1.0), complex.ComplexDiv(new Complex(1.0,1.0)));
        assertEquals(new Complex(0.0,0.0), complex.ComplexDiv(new Complex(1.0,0.0)));
        //assertEquals(new Complex(0.0,0.0), complex.ComplexDiv(new Complex(3,4)));
        //边缘测试
    }
    @Test
    public void testequals(){
        assertEquals(true, complex.equals(new Complex(1.0,1.0)));
    }
    //测试判断相等
}

运行结果如下:

实验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)属性:复数包含实部和虚部两个部分,
      double RealPart;复数的实部
      double ImagePart;复数的虚部
      getRealPart():返回复数的实部
      getImagePart();返回复数的虚部
      setRealPart():设置复数的实部
      setImagePart();设置复数的虚部
      输出形式:a+bi
      
(2)方法:
       ①定义构造函数
       public Complex()
       public Complex(double R,double I)
       ②定义公有方法:加减乘除
       Complex ComplexAdd(Complex a):实现复数加法
       Complex ComplexSub(Complex a):实现复数减法
       Complex ComplexMulti(Complex a):实现复数乘法
       Complex ComplexDiv(Complex a):实现复数除法
       Override Object
       public String toString():将计算结果转化为字符串形式并输出
       
  • 给出实验代码
public class Complex {
    // 定义属性并生成getter,setter
    private double RealPart;
    private double ImagePart;
    // 定义构造函数
    public Complex(){

    }
    public Complex(double R, double I){
        this.RealPart = R;
        this.ImagePart = I;
    }

    public double getRealPart() {
        return RealPart;
    }

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

    public double getImagePart() {
        return ImagePart;
    }

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

    //Override Object
    public boolean equals(Object obj){
        if(this == obj) {
            return true;
        }
        if(!(obj instanceof Complex)) {
            return false;
        }
        Complex complex = (Complex) obj;
        if(complex.RealPart != ((Complex) obj).RealPart) {
            return false;
        }
        if(complex.ImagePart != ((Complex) obj).ImagePart) {
            return false;
        }

        return true;
    }
    public String toString()   {
        String string = "";
        if (ImagePart > 0)
            string =  RealPart + "+" + ImagePart + "i";
        if (ImagePart == 0)
            string =  RealPart + "";
        if (ImagePart < 0)
            string = RealPart + " " + ImagePart + "i";
        return string;
    }

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

}
  • 再给出测试代码
import static org.junit.Assert.*;
import org.junit.Test;
import junit.framework.TestCase;
public class ComplexTest extends TestCase {
    Complex complex = new Complex(1,1);
    @Test
    public void testAdd(){
        assertEquals(new Complex(2.0,1.6), complex.ComplexAdd(new Complex(5.2,3.0)));
    }
    //测试加法
    @Test
    public void testSub(){
        assertEquals(new Complex(-2.0,-1.6), complex.ComplexSub(new Complex(5.2,3.0)));
    }
    //测试减法
    @Test
    public void testMulti(){
        assertEquals(new Complex(3.0,2.0), complex.ComplexMulti(new Complex(3.0,2.0)));
    }
    //测试乘法
    @Test
    public void testDiv(){
        assertEquals(new Complex(1.0,1.0), complex.ComplexDiv(new Complex(1.0,1.0)));
        assertEquals(new Complex(0.0,0.0), complex.ComplexDiv(new Complex(1.0,0.0)));
        //assertEquals(new Complex(0.0,0.0), complex.ComplexDiv(new Complex(3,4)));
        //边缘测试
    }
    @Test
    public void testequals(){
        assertEquals(true, complex.equals(new Complex(1.0,1.0)));
    }
    //测试判断相等
}

使用StarUML对实验二中的代码进行建模

存在的问题解决

  • 在找until的位置,配置时,自己开始找不到,最后倒回去看博客,下载了everything,查找,
    通过最终找到适配成功!
  • 在进行实验2-2设置字符串时,我看给的例子的字符串都是英文字母,自己换成了英文字母加自己学号的设置,就是要注意字符所占的长度
  • 在使用markdown在线编辑时,自己在有道云上能够顺利编译,但是粘贴到博客园上,就出现下面代码格式错误的问题,


文字描述



即把中间的文字部分代码化了,后来通过调整排版才解决。

总结

这次试验自己做的还是很认真的,也花了很多时间,测试代码都是根据实例代码,然后按照要求,改成包含自己学号信息的格式编译运行的!这次的收获应该算不小了,因为上周修过一次电脑,所有东西都重装了,自己也从jdk配置开始,又重头学习了一遍idea,及整个实验。
但是还有很多不足:

  • 比如实验2--2成绩判定的程序,其实有很多个测试方面,除了边界值,临界值,输出错误等,自己并没有想到新的角度只是按照老师给的方向,进行了测试。
  • 对idea的操作还不是很熟悉,重装了idea后,自己操作时,发现很多步骤,比如新建test,在实验代码上新建测试的方法都没有记住,还是熟能生巧吧。
    总助,这次试验比第一次繁琐很多,自己相比第一次花了更多的时间来完成此次试验,收获还是有的!
posted @ 2018-04-22 14:34  呼噜噜。。  阅读(297)  评论(0编辑  收藏  举报