zoukankan      html  css  js  c++  java
  • 20175325 《JAVA程序设计》实验二《JAVA开发环境的熟悉》实验报告

    20175325 《JAVA程序设计》实验二《JAVA开发环境的熟悉》实验报告

    一、实验报告封面
    课程:Java程序设计 班级:1753班 姓名:石淦铭 学号:20175325

    指导教师:娄嘉鹏 实验日期:2018年4月17日

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

    实验目的与要求:
    1、完成实验、撰写实验报告,注意实验报告重点是运行结果,遇到的问题以及分析。
    2、实验报告中统计自己的PSP(Personal Software Process)时间;
    3、掌握使用IDEA完成基础编程与程序调试的能力。

    二、实验内容及步骤
    (一)、实验一:

    • 实验目的与要求:
    1. 参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST 完成单元测试的学习
    2. 提交最后三个JUnit测试用例(正常情况,错误情况,边界情况)都通过的截图,截图上要有画图加水印,输入自己的学号
    3. 本提交点考查JUnit会不会使用,测试用例至少要包含正常情况,错误情况,边界情况的测试
    • 实验内容及结果截图
      • 三种代码:

    伪代码:从意图层面来解决问题,表达自己思路的框架
    产品代码:用特定编程语言将伪代码翻译成产品代码
    测试代码:测试产品代码

    1、伪代码:是产品代码最自然的、最好的注释

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

    2、产品代码

    public class MyUtil{
       public static String percentage2fivegrade(int grade){
           //如果成绩小于60,转成“不及格”
           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 "优秀";
           //其他,转成“错误”
           else 
               return "错误";
       }
    }
    

    3、测试代码

    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(55));
            assertEquals("不及格",MyUtil.percentage2fivegrade(55));
        }
        @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));
        }
    }
    

    4、实验截图:
    如果出现问题,JUnit会出现红条,IDEA会提示哪一个测试用例出现问题,由此可以对应改正产品代码中的问题,直到JUnit出现绿条,任务完成。

    (二)、实验二:

    • 实验目的与要求:
      1、参考 积极主动敲代码,使用JUnit学习Java (http://www.cnblogs.com/rocedu/p/4837092.html)
      2、以 TDD的方式研究学习StringBuffer
      3、提交你的单元测试用例和测试通过的截图,截图要加上学号水印
      4、测试自己会不会写JUnit测试用例
    • 实验内容及结果截图:
      • TDD的一般步骤如下:

    明确当前要完成的功能,记录成一个测试列表
    快速完成编写针对此功能的测试用例
    测试代码编译不通过(没产品代码呢)
    编写产品代码
    测试通过
    对代码进行重构,并保证测试通过(重构下次实验练习)

    测试运行截图:

    (三)、实验三:

    • 实验目的与要求:
      1、参考实验二 Java面向对象程序设计
      对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式
      2、用自己的学号%6进行取余运算,根据结果进行代码扩充:

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

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

    • 实验内容及结果截图:

    1、S.O.L.I.D类设计原则是一个很好的指导:

    • SRP(Single Responsibility Principle,单一职责原则)
    • OCP(Open-Closed Principle,开放-封闭原则)
    • LSP(Liskov Substitusion Principle,Liskov替换原则)
    • ISP(Interface Segregation Principle,接口分离原则)
    • DIP(Dependency Inversion
    • Principle,依赖倒置原则)

    2、OCP是OOD中最重要的一个原则,OCP的内容是:

    • software entities (class, modules, function, etc.) should open forextension,but closed for modification.
    • 软件实体(类,模块,函数等)应该对扩充开放,对修改封闭。

    3、产品代码

    abstract class Data {
        abstract public void DisplayValue();
    }
    class Integer extends  Data {
        int value;
        Integer() {
            value=100;
        }
        public void DisplayValue(){
            System.out.println (value);
        }
    }
    class Short extends Data {
        short value;
        Short() {
            value = 5325;
        }
        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 ShortFactory extends Factory {
        public Data CreateDataObject(){
            return new Short();
        }
    }
    //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 ShortFactory());
            d.DisplayData();
        }
    }
    

    4、运行截图

    (四)、实验四:

    • 实验目的与要求:
      1、提交:单元测试代码和运行成功截图及码云上代码链接,截图要加上学号水印
      2、任务:以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)
    

    3、产品代码:

    public class Complex {
        // 定义属性并生成getter,setter
        double RealPart;
        double ImagePart;
        // 定义构造函数
        public Complex(){
            RealPart = 0;
            ImagePart = 1;
        }
        public Complex(double R,double I){
            ImagePart = I;
            RealPart = R;
        }
    
        //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);
        }
        Complex ComplexDiv(Complex a) {
            if(a.RealPart==0||a.ImagePart==0) {
                System.out.println("被减数不能为0");
                return new Complex();
            }
    
            double d = Math.sqrt(a.RealPart*a.RealPart)+Math.sqrt(a.ImagePart*a.ImagePart);
            return new Complex((RealPart*a.RealPart+ImagePart*a.ImagePart)/d,Math.round((RealPart*a.ImagePart-ImagePart*a.RealPart)/d));
        }
    }
    

    4、测试代码:

    import junit.framework.TestCase;
    import org.junit.Test;
    public class ComplexTest extends TestCase {
        Complex a=new Complex(1,2);
        Complex b=new Complex(-2,-1);
        Complex c=new Complex(4,-2);
        Complex d=new Complex(4,-2);
        @Test
        public void testequals(){
            assertEquals(false,a.equals(b));
            assertEquals(false,b.equals(c));
            assertEquals(true,c.equals(d));
        }
        @Test
        public void testAdd(){
            assertEquals(new Complex(-1,1),a.ComplexAdd(b));
            assertEquals(new Complex(5,0),a.ComplexAdd(c));
        }
        @Test
        public void testSub(){
            assertEquals(new Complex(3,3),a.ComplexSub(b));
            assertEquals(new Complex(-3,4),a.ComplexSub(c));
        }
        @Test
        public void testMulti(){
            assertEquals(new Complex(0,-5),a.ComplexMulti(b));
            assertEquals(new Complex(8,6),a.ComplexMulti(c));
        }
        @Test
        public void testDiv(){
            assertEquals(new Complex(0,0.5),a.ComplexDiv(c));
            assertEquals(new Complex(-0.3,-0.4),b.ComplexDiv(c));
        }
    }
    

    5、运行结果截图:

    (五)、实验五:

    • 实验目的与要求:
      1、使用StarUML对实验二中的代码进行建模,发类图的截图,加上学号水印
      2、类图中只少两个类
      3、类,继承,接口实现,组合在UML中表达
    • 结果截图:

    三、遇到的困难与解决方法:

    • 问题:使用Junit的时候,import junit.framework.TestCase中的Junit 显示红色。
    • 解决方法:在File 中点击Project Structure ,然后找到Modules 里的Dependencies 添加junit.jarjunit.jar可用everything进行查找。

    四、实验感想:

    • 刚开始的实验中,还不太能明白这些知识,不知道如何具体操作,走了一些弯路,浪费了一些时间,但后来能够慢慢掌握其使用的技巧和知识。
    • 在这次实验里,我学习并掌握了一些Junit的用法,了解并学习了三种代码:伪代码产品代码测试代码,使得在编写程序时的想法得以提升,同时也学到了新的代码编写和测试的方法。

    五、PSP

    步骤 耗时 百分比
    需求分析 10min 10%
    设计 10min 10%
    代码实现 30min 30%
    测试 30min 30%
    分析总结 20min 20%
  • 相关阅读:
    Maven中profile和filtering实现多个环境下的属性过滤
    Java 非法字符: 65279的解决办法
    MySQL军规
    php 时间日期函数
    函数的引入
    linux下修改mysql版本5.7 修改默认字符集
    mysql语句规范
    永久修改mysql提示符
    复杂函数
    函数的特性
  • 原文地址:https://www.cnblogs.com/sgm5/p/10732992.html
Copyright © 2011-2022 走看看