20172302 2017-2018-2 《程序设计与数据结构》实验二报告
课程:《程序设计与数据结构》
班级: 1723
姓名: 侯泽洋
学号:20172302
实验教师:王志强老师
实验日期:2018年4月18日
必修/选修: 必修
1.实验内容
-
初步掌握单元测试和TDD
-
理解并掌握面向对象三要素:封装、继承、多态
-
初步掌握UML建模
-
熟悉S.O.L.I.D原则
-
了解设计模式
-
完成蓝墨云上 (1)-(5)实验。
2.实验过程及结果
-
(1).完成5个实验,课上完成两个,课下完成三个。
-
(2).第一个实验:学习并了解单元测试;认识编程中三种码:伪代码、产品代码、测试代码;接下来就是开始实验,对我们所编写的类进行测试,这个实验实验中我们共完成了三种测试,分别是:测试正常、测试异常、测试边界;
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 "错误";
}
}
接下来就是完成实验测试,使用Junit完成上述的三个测试。实验项目一代码链接1,实验项目一代码链接2
-
(3).进行第二个实验:学习使用StringBuffer类,从API文档上查阅了StringBuffer类的一些方法,并完成相关测试,使用JUnit完成了单元测试,实验项目二代码链接,下图是实验结果:
-
(4).第三个实验:在这里读错了题目,以为是要将所列的类都要进行代码补充,后来改了回来,对自己学号%6取余结果为2,故完成了(2)Boolean类,在MyDoc中也添加了测试代码,这里经学长指正做了修改,参见问题6。修改后代码链接
-
(5).第四个实验:以TOD的方式开发复数类,并完成这些要求:
// 定义属性并生成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,实验四代码链接2.最后实验结果如下:
- (6).最后一个实验:这个实验参考资料上没有将WhiteStarUML的具体使用方法,做起来也比较费时,网上也没有找到教程,最后就是乱点一点点的试,实验还算做完了,结果如图:
3. 实验过程中遇到的问题和解决过程
-
问题1:在使用Junit时切换了字符集,遇到字符集错误,也就是乱码了,导致以前的许多程序也不能再运行,具体见下图:
-
问题1解决方案:这里是在课上,就随即问了学长,学长也没有解决,但注意到了学长在调换字符集,后面自己就是乱尝试,当把字符集切换成US-ASCII时,终于又调了回来,后来课上老师也给出了解决方案,但好像是不太一样。
-
问题2:一个小错误,在使用Junit进行测试时,有三个测试,但只有两个测试显示通过,另外一个始终没有反应,不显示通过或失败。
-
问题2解决方案:后来还上去找老师问了问,老师检查完看出了编写错误,把test写成了text,导致那个测试始终没有运行,修改之后正常。到现在还在犯拼写错误,以后自己再想老师学长问问题时一定要多检查几遍,不要出现编写错误去让别人检查。
-
问题3:就是关于实验项目四中的Complex编写,先是小问题,return语句始终加红线错误,不明白是错在哪里了,见下图:
-
问题3解决方案:关于这种复数形式,我想起了之前的第七章例题那个分数运算,然后翻书找了那个书上的代码,编写的情况如下(这里取一小段说明):
public RationalNumber add(RationalNumber op2)
{
int commonDenominator = denominator * op2.getDenominator();
int numerator1 = numerator * op2.getDenominator();
int numerator2 = op2.getNumerator() * denominator;
int sum = numerator1 + numerator2;
return new RationalNumber(sum,commonDenominator);
}
这时便发现了我的错误在哪,我的return语句中缺少new运算符,加上之后,语句变为return new Complex(RealPart,ImagePart);
,这样红线消失,继续编写。
- 问题4:继续编写Complex类,又出现了问题,具体情况见下图:
- 问题4解决方案:这里其实首先是在测试时结果不正确,但在那里不太好分析,我就又写了mycomplex类用来实现这个Complex类,并对它进行了Debug调试,在这里到了做运算的这一步,就点了step into,进入里面一步步进行,进去之后调了好几遍才发现问题。拿这个为例,我本来没有写
double realpart = Realpart ;
这条语句,而是直接这样的语句:
RealPart = RealPart*obj.RealPart-ImagePart*obj.ImagePart;
ImagePart = RealPart*obj.ImagePart+ImagePart*obj.RealPart;
return new Complex(RealPart,ImagePart);
这样的错误是什么呢,就是我把做完操作、已经发生改变的RealPart代入到了下面的一条语句,而下面的语句需要的是我最初的那个RealPart,这里就发生了错误,于是就新建一个变量,让它等于最初的RealPart,然后把它用到下面的这条语句中,这时就可以保证我们想要的结果了。
-
问题5:遇到的还有这个问题,就是两个结果是一样,但是那个预测结果和实际结果显示出来的包是不一样的,也就是两个数据类型不同,测试不通过。
-
问题5解决方案:这个在蓝墨云上进行了提问,班主任的解答是这样,但是并没有给出答案,如何修改,最后是看了下别人的最后的这个类型转换,我也去查了查这个类型转换,最后是修改了这个语句
assertEquals(3.0+"+5.0i",String.valueOf(a.ComplexAdd(c)));
这样就测试通过,实验完成。查到的数据类型转换,已附到参考链接中
-
问题6:蓝墨云实验提交后,实验三学长指出其中存在的错误,按照学号取余20172302%6 = 2,我对应的应该是Boolean类,按照需求,Boolean类应对应Boolean类型的值。
-
问题6解决方案:这里对学长提出的进行了改正,将数据类型改为了Boolean类型,完成修改,修改后截图:
其他(感悟、思考等)
-
这周的实验花了很多时间,幸好书上的章节并不是很难,那个完成的比较快,才有时间去完成这些实验,每次实验都是比较费力劳神的感觉,而且这一次一下留了5个实验,感觉任务量有点大,最主要的有的实验自己怎么做就是有错误,而别人那不需要调就可以直接进行,这就比较心急,越做越慌,这次实验做到后面还算好一点,但第四个实验做了好久才弄出来.
-
后记:后面再翻看其他同学码云时,发现自己实验四编写的较为麻烦一些,以后要注意简化代码,同时实验三也是出现了错误,后做修改。