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


    20165327《Java程序设计》实验二 《Java面向对象程序设计》实验报告

    实验二 《Java面向对象程序设计》

    一、实验报告封面

    课程:Java程序设计 班级:1653 姓名:杨靖涛 学号:20165327

    指导教师:娄嘉鹏 实验日期:2018.4.15

    实验时间:15:35 - 17:50 实验序号:

    实验名称:Java面向对象程序设计

    提交最后三个测试用例都通过的截图,截图上要有画图加水印,输入自己的学号。
    实验要求:
    1.没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程;
    2.完成实验、撰写实验报告,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等);
    3.实验报告中统计自己的PSP(Personal Software Process)时间;
    4.严禁抄袭。

    实验内容与步骤

    参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST
    参考http://www.cnblogs.com/rocedu/p/6736847.html
    提交点一:在一个MyUtil类中解决一个百分制成绩转成“优、良、中、及格、不及格”五级制成绩的功能。

    首先要明确程序要实现什么功能?要实现这些功能需要哪些操作?
    伪代码从意图层面来解决问题。最终,伪代码是产品代码最自然的、最好的注释。因此,可以利用伪代码来明确以上这些要求。
    注:伪代码与具体编程语言无关,不要写与具体编程语言语法相关的语句。

    伪代码

    • 百分制转五分制:
      如果成绩小于60,转成“不及格”
      如果成绩在60与70之间,转成“及格”
      如果成绩在70与80之间,转成“中等”
      如果成绩在80与90之间,转成“良好”
      如果成绩在90与100之间,转成“优秀”
      其他,转成“错误”

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

    2.给新建好的test设置环境变量,也就是让IDEA知道这里存的是测试代码。在test上右击然后MakeDirectoryas之后选择testSourceRoot,这样就把这个文件夹设置成了存放测试代码的源文件的文件夹:

    3.如下图:创建测试类,在test目录中编写测试代码MyUtilTest,其中的测试用例分为测试正常testNormal测试边界testBoundary测试异常testException三部分:

    可利用以下测试代码对写成的产品代码进行测试,检查是否有不完善的地方。

    测试代码

    
    import junit.framework.TestCase;
    import org.junit.Test;
    
    import static org.junit.Assert.*;
    
    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 testException(){
            assertEquals("错误",MyUtil.percentage2fivegrade(-58));
            assertEquals("错误",MyUtil.percentage2fivegrade(118));
        }
        @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));
        }
    }
    

    运行截图:

    提交点二:以TDD的方式研究学习StringBuffer

    对老师给的StringBufferDemo产品代码进行改写,并写出StringBuffer中的charAtlengthcapcity这几个方法对应的测试代码进行测试。

    按照老师给的参考代码中StringBufferDemo中调用的方法,将其更改为我的产品代码。

    产品代码:

    public class StringBufferDemo{
        StringBuffer buffer = new StringBuffer();
        public StringBufferDemo(StringBuffer buffer){
            this.buffer = buffer;
        }
        public Character charAt(int i){
            return buffer.charAt(i);
        }
        public int capacity(){
            return buffer.capacity();
        }
        public int length(){
            return buffer.length();
        }
        public int indexOf(String buf) {
            return buffer.indexOf(buf);
        }
    }
    
    • 首先要理解以上代码中的方法。通过查询API文档,可知:
      • charAt(int i):返回此序列中指定索引处的 char 值。第一个 char 值在索引 0 处,第二个在索引 1 处,依此类推,这类似于数组索引。

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

      • capacity():返回当前容量。容量指可用于最新插入的字符的存储量,超过这一容量就需要再次进行分配。

      • length():返回子浮窗的长度。

    了解以上方法之后,需要编写测试代码对它们进行测试。
    测试代码:

    import junit.framework.TestCase;
    import org.junit.Test;
    
    public class StringBufferDemoTest extends TestCase {
        StringBuffer string1 = new StringBuffer("Students");
        StringBuffer string2 = new StringBuffer("Students of class 1653");
        StringBuffer string3 = new StringBuffer("Students of class 1653 and class 1652");
        @Test
        public void testCharAt() throws Exception{
            assertEquals('t',string1.charAt(1));
            assertEquals(' ',string2.charAt(8));
            assertEquals('1',string3.charAt(18));
        }
        @Test
        public void testCapacity() throws Exception{
            assertEquals(24,string1.capacity());
            assertEquals(38,string2.capacity());
            assertEquals(53,string3.capacity());
        }
        @Test
        public void testindexOf() throws Exception{
            assertEquals(1, string1.indexOf("tud"));
            assertEquals(8, string2.indexOf(" of"));
            assertEquals(18, string3.indexOf("1653"));
        }
        @Test
        public void testlength() throws Exception{
            assertEquals(8, string1.length());
            assertEquals(22, string2.length());
            assertEquals(37, string3.length());
        }
    }
    

    运行截图

    提交点三:
    参考(http://www.cnblogs.com/rocedu/p/4472842.html)

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

    对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式
    用自己的学号%6进行取余运算,根据结果进行代码扩充:
    3: 让系统支持Long类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
    代码:

    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 {
     	    int value;
     	    Long() {
     	        value=20165327;
     	    }
     	    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();
     	    }
     	}
     	
     	//Client classes
     	class 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 LongFactory());
     	        d.DisplayData();
     	   }
     	}
     	
    

    运行截图

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

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

    任务:以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)
    

    代码:

    import junit.framework.TestCase;
    import org.junit.Test;
    
    public class ComplexTest extends TestCase {
        Complex a = new Complex(5.0, 6.0);
        Complex b = new Complex(-3.0, 4.0);
    
        @Test
        public void testgetRealPart() {
            assertEquals(5.0,a.getRealPart());
            assertEquals(-3.0,b.getRealPart());
        }
    
        @Test
        public void testgetImagePart() {
            assertEquals(6.0,a.getImagePart());
            assertEquals(4.0,b.getImagePart());
        }
    
        @Test
        public void testtoString() {
            assertEquals("Complex{RealPart=5.0, ImagePart=6.0}",a.toString());
            assertEquals("Complex{RealPart=-3.0, ImagePart=4.0}",b.toString());
        }
    
        @Test
        public void testequals() {
            assertEquals(false,a.equals(b));
            Complex c = new Complex(a.getRealPart(),a.getImagePart());
            assertEquals(true,a.equals(c));
        }
    
        @Test
        public void testComplexAdd() {
            assertEquals(2.0,a.ComplexAdd(b).getRealPart());
            assertEquals(10.0,a.ComplexAdd(b).getImagePart());
        }
    
        @Test
        public void testComplexSub() {
            assertEquals(8.0,a.ComplexSub(b).getRealPart());
            assertEquals(2.0,a.ComplexSub(b).getImagePart());
        }
    
        @Test
        public void testComplexMulti() {
            assertEquals(-39.0,a.ComplexMulti(b).getRealPart());
            assertEquals(2.0,a.ComplexMulti(b).getImagePart());
        }
    
        @Test
        public void testComplexDiv() {
            assertEquals(0.36,a.ComplexDiv(b).getRealPart());
            assertEquals(-1.52,a.ComplexDiv(b).getImagePart());
        }
    }
    

    运行截图


    提交点五
    使用WhiteStarUML对实验二中的代码进行建模,发类图的截图,加上学号水印。
    参考http://www.cnblogs.com/rocedu/p/6736847.html

    提交点五
    使用WhiteStarUML对实验二中的代码进行建模,发类图的截图,加上学号水印。
    参考http://www.cnblogs.com/rocedu/p/6736847.html

    类图中只少两个类。

    实验时间分配

    步骤 耗时 百分比
    需求分析 20 14.3%
    设计 50 35.7%
    代码实现 30 21.4%
    测试 20 14.3%
    分析总结 20 14.3%
  • 相关阅读:
    Python基础入门教程
    【前端学习笔记】2015-09-11~~~~ js中ajax请求返回案例
    【前端学习笔记】2015-09-10~~~~ css层叠样式表~~格式
    【前端学习笔记】2015-09-09~~~~nodejs中的require()和module.exports
    【前端学习笔记】2015-09-08~~~~ 关于切图的简单方法
    【前端学习笔记】2015-09-06 ~~~~ setAttribute()、slice()
    【前端学习笔记】2015-09-02 附~~~~~ajax简单请求和获得响应结果
    【前端学习笔记】2015-09-02~~~~ 关于filter()匹配的使用
    【前端学习笔记】2015-09-01 附二 关于jq选择器的简单运用
    【前端学习笔记】2015-09-01 附 split()方法、readyState
  • 原文地址:https://www.cnblogs.com/yjtblog/p/8885629.html
Copyright © 2020-2023  润新知