20182320 2019-2020-1 《数据结构与面向对象程序设计》实验3报告
课程:《程序设计与数据结构》
班级: 1823
姓名: 郑力元
学号:20182320
实验教师:王志强
实验日期:2019年9月27日
必修/选修: 必修
1.实验内容
(1)初步掌握单元测试和TDD
(2)理解并掌握面向对象三要素:封装、继承、多态(自己去学!)
(3)初步掌握UML建模
(4)完成蓝墨云上 (1)-(5)实验。
2. 实验过程及结果
2.1 第一个提交点
首先,参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST 完成单元测试的学习,并写出用于检测成绩的类。
代码如下:
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测试用例(正常情况,错误情况,边界情况)都通过的截图。
代码如下:
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,以TDD的方式研究学习StringBuffer。
用普通测试方法探究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());
}
}
运行结果如下:
用TDD探究StringBuffer,代码如下:
import junit.framework.TestCase;
public class StringBufferDemoTest extends TestCase {
StringBuffer a = new StringBuffer("qwerabcdhij");
StringBuffer b = new StringBuffer("qwer12345678910");
StringBuffer c = new StringBuffer("tiyioyuoiyu");
public void testcharAt() throws Exception{
assertEquals('q',a.charAt(0));
assertEquals('1',b.charAt(4));
assertEquals('o',c.charAt(4));
}
public void testcapacity() throws Exception{
assertEquals(27,a.capacity());
assertEquals(31,b.capacity());
assertEquals(27,c.capacity());
}
public void testlength() throws Exception{
assertEquals(11,a.length());
assertEquals(15,b.length());
assertEquals(11,c.length());
}
public void testindexOf() throws Exception{
assertEquals(0,a.indexOf("qwer"));
assertEquals(4,b.indexOf("123"));
assertEquals(5,c.indexOf("yuo"));
}
}
运行结果如下:
2.4第四个提交点
第一步,用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)
代码如下:
public class Complex{
private double RealPart;
private double ImagePart;
//构造函数
public Complex(){}
public Complex(double R,double I){
RealPart=R;
ImagePart=I;
}
//返回
public double getRealPart(){
return RealPart;
}
public double getImagePart(){
return ImagePart;
}
//接收
public void setRealPart(double realPart){
RealPart=realPart;
}
public void setImagePart(double imagePart){
ImagePart=imagePart;
}
//重写函数toString
public String toString(){
return "Complex{" +
"RealPart=" + RealPart +
", ImagePart=" + ImagePart +
'}';
}
public boolean equals(Object a){
if (a==this){
return true;
}
else{
return false;
}
}
// 定义公有方法:加减乘除
public Complex ComplexAdd(Complex a){
Complex b = new Complex(this.RealPart+a.RealPart,this.ImagePart+a.ImagePart);
return b;
}
public Complex ComplexSub(Complex a){
Complex b = new Complex(this.RealPart-a.RealPart,this.ImagePart-a.ImagePart);
return b;
}
public Complex ComplexMulti(Complex a){
Complex b = new Complex(this.RealPart*a.RealPart-this.ImagePart*a.ImagePart,this.ImagePart*a.RealPart+this.RealPart*a.ImagePart);
return b;
}
public Complex ComplexDiv(Complex a){
double scale = a.getRealPart()*a.getRealPart() + a.getImagePart()*a.getImagePart();
Complex b = new Complex(a.getRealPart() / (a.getRealPart()*a.getRealPart() + a.getImagePart()*a.getImagePart()),
- a.getImagePart() / (a.getRealPart()*a.getRealPart() + a.getImagePart()*a.getImagePart()));
return this.ComplexMulti(b);
}
}
第二步,编写测试代码。
代码如下:
import junit.framework.TestCase;
import org.junit.Test;
public class ComplexTest extends TestCase {
Complex a=new Complex(8.0,4.0);
Complex b=new Complex(-4.0,2.0);
@Test
public void testComplexAdd() {
assertEquals(4.0, a.ComplexAdd(b).getRealPart());
assertEquals(6.0,a.ComplexAdd(b).getImagePart());
}
@Test
public void testComplexSub() {
assertEquals(12.0, a.ComplexSub(b).getRealPart());
assertEquals(2.0,a.ComplexSub(b).getImagePart());
}
@Test
public void testComplexMulti() {System.out.println(a.ComplexMulti(b).getImagePart());
assertEquals(-40.0, a.ComplexMulti(b).getRealPart());
assertEquals(0.0,a.ComplexMulti(b).getImagePart());
}
@Test
public void testComplexDiv() {
assertEquals(-1.2000000000000002, a.ComplexDiv(b).getRealPart());
assertEquals(-1.6,a.ComplexDiv(b).getImagePart());
}
}
结果如下:
2.5 第五个提交点
第一步:参考 https://www.cnblogs.com/rocedu/p/4472842.html 中的UML建模规范,对某一自编写的类的代码进行建模。
编写类的代码如下:
public class Complex{
private double RealPart;
private double ImagePart;
//构造函数
public Complex(){}
public Complex(double R,double I){
RealPart=R;
ImagePart=I;
}
//返回
public double getRealPart(){
return RealPart;
}
public double getImagePart(){
return ImagePart;
}
//接收
public void setRealPart(double realPart){
RealPart=realPart;
}
public void setImagePart(double imagePart){
ImagePart=imagePart;
}
//重写函数toString
public String toString(){
return "Complex{" +
"RealPart=" + RealPart +
", ImagePart=" + ImagePart +
'}';
}
public boolean equals(Object a){
if (a==this){
return true;
}
else{
return false;
}
}
// 定义公有方法:加减乘除
public Complex ComplexAdd(Complex a){
Complex b = new Complex(this.RealPart+a.RealPart,this.ImagePart+a.ImagePart);
return b;
}
public Complex ComplexSub(Complex a){
Complex b = new Complex(this.RealPart-a.RealPart,this.ImagePart-a.ImagePart);
return b;
}
public Complex ComplexMulti(Complex a){
Complex b = new Complex(this.RealPart*a.RealPart-this.ImagePart*a.ImagePart,this.ImagePart*a.RealPart+this.RealPart*a.ImagePart);
return b;
}
public Complex ComplexDiv(Complex a){
double scale = a.getRealPart()*a.getRealPart() + a.getImagePart()*a.getImagePart();
Complex b = new Complex(a.getRealPart() / (a.getRealPart()*a.getRealPart() + a.getImagePart()*a.getImagePart()),
- a.getImagePart() / (a.getRealPart()*a.getRealPart() + a.getImagePart()*a.getImagePart()));
return this.ComplexMulti(b);
}
}
测试代码如下:
import junit.framework.TestCase;
import org.junit.Test;
public class ComplexTest extends TestCase {
Complex a=new Complex(8.0,4.0);
Complex b=new Complex(-4.0,2.0);
@Test
public void testComplexAdd() {
assertEquals(4.0, a.ComplexAdd(b).getRealPart());
assertEquals(6.0,a.ComplexAdd(b).getImagePart());
}
@Test
public void testComplexSub() {
assertEquals(12.0, a.ComplexSub(b).getRealPart());
assertEquals(2.0,a.ComplexSub(b).getImagePart());
}
@Test
public void testComplexMulti() {System.out.println(a.ComplexMulti(b).getImagePart());
assertEquals(-40.0, a.ComplexMulti(b).getRealPart());
assertEquals(0.0,a.ComplexMulti(b).getImagePart());
}
@Test
public void testComplexDiv() {
assertEquals(-1.2000000000000002, a.ComplexDiv(b).getRealPart());
assertEquals(-1.6,a.ComplexDiv(b).getImagePart());
}
}
根据以上代码建模,图如下:
3. 实验过程中遇到的问题和解决过程
在使用IDEA的Git功能时,遇到许多困难与阻碍,并且由于当时解决问题心情急切,没有截图。
- 问题1:在使用Git上传代码的时候,右下角弹窗提示上传被拒绝。目前原因未知。
- 问题1解决方案:
首先,将本地的代码库删除并提前备份代码。
其次,将码云上的代码重新clone至本地。
最后,将备份好的代码复制到本地的库中,再一起上传。
- 问题2:在使用IDEA时,环境设置比较复杂,很多配置需要手动设置,例如生成.class文件的路径、手动设置源代码文件夹和测试文件夹等等。
- 问题2解决方案:参考 https://www.cnblogs.com/rocedu/p/4472842.html ,但是有许多图片无法加载,所提供的帮助有限。
其他(感悟、思考等)
虽然集成开发环境IDEA很强大,但是它的强大建立在我们熟练运用的基础上。因此我们要认真阅读IDEA的使用教程,充分利用它的优势为我们编写代码提供便利。