20192316 2020-2021-1 《数据结构与面向对象程序设计》实验三报告
20192316 2020-2021-1 《数据结构与面向对象程序设计》实验三报告
课程:《程序设计与数据结构》
班级: 1923
姓名: 贝世之
学号:20192316
实验教师:王志强
实验日期:2020年10月11日
必修/选修: 必修
1.实验内容
下载安装并使用IDEA,完成下面实验(https://www.cnblogs.com/rocedu/p/6371315.html)。
-
初步掌握单元测试和TDD
-
理解并掌握面向对象三要素:封装、继承、多态
-
初步掌握UML建模
-
完成蓝墨云上 (1)-(5)实验。
2. 实验过程及结果
2.1第一个提交点
参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST
http://www.cnblogs.com/rocedu/p/6736847.html
提交最后三个测试用例都通过的截图。
代码:
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 "错误";
}
}
测试代码:
import org.junit.Test;
import junit.framework.TestCase;
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 testExceptions() { //测试用例,错误情况
assertEquals("错误", MyUtil.percentage2fivegrade(-55));
assertEquals("错误", MyUtil.percentage2fivegrade(105));
}
@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));
}
}
运行结果:
2.2第二个提交点
参考 积极主动敲代码,使用JUnit学习Java (http://www.cnblogs.com/rocedu/p/4837092.html)
http://www.cnblogs.com/rocedu/p/6736847.html
以TDD的方式研究学习StringBuffer,提交单元测试用例和测试通过的截图。
代码:
public class StringBufferDemo{
public static void main(String [] args){
StringBuffer buffer = new StringBuffer();
buffer.append('S');
buffer.append("tringBuffer");
System.out.println(buffer.charAt(1));
System.out.println(buffer.capacity());
System.out.println(buffer.indexOf("tring"));
System.out.println("buffer = " + buffer.toString());
}
}
测试代码:
import junit.framework.TestCase;
public class StringBufferDemoTest extends TestCase {
StringBuffer a = new StringBuffer("wanglaoshitaiqiangle");
StringBuffer b = new StringBuffer("zhujiaoyehenqiang");
StringBuffer c = new StringBuffer("wotaicaile555");
public void testcharAt(){ //字符索引测试
assertEquals('w',a.charAt(0));
assertEquals('o',b.charAt(6));
assertEquals('5',c.charAt(10));
}
public void testcapacity(){ //测试caoacity(),发现其返回的数值是length()+16
assertEquals(36,a.capacity());
assertEquals(33,b.capacity());
assertEquals(29,c.capacity());
}
public void testlength(){ //字符串长度测试
assertEquals(20,a.length());
assertEquals(17,b.length());
assertEquals(13,c.length());
}
public void testindexOf(){ //子串匹配测试
assertEquals(0,a.indexOf("wanglaoshi"));
assertEquals(3,b.indexOf("jiao"));
assertEquals(10,c.indexOf("555"));
}
}
运行结果:
2.3第三个提交点
Java面向对象程序设计(http://www.cnblogs.com/rocedu/p/4472842.html)
http://www.cnblogs.com/rocedu/p/6736847.html
对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式
学号16%6取余为4:
4:让系统支持Float类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
代码修改:
// Server Classes
abstract class Data {
abstract public void DisplayValue();
}
class Floateger extends Data {
float value;
Floateger() {
value=55.55f; //浮点数+f
}
public void DisplayValue(){
System.out.println (value);
}
}
// Pattern Classes
abstract class Factory {
abstract public Data CreateDataObject();
}
class FloatFactory extends Factory {
public Data CreateDataObject(){
return new Floateger();
}
}
//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 FloatFactory());
d.DisplayData();
}
}
运行结果:
2.4第四个提交点
提交:单元测试代码和运行成功截图及码云上代码链接。
参考 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)
代码:
链接:https://gitee.com/besti1923/beishizhi/blob/master/src/Complex.java
public class Complex{
double RealPart;
double ImagePart;
//定义构造函数,定义复数的实部变量a和虚部变量b
public Complex(double a,double b){
this.RealPart = a;
this.ImagePart = b;
}
//覆盖对象,判断boolean
public String toString(){
return "RealPart:" + RealPart + ", ImagePart:" + ImagePart;
}
public boolean equals(Object z1){
if (z1 == this){
return true;
}
else{
return false;
}
}
//定义加减乘除子函数
public Complex ComplexAdd(Complex z2){
Complex z3 = new Complex(this.RealPart + z2.RealPart,this.ImagePart + z2.ImagePart);
return z3;
}
public Complex ComplexSub(Complex z2){
Complex z3 = new Complex(this.RealPart - z2.RealPart,this.ImagePart - z2.ImagePart);
return z3;
}
public Complex ComplexMulti(Complex z2){
Complex z3 = new Complex(this.RealPart * z2.RealPart - this.ImagePart * z2.ImagePart,
this.ImagePart * z2.RealPart + this.RealPart * z2.ImagePart);
return z3;
}
public Complex ComplexDiv(Complex z2){
double t = z2.RealPart * z2.RealPart + z2.ImagePart * z2.ImagePart;
Complex z3 = new Complex((this.RealPart * z2.RealPart + this.ImagePart * z2.ImagePart) / t,
(this.ImagePart * z2.RealPart - this.RealPart * z2.ImagePart) / t);
return z3;
}
}
测试代码:
链接:https://gitee.com/besti1923/beishizhi/blob/master/test/ComplexTest.java
import junit.framework.TestCase;
import org.junit.Test;
public class ComplexTest extends TestCase {
Complex z1 = new Complex(4.0,2.0);
Complex z2 = new Complex(1.0,-1.0);
@Test
public void testequals() {
assertEquals(true, z1.equals(z1));
assertEquals(false, z1.equals(z2));
}
@Test
public void testComplexAdd() {
assertEquals("RealPart:5.0, ImagePart:1.0", z1.ComplexAdd(z2).toString());
}
@Test
public void testComplexSub() {
assertEquals("RealPart:3.0, ImagePart:3.0", z1.ComplexSub(z2).toString());
}
@Test
public void testComplexMulti() {
assertEquals("RealPart:6.0, ImagePart:-2.0", z1.ComplexMulti(z2).toString());
}
@Test
public void testComplexDiv() {
assertEquals("RealPart:1.0, ImagePart:3.0", z1.ComplexDiv(z2).toString());
}
}
运行结果:
上传码云:
2.5第五个提交点
使用WhiteStarUML对实验二中的代码进行建模,发类图的截图。
参考:http://www.cnblogs.com/rocedu/p/6736847.html
类图中至少两个类。
对应第一个提交点:
对应第二个提交点:
对应第四个提交点:
3. 实验过程中遇到的问题和解决过程
-
问题1:本次实验提供的学习资料 https://www.cnblogs.com/rocedu/p/4472842.html 图片大多加载不出来
-
问题1解决方案:娄老师在该网站最下方给出了解决方法,携带邀请码前往实验楼。
-
问题2:junit和Test出现异常(红色字体)
-
问题2解决方案:点击红字,左方会出现小灯泡,按小灯泡的提示走_。
-
问题3:第二个提交点莫名红字
-
问题3解决方案:类名后加上Demo后解决问题
-
问题4:数值有小数点时被认为是double类型而不是float类型
-
问题4解决方案:在数值后加上f
-
问题5:第四个提交点的测试代码中,预期和实际相符却报错。
-
问题5解决方案:此处为void类型而不是String类型,去掉“”。
其他(感悟、思考等)
有一点难,有亿点多=_=。