20145314郑凯杰 《Java程序设计》实验二 实验报告
20145314郑凯杰 《Java程序设计》实验二 实验报告
实验要求
- 完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导
- 严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。
- 先在实验楼中的~/Code目录中用自己的学号建立一个目录,代码和UML图要放到这个目录中,截图中没有学号的会要求重做,然后跟着下面的步骤练习。
实验内容
- 初步掌握单元测试和TDD
- 理解并掌握面向对象三要素:封装、继承、多态
- 初步掌握UML建模
- 熟悉S.O.L.I.D原则
- 了解设计模式
实验知识点
TDD的一般步骤如下:
- 明确当前要完成的功能,记录成一个测试列表
- 快速完成编写针对此功能的测试用例
- 测试代码编译不通过(没产品代码呢)
- 编写产品代码
- 测试通过
- 对代码进行重构,并保证测试通过(重构下次实验练习)
- 循环完成所有功能的开发
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,依赖倒置原则)
实验步骤
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的编码节奏是:
- 增加测试代码,JUnit出现红条
- 修改产品代码
- JUnit出现绿条,任务完成
三、面向对象三要素
面向对象(Object-Oriented)的三要素包括:封装、继承、多态。
练习
1.练习题目:使用TDD的方式设计关实现复数类Complex。
相关代码:定义的复数complex
复数类ComplexNumber的属性
- m_dRealPart: 实部,代表复数的实数部分
- m_dImaginPart: 虚部,代表复数的虚数部分
- 2)复数类ComplexNumber的方法
- ComplexNumber() 构造函数,将实部,虚部都置为0
- ComplexNumber(double r, double I) 构造函数,创建复数对象的同时完成复数的实部,虚部的初始化
- GetRealPart() 获取实部
- GetImaginaryPart() 获取虚部
- SetRealPart(double d) 设置实部
- SetImaginaryPart(double d) 设置虚部
- ComplexAdd(ComplexNumber c) 复数相加
- ComplexAdd(double c) 复数相加
- ComplexMinus(ComplexNumber c) 复数相减
- ComplexMinus(double c) 复数相减
- ComplexMulti(ComplexNumber c) 复数相乘
- ComplexMulti(double c) 复数相乘
- 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程序设计》实验二 实验报告的更多相关文章
- 20145314郑凯杰 《Java程序设计》实验三 敏捷开发与XP实践实验报告
20145314郑凯杰 <Java程序设计>实验二 实验报告 实验要求 完成实验.撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用 ...
- 20145314郑凯杰 《Java程序设计》实验五 实验报告
20145314郑凯杰 <Java程序设计>实验五 实验报告 实验搭档王亦徐:http://www.cnblogs.com/1152wyx/p/5471524.html 实验要求 完成实验 ...
- 20145314郑凯杰 《Java程序设计》实验四 实验报告
20145314郑凯杰 <Java程序设计>实验四 实验报告 实验要求 完成实验.撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用 ...
- 20145314郑凯杰 《Java程序设计》实验一 Java开发环境的熟悉(Windows + Eclipse)实验报告
20145314郑凯杰 <Java程序设计>实验一 Java开发环境的熟悉(Windows + Eclipse)实验报告 实验要求 •使用JDK编译.运行简单的Java程序: •使用Ecl ...
- 20145314郑凯杰 《Java程序设计》第10周学习总结
20145314郑凯杰 <Java程序设计>第10周学习总结 代码托管: 学习内容总结 网络编程 会打手机吗? 第一个问题:会打手机吗?很多人可能说肯定会啊,不就是按按电话号码,拨打电话嘛 ...
- 20145314郑凯杰 《Java程序设计》课程总结
20145314郑凯杰 <Java程序设计>课程总结 每周读书笔记链接汇总 ①寒假预习--"helloworld" ②第一周读书笔记 ③第二周读书笔记 ④第三周读书笔记 ...
- 20145314郑凯杰 《Java程序设计》第7周学习总结
20145314郑凯杰 <Java程序设计>第7周学习总结 教材学习内容总结 首先放上代码托管图片和本地代码图片: 插图4: 插图5: 插图6: 第十三章 时间与日期 13.1 认识时间与 ...
- 20145314郑凯杰 《Java程序设计》第3周学习总结
20145314郑凯杰 <Java程序设计>第3周学习总结 所有代码均已托管 地址https://git.oschina.net/qiaokeli26/codes 按照下面程序结果中的代码 ...
- 20145314郑凯杰 《Java程序设计》第8周学习总结
20145314郑凯杰 <Java程序设计>第8周学习总结 教材学习内容总结 代码已托管 第十五章 通用API ①日志: 日志对信息安全意义重大,审计.取证.入侵检测等都会用到日志信息 使 ...
随机推荐
- cx_Oracle在sublime text里运行遇到 ImportError错误解决办法
如果你装完cx_Oracle之后,命令行运行没错,但是在sublime text里运行, 就遇到这个错误: ImportError: dlopen(/Library/Python/2.7/site-p ...
- spring could Windows打包构建docker镜像到linux
工程模拟参考:http://blog.csdn.net/forezp/article/details/70198649 一.工程结构 二.Pom配置 <build> <plugins ...
- 160531、SQL优化-索引
SQL优化有很多方法,今天来说一说数据库索引. 举例说明: 假设有一个图书Book表,里面有字段id,name, isbn等.如果图书数量巨大的话,我们通过isbn查询通常是比较慢的. 添加数据库索引 ...
- 回车(CR)换行(LF)的来历及区别
转自https://blog.csdn.net/lw370481/article/details/8229344 一.回车”(Carriage Return)和“换行”(Line Feed)起源 回车 ...
- 获取当前文件夹以及子文件夹下所有文件C++
void getFiles( string path,vector<string>& files) { //文件句柄 ; //文件信息 struct _finddata_t fil ...
- CentOS7安装MySQL 5.7
1.源码包下载 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.20.tar.gz 2.编译安装 安装依赖包: y ...
- Flask视图函数与模板语法
1.Django中的CBV模式 2.Flask中的CBV和FBV def auth(func): def inner(*args, **kwargs): result = ...
- 百度NLP一面
C++ : 1.拷贝构造函数和重载=符分别在什么情况下被调用,实现有什么区别 2.虚函数的目的,虚函数和模板类的区别,如何找到虚函数 常规算法: 1. 如何输出一个集合的所有真子集,递归和非递 ...
- java通过URL获取文本内容
原文地址https://www.cnblogs.com/myadmin/p/7634262.html public static String readFileByUrl(String urlStr) ...
- EventFiringWebDriver网页事件监听(一)
Selenium提供了很多的event listening functions来跟踪脚本执行过程中的events. How it works? 在注册了listener的webDriver里面,这些l ...