20145314郑凯杰 《Java程序设计》实验二 实验报告

实验要求

  • 完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导
  • 严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。
  • 先在实验楼中的~/Code目录中用自己的学号建立一个目录,代码和UML图要放到这个目录中,截图中没有学号的会要求重做,然后跟着下面的步骤练习。

实验内容

  • 初步掌握单元测试和TDD
  • 理解并掌握面向对象三要素:封装、继承、多态
  • 初步掌握UML建模
  • 熟悉S.O.L.I.D原则
  • 了解设计模式

实验知识点

TDD的一般步骤如下:

  1. 明确当前要完成的功能,记录成一个测试列表
  2. 快速完成编写针对此功能的测试用例
  3. 测试代码编译不通过(没产品代码呢)
  4. 编写产品代码
  5. 测试通过
  6. 对代码进行重构,并保证测试通过(重构下次实验练习)
  7. 循环完成所有功能的开发

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

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

实验步骤

1、单元测试

先写伪代码->再用特定编程语言翻译成产品代码->最后写测试代码

(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)测试代码

public class MyUtilTest {
public static void main(String[] args) {
// 百分制成绩是50时应该返回五级制的“不及格”
if(MyUtil.percentage2fivegrade(50) != "不及格")
System.out.println("test failed!");
else
System.out.println("test passed!");
}
}

在修复BUG之后,最终代码如下:

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

插图5:

接下来由于测试还不够,我们再进行边界测试:

插图6:

出现了这个错误说明100出现问题,再次更改代码之后:

插图7:

第一部分结束

2、TDD(Test Driven Devlopment, 测试驱动开发)

首先新建test文档,我建为text,防复制。

插图1:

接下来新建测试实例:

插图2:

插图3:

再建立test文件,敲入代码:

插图4:

接下来因为咱们还没在src文件夹下建立MyUtil的实例,所以出现编写错误,如下补上:

插图8:

第一次 run as junit test:

插图9:

理所应当地出现了红条。

因此我们对代码进行修改优化,重新录入为:

插图10:

第二次 run as junit test:

插图11:

此时,测试用例通过。

完成TDD模拟练习。

TDD的编码节奏是:

  1. 增加测试代码,JUnit出现红条
  2. 修改产品代码
  3. JUnit出现绿条,任务完成

三、面向对象三要素

面向对象(Object-Oriented)的三要素包括:封装、继承、多态。

练习

1.练习题目:使用TDD的方式设计关实现复数类Complex。

相关代码:定义的复数complex

复数类ComplexNumber的属性

  1. m_dRealPart: 实部,代表复数的实数部分
  2. m_dImaginPart: 虚部,代表复数的虚数部分
  3. 2)复数类ComplexNumber的方法
  4. ComplexNumber() 构造函数,将实部,虚部都置为0
  5. ComplexNumber(double r, double I) 构造函数,创建复数对象的同时完成复数的实部,虚部的初始化
  6. GetRealPart() 获取实部
  7. GetImaginaryPart() 获取虚部
  8. SetRealPart(double d) 设置实部
  9. SetImaginaryPart(double d) 设置虚部
  10. ComplexAdd(ComplexNumber c) 复数相加
  11. ComplexAdd(double c) 复数相加
  12. ComplexMinus(ComplexNumber c) 复数相减
  13. ComplexMinus(double c) 复数相减
  14. ComplexMulti(ComplexNumber c)  复数相乘
  15. ComplexMulti(double c)  复数相乘
  16. toString() 把当前复数对象的实部,虚部组合成a+bi的字符串形式

接下来附上代码:

	package shiyan;

	public class complex {
private double a;
private double b; public void m_dRealPart(double a){
this.a=a;
} public void m_dImaginPart(double b){
this.b=b;
} public String toString(){//分两种方式输出
if(b>=0) return a+"+"+b+"i";
else return a+"-"+-b+"i";
} public complex complexadd(complex x){
complex result = new complex();
result.a=x.a+a;
result.b=x.b+b;
return result;
}
public complex complexminus(complex x){
complex result = new complex();
result.a=a-x.a;
result.b=b-x.b;
return result;
} public complex complexmultiply(complex x){
complex result = new complex();
result.a=x.a*a;
result.b=x.b*b;
return result;
} public complex complexdevide(complex x){
complex result = new complex();
result.a=a/x.a;
result.b=b/x.b;
return result;
}
}

接下来是complextext(防复制)

package shiyan;

public class complextext{
public static void main(String[] args){
complex x=new complex();
complex y=new complex();
complex z=new complex();
complex a=new complex();
complex n=new complex();
complex m=new complex();
x.m_dRealPart(5.0);
x.m_dImaginPart(6.0);//定义两个实部
y.m_dRealPart(2.0);
y.m_dImaginPart(-3.0);//两个虚部
z=x.complexadd(y);
a=x.complexminus(y);
n=x.complexmultiply(y);
m=x.complexdevide(y);
System.out.println(z.toString());
System.out.println(a.toString());
System.out.println(n.toString());
System.out.println(m.toString());
}
}

运行结果:

实验中的问题和解决过程

对于复数类的加减乘除的实现,很快就能用complex实现。在整型的基础上我进行了改进,改进为浮点数型。

但是,在运行过程中,最开始输出代码是这样的:

public String toString(){
return a+"+"+b+"i";
}

即在输出的两个数间插入一个加号。

然而,这种方式的输出一旦遇到虚部是负数时,就会出现+-xi的情况。

于是做出如下改动,分类为三种情况:

	public String toString(){//分两种方式输出
if(b>0) return a+"+"+b+"i";
else {
if(b==0) return "a";
else return a+"-"+-b+"i";
}
}

实验代码托管截图

QQ图片:

其他(感悟、思考等,可选)

第二次的JAVA实验,较第一次更加复杂而且量很大。所以必须得提前预习实验。本次的实验对于程序设计而言是比较简单的,即一个复数类,对其的运算相关结果附上。觉得最近对JAVA的学习,由于学生会工作、团总支工作、大创工作、数据结构实验、密码学实验等报告比较多。慢慢跟不上进度了,一定得好好加强了!

PSP

PSP:

20145314郑凯杰 《Java程序设计》实验二 实验报告的更多相关文章

  1. 20145314郑凯杰 《Java程序设计》实验三 敏捷开发与XP实践实验报告

    20145314郑凯杰 <Java程序设计>实验二 实验报告 实验要求 完成实验.撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用 ...

  2. 20145314郑凯杰 《Java程序设计》实验五 实验报告

    20145314郑凯杰 <Java程序设计>实验五 实验报告 实验搭档王亦徐:http://www.cnblogs.com/1152wyx/p/5471524.html 实验要求 完成实验 ...

  3. 20145314郑凯杰 《Java程序设计》实验四 实验报告

    20145314郑凯杰 <Java程序设计>实验四 实验报告 实验要求 完成实验.撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用 ...

  4. 20145314郑凯杰 《Java程序设计》实验一 Java开发环境的熟悉(Windows + Eclipse)实验报告

    20145314郑凯杰 <Java程序设计>实验一 Java开发环境的熟悉(Windows + Eclipse)实验报告 实验要求 •使用JDK编译.运行简单的Java程序: •使用Ecl ...

  5. 20145314郑凯杰 《Java程序设计》第10周学习总结

    20145314郑凯杰 <Java程序设计>第10周学习总结 代码托管: 学习内容总结 网络编程 会打手机吗? 第一个问题:会打手机吗?很多人可能说肯定会啊,不就是按按电话号码,拨打电话嘛 ...

  6. 20145314郑凯杰 《Java程序设计》课程总结

    20145314郑凯杰 <Java程序设计>课程总结 每周读书笔记链接汇总 ①寒假预习--"helloworld" ②第一周读书笔记 ③第二周读书笔记 ④第三周读书笔记 ...

  7. 20145314郑凯杰 《Java程序设计》第7周学习总结

    20145314郑凯杰 <Java程序设计>第7周学习总结 教材学习内容总结 首先放上代码托管图片和本地代码图片: 插图4: 插图5: 插图6: 第十三章 时间与日期 13.1 认识时间与 ...

  8. 20145314郑凯杰 《Java程序设计》第3周学习总结

    20145314郑凯杰 <Java程序设计>第3周学习总结 所有代码均已托管 地址https://git.oschina.net/qiaokeli26/codes 按照下面程序结果中的代码 ...

  9. 20145314郑凯杰 《Java程序设计》第8周学习总结

    20145314郑凯杰 <Java程序设计>第8周学习总结 教材学习内容总结 代码已托管 第十五章 通用API ①日志: 日志对信息安全意义重大,审计.取证.入侵检测等都会用到日志信息 使 ...

随机推荐

  1. maven仓库加载本地包依赖

    如果有个jar包是我们自己打的,怎么放到maven中呢? 首先在项目里面新建一个lib目录,如果有lib目录则不需要新建,然后放自己的jar包进去,maven的pom.xml配置是: <depe ...

  2. DEDE的搜索页面支持arclist和channelartlist标签的操作方法

    很多朋友在使用dedecms进行网站开发时都会存在这样的问题,那就是dedecms的搜索页(search.php)与我们网站页面的模板的头 部.底部不一样,并且还不支持在搜索页调用其他某一栏目的文档. ...

  3. Spring Security OAuth2 源码分析

    Spring Security OAuth2 主要两部分功能:1.生成token,2.验证token,最大概的流程进行了一次梳理 1.Server端生成token (post /oauth/token ...

  4. OpenGL编程指南第九章:纹理映射

    转自://http://blog.csdn.net/longhuihu/article/details/8477614 纹理(texture)是一块矩形数据序列,存储的数据为颜色.亮度.alpha值. ...

  5. 170406、用uid分库,uname(用户名)上的查询怎么办

    [缘起] 用户中心是几乎每一个公司必备的基础服务,用户注册.登录.信息查询与修改都离不开用户中心. 当数据量越来越大时,需要多用户中心进行水平切分.最常见的水平切分方式,按照uid取模分库: 通过ui ...

  6. angular中的子路由用法

    Angular ui-route的用法 引入angular和使用angular子路由时需要的依赖模块angular-ui-route.js.并且在html中将路由要插入的位置写上.而在js部分中和an ...

  7. hbctf---whatiscanary学习

    题目中除了能栈溢出实在找不到其他能泄露信息的地方了.而且也没法修改GOT表,始终绕不过stack_chk_fail函数.感到无从下手.只到官方给WP了,才觉得自己基础太过浅薄了. 如果我们仔细观察崩溃 ...

  8. Systemd mysql,nginx,php启动配置文件

    systemctl的配置文件目录一般在 /usr/lib/systemd/system/ 或者/etc/systemd/system/ 需要注意的是,nginx与php运行用户必须是root,所以不需 ...

  9. Python 之网络编程

    # 流程描述: # # 1. 服务器根据地址类型(ipv4, ipv6), socket类型, 协议创建socket; # # 2. 服务器为socket绑定ip地址和端口号; # # 3. 服务器s ...

  10. 【keras框架】

    更高级别的封装.更简单的api,以tensorflow.theano为后端,支持更多的平台 读取网络模型后生成网络结构图 读取 from keras.models import load_model ...