zoukankan      html  css  js  c++  java
  • 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,在实验代码上新建测试的方法都没有记住,还是熟能生巧吧。
      总助,这次试验比第一次繁琐很多,自己相比第一次花了更多的时间来完成此次试验,收获还是有的!
  • 相关阅读:
    求100内的数和
    汉诺塔(印度传说)
    ORA-06502:PL/SQL:数字或值错误:数值精度太高
    触发器的编写
    mysql改密码
    LeetCode-238 Product of Array Except Self
    LeetCode-236 Lowest Common Ancestor of a Binary Tree
    LeetCode-233 Number of Digit One
    LeetCode-230 Kth Smallest Element in a BST
    LeetCode-229 Majority Element II
  • 原文地址:https://www.cnblogs.com/0630tx/p/8906560.html
Copyright © 2011-2022 走看看