20192327 2020-2021-1 《数据结构与面向对象程序设计》实验三报告
20192327 2020-2021-1 《数据结构与面向对象程序设计》实验三报告
课程:《程序设计与数据结构》
班级: 1923
姓名: 何源
学号: 20192327
实验教师:王志强
实验日期:2020年10月11日
必修/选修: 必修
1.实验内容
下载安装并使用IDEA,完成下面实验(https://www.cnblogs.com/rocedu/p/6371315.html)。
- 初步掌握单元测试和TDD
- 理解并掌握面向对象三要素:封装、继承、多态
- 初步掌握UML建模
- 完成蓝墨云上 (1)-(5)实验。
2. 实验过程及结果
提交点一
参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST
参考http://www.cnblogs.com/rocedu/p/6736847.html
提交最后三个测试用例都通过的截图,截图上要有画图加水印,输入自己的学号。
程序代码如下
public class MyUtil{
public static String carspeed(int speed){
//如果车速小于0,转成“错误”
if ((speed < 0))
return "错误";
//如果车速小于20,转成“一档”
else if (speed < 20)
return "一档";
//如果车速在20与40之间,转成“二档”
else if (speed < 40)
return "二档";
//如果车速在40与60之间,转成“三档”
else if (speed < 60)
return "三档";
//如果车速在60与75之间,转成“四档“
else if (speed < 75)
return "四档";
//如果车速在75与180之间,转成“五档”
else if (speed <= 180)
return "五档";
//如果车速大于180,转成“错误”
else
return "错误";
}
}
程序运行结果如下
测试代码如下
import junit.framework.TestCase;
public class MyUtilTest extends TestCase {
@Test
public void testNormal()
{
assertEquals("一档", MyUtil.carspeed(15));
assertEquals("二档", MyUtil.carspeed(35));
assertEquals("三档", MyUtil.carspeed(55));
assertEquals("四档", MyUtil.carspeed(70));
assertEquals("五档", MyUtil.carspeed(95));
}
@Test
public void testException()
{
assertEquals("错误", MyUtil.carspeed(185));
}
@Test
public void testBoundary()
{
assertEquals("一档", MyUtil.carspeed(0));
assertEquals("二档", MyUtil.carspeed(20));
assertEquals("三档", MyUtil.carspeed(40));
assertEquals("四档", MyUtil.carspeed(60));
assertEquals("五档", MyUtil.carspeed(75));
assertEquals("五档", MyUtil.carspeed(180));
}
}
测试结果如下
根据运行及测试结果可以看到,全部通过测试
提交点二
参考 积极主动敲代码,使用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('T');
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());
System.out.println(buffer.length());
}
}
程序运行结果如下
测试代码如下
import junit.framework.TestCase;
import org.junit.Test;
public class StringBufferDemoTest extends TestCase {
StringBuffer a = new StringBuffer("StringBuffer");
StringBuffer b = new StringBuffer("Thisismytestingstring");
StringBuffer c = new StringBuffer("Thisismytestingstringandihavechangedmuch");
@Test
public void testcharAt() throws Exception {
assertEquals('t', a.charAt(1));
assertEquals('g', a.charAt(5));
assertEquals('r', a.charAt(11));
}
@Test
public void testcapacity() throws Exception {
assertEquals(28, a.capacity());
assertEquals(37, b.capacity());
assertEquals(56, c.capacity());
}
@Test
public void testlength() throws Exception {
assertEquals(12, a.length());
assertEquals(21, b.length());
assertEquals(40, c.length());
}
@Test
public void testindexOf() throws Exception {
assertEquals(0, a.indexOf("Str"));
assertEquals(6, b.indexOf("my"));
assertEquals(21, c.indexOf("and"));
}
}
测试结果如下
根据运行及测试结果可以看到,全部通过测试
提交点三
实验三 Java面向对象程序设计(http://www.cnblogs.com/rocedu/p/4472842.html)
参考http://www.cnblogs.com/rocedu/p/6736847.html
对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式
用自己的学号%6进行取余运算,根据结果进行代码扩充:
0:让系统支持Byte类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
1:让系统支持Short类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
2:让系统支持Boolean类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
3:让系统支持Long类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
4:让系统支持Float类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
5:让系统支持Double类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
参考 积极主动敲代码,使用JUnit学习Java (http://www.cnblogs.com/rocedu/p/4837092.html)
参考http://www.cnblogs.com/rocedu/p/6736847.html
以 TDD的方式研究学习StringBuffer,提交你的单元测试用例和测试通过的截图,截图要加上学号水印。
程序代码如下
import java.util.Objects;
abstract class Data {
abstract public void DisplayValue();
}
class Integer extends Data {
int value;
Integer() {
value=120;
}
public void DisplayValue(){
System.out.println (value);
}
}
class Long extends Data {
long value;
Long() {
value=(long)20192327;
}
public void DisplayValue(){
System.out.println (value);
}
}
abstract class Factory {
abstract public Data CreateDataObject();
}
class IntFactory extends Factory {
public Data CreateDataObject(){
return new Integer();
}
}
class LongFactory extends Factory {
public Data CreateDataObject(){
return new Long();
}
}
class Document {
Data data;
Document(Factory factory){
data = factory.CreateDataObject();
}
public void DisplayData(){
data.DisplayValue();
}
}
public class MyDoc {
static Document a;
static Document b;
public static void main(String[] args) {
a = new Document(new IntFactory());
a.DisplayData();
b = new Document(new LongFactory());
b.DisplayData();
}
}
程序运行结果如下
提交点四
提交:单元测试代码和运行成功截图及码云上代码链接,截图要加上学号水印
参考http://www.cnblogs.com/rocedu/p/6736847.html
任务:以TDD的方式开发一个复数类imaginarycalculator,要求如下:
// 定义属性并生成getter,setter
double RealPart;
double ImagePart;
码云链接
https://gitee.com/besti1923/hy20192327/blob/master/src/Imaginarycalculator.java
https://gitee.com/besti1923/hy20192327/blob/master/test/imaginarycalculatorTest.java
程序代码如下
import java.util.Scanner;
public class imaginarycalculator
{
double Realpart;
double Imagepart;
public double getRealpart()
{
return Realpart;
}
public double getImagepart()
{
return Imagepart;
}
public void setRealpart(double realpart)
{
Realpart = realpart;
}
public void setImagepart(double imagepart)
{
Imagepart = imagepart;
}
public imaginarycalculator() {
}
public imaginarycalculator(double R, double I)
{
Realpart = R;
Imagepart = I;
}
public static imaginarycalculator addition(imaginarycalculator a, imaginarycalculator b)
{
imaginarycalculator temp = new imaginarycalculator();
temp.Realpart = a.Realpart + b.Realpart;
temp.Imagepart = a.Imagepart + b.Imagepart;
return temp;
}
public static imaginarycalculator subtraction(imaginarycalculator a, imaginarycalculator b)
{
imaginarycalculator temp = new imaginarycalculator();
temp.Realpart = a.Realpart - b.Realpart;
temp.Imagepart = a.Imagepart - b.Imagepart;
return temp;
}
public static imaginarycalculator multiplication(imaginarycalculator a, imaginarycalculator b)
{
imaginarycalculator temp = new imaginarycalculator();
temp.Realpart = a.Realpart * b.Realpart - a.Imagepart * b.Imagepart;
temp.Imagepart = a.Realpart * b.Imagepart + a.Imagepart * b.Realpart;
return temp;
}
public static imaginarycalculator division(imaginarycalculator a, imaginarycalculator b)
{
imaginarycalculator temp = new imaginarycalculator();
double t = Math.pow(b.Realpart, 2) + Math.pow(b.Imagepart, 2);
temp.Realpart = (a.Realpart * b.Realpart + a.Imagepart * b.Imagepart) / t;
temp.Imagepart = (a.Imagepart * b.Realpart - a.Realpart * b.Imagepart) / t;
return temp;
}
public static void main(String[] args)
{
imaginarycalculator a=new imaginarycalculator();
imaginarycalculator b=new imaginarycalculator();
imaginarycalculator result=new imaginarycalculator();
String operate;
Scanner scan=new Scanner(System.in);
System.out.println("input the first number");
a.Realpart=scan.nextDouble();
a.Imagepart=scan.nextDouble();
System.out.println(a.Realpart+"+"+"("+a.Imagepart+"i"+")");
System.out.println("choose the type: ");
operate=scan.next();
System.out.println("input the first number");
b.Realpart=scan.nextDouble();
b.Imagepart=scan.nextDouble();
System.out.println(b.Realpart+"+"+"("+b.Imagepart+"i"+")");
if(operate.equals("+"))
{
result=addition(a,b);
}
else if(operate.equals("-"))
{
result=subtraction(a,b);
}
else if(operate.equals("*"))
{
result=multiplication(a,b);
}
else if(operate.equals("/"))
{ result=division(a,b);}
System.out.println(a.Realpart+"+"+"("+a.Imagepart+"i"+")"+operate+b.Realpart+"+"+"("+b.Imagepart+"i"+")"+"=="+result.Realpart+"+"+"("+result.Imagepart+"i"+")");
}
}
运行结果如下
测试代码如下
import junit.framework.TestCase;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class imaginarycalculatorTest extends TestCase {
imaginarycalculator a = new imaginarycalculator(1.0, 2.0);
imaginarycalculator b = new imaginarycalculator(1.0, -4.0);
imaginarycalculator c = new imaginarycalculator(19.0, 0.0);
imaginarycalculator d = new imaginarycalculator(0.0, -3.0);
@Test
public void testAddition() {
assertEquals(2.0d, imaginarycalculator.addition(a, b).Realpart, 1d);
}
@Test
public void testSubtraction() {
assertEquals(18.0d, imaginarycalculator.subtraction(c, b).Realpart, 1d);
}
@Test
public void testMultiplication() {
assertEquals(-57.0d, imaginarycalculator.multiplication(c, d).Imagepart, 1d);
}
@Test
public void testDivision() {
assertEquals(-57.0d, imaginarycalculator.multiplication(c, d).Imagepart, 1d);
}
}
测试结果如下
提交点五
使用WhiteStarUML对实验二中的代码进行建模,发类图的截图,加上学号水印。
参考http://www.cnblogs.com/rocedu/p/6736847.html
类图中只少两个类
根据运行及测试结果可以看到,全部通过测试
3. 实验过程中遇到的问题和解决过程
- 问题1:提示变量不存在
- 问题1解决方案:找到相关缺失的变量并声明
- 问题2:无法解析相关方法
- 问题2解决方案:更改方法名
- 问题3:case语句在switch外部
- 问题3解决方案:补加“()”
- 问题4:在测试时提示“不能解决符号XXX”
- 问题4解决方案:更改错误的方法名
- 问题5:提示警告“条件 'i <= 0' 始终为 'false' ”
- 问题5解决方案:将“i<=0”改为“i>=0”
- 问题6:提示找不到相关的类
- 问题6解决方案:声明相关的类
- 问题7:不能解决符号“TestCas”
- 问题7解决方案:修改指示出的相关符号为“TestCase”
- 问题8:java: 需要')'
- 问题8解决方案:添加“)”
- 问题9:java: 找不到符号;符号: 变量 b;位置: 类 MyDoc
- 问题9解决方案:添加“static Document b;”
其他(感悟、思考等)
这次程序可以说是编得非常复杂了,究其原因还是因为编写之前没有对实验做一个足够细致的规划才导致的这种情况,同时在命名变量时也出现了因为命名不够准确而导致的各种问题,以后在编写实验室应该对此多加注意。编写程序终归是一个非常复杂的过程,需要我们去多加练习和思考。
这次试验比上次复杂多了,可以说是用上了java毕生所学==,直接造就了我们宿舍有史以来最有学习氛围的一个周末,不得不说还是收获颇丰的。
说到底还是得多练