20145308刘昊阳 《Java程序设计》实验二 Java面向对象程序设计 实验报告

实验名称

  • Java面向对象程序设计

实验内容

  • 初步掌握单元测试和TDD
  • 理解并掌握面相对象三要素:封装、继承、多态
  • 初步掌握UML建模
  • 掌握S.O.L.I.D原则
  • 了解设计模式

统计的PSP(Personal Software Process)时间

步骤 耗时(min) 百分比
需求分析 20~30 12.5%
设计 20~30 12.5%
代码实现 50~60 25%
测试 50~60 25%
分析总结 50~60 25%

实验步骤

(一)单元测试

  • 用实验示例代码进行试验

    • 写完了第一代代码,建立MyUtilTest类,并书写Test代码,通过编译

  • 输入负分检测,出现bug

  • 修改程序,使之能够处理负分情况

  • 测试边界情况,出现bug

  • 修改程序,使之能处理边界情况

  • 使用TDD的方式设计实现复数类Complex

    • 首先建立test类,建立java文件,并将java文件go to到建立的test
    • 根据所想功能书写test
import org.junit.Test;
public class ComplexNumberTest {
@Test
public void ComplexNumber(){
//ComplexNumber()方法
ComplexNumber num1 = new ComplexNumber();
assert num1.m_dRealPart == 0 : "fault1:ComplexNumber()函数有错误";
assert num1.m_dImaginPart == 0 : "fault2:ComplexNumber()函数有错误"; //ComplexNumber(double r,double I)方法
ComplexNumber num2 = new ComplexNumber(0, 0);
assert num2.m_dRealPart == 0 : "fault3:ComplexNumber(double r,double I)函数有错误";
assert num2.m_dImaginPart == 0 : "fault4:ComplexNumber(double r,double I)函数有错误"; //GetRealPart()方法
assert num2.m_dRealPart == 0 : "fault5:GetRealPart()函数有错误"; //GetImaginaryPart()方法
assert num2.m_dImaginPart == 0 : "fault6:GetImaginaryPart()函数有错误"; //SetRealPart(double d)方法
ComplexNumber num3 = new ComplexNumber();
num3.SetRealPart(0);
assert num3.m_dRealPart == 0 : "fault7:SetRealPart(double d)函数有错误"; //SetImaginaryPart(double d)方法
num3.SetImaginaryPart(0);
assert num3.m_dRealPart == 0 : "fault8:SetImaginaryPart(double d)函数有错误"; //ComplexAdd(ComplexNumber c)方法
ComplexNumber num4 = new ComplexNumber();
ComplexNumber num5 = new ComplexNumber(-1, -1);
ComplexNumber num6 = new ComplexNumber();
num4 = num1.ComplexAdd(num1);//自身相加,结果为0
assert num4.m_dRealPart == 0 : "fault9:ComplexAdd(ComplexNumber c)函数有错误";
assert num4.m_dImaginPart == 0 : "fault10:ComplexAdd(ComplexNumber c)函数有错误";
num6 = num1.ComplexAdd(num5);//结果为负数
assert num6.m_dRealPart == -1 : "fault11:ComplexAdd(ComplexNumber c)函数有错误";
assert num6.m_dImaginPart == -1 : "fault12:ComplexAdd(ComplexNumber c)函数有错误"; //ComplexMinus(ComplexNumber c)方法
ComplexNumber num7 = new ComplexNumber();
ComplexNumber num8 = new ComplexNumber(1, 1);
ComplexNumber num9 = new ComplexNumber();
num7 = num1.ComplexMinus(num1);//自身相减,结果为0
assert num7.m_dRealPart == 0 : "fault13:ComplexMinus(ComplexNumber c)函数有错误";
assert num7.m_dImaginPart == 0 : "fault14:ComplexMinus(ComplexNumber c)函数有错误";
num9 = num1.ComplexMinus(num8);//结果为负数
assert num9.m_dRealPart == -1 : "fault13:ComplexMinus(ComplexNumber c)函数有错误";
assert num9.m_dImaginPart == -1 : "fault14:ComplexMinus(ComplexNumber c)函数有错误"; //ComplexMulti(ComplexNumber c)方法
ComplexNumber num10 = new ComplexNumber();
ComplexNumber num11 = new ComplexNumber(-1, -1);
ComplexNumber num12 = new ComplexNumber();
ComplexNumber num13 = new ComplexNumber();
ComplexNumber num14 = new ComplexNumber(1, 1);
num10 = num1.ComplexMulti(num1);//自身相乘,结果为0
assert num10.m_dRealPart == 0 : "fault15:ComplexMulti(ComplexNumber c)函数有错误";
assert num10.m_dImaginPart == 0 : "fault16:ComplexMulti(ComplexNumber c)函数有错误";
num12 = num1.ComplexMulti(num11);//0与复数相乘,结果为0
assert num12.m_dRealPart == 0 : "fault17:ComplexMulti(ComplexNumber c)函数有错误";
assert num12.m_dImaginPart == 0 : "fault18:ComplexMulti(ComplexNumber c)函数有错误";
num13 = num11.ComplexMulti(num14);//正数与复数相乘,结果为负数
assert num13.m_dRealPart == -1 : "fault19:ComplexMulti(ComplexNumber c)函数有错误";
assert num13.m_dImaginPart == -1 : "fault20:ComplexMulti(ComplexNumber c)函数有错误"; //toString(double a,double b)方法
ComplexNumber num15 = new ComplexNumber(-1, -1);
ComplexNumber num16 = new ComplexNumber(0, 0);
assert num15.toString(num15.m_dRealPart, num15.m_dImaginPart).equals( -1-1+"i") : "fault21:toString(double a,double b)函数有错误";//实部虚部全部为复数
assert num16.toString(num16.m_dRealPart, num16.m_dImaginPart).equals(0) : "fault22e:toString(double a,double b)函数有错误";//实部虚部全部为0 //成功
// System.out.println("没有发现程序错误");
}
}
  • 根据test文件写java文件,开始进行测试,发生错误

  • 发现是test文件把ComplexMulti()错写成ComplexAdd(),修改代码

  • 运行成功,出现fault21

  • 修改fault21

  • 没有解决错误

  • Complex类代码

import java.util.Scanner;
import java.lang.String; public class ComplexNumber {
public double m_dRealPart;//实部
public double m_dImaginPart;//虚部 public ComplexNumber(){//构造函数,将实部虚部置0
double m_dRealPart = 0;
double m_dImaginPart = 0;
}
public ComplexNumber(double r,double I){//构造函数,创建复数对象的同时完成负数的实部虚部的初始化
this.m_dRealPart = r;
this.m_dImaginPart = I;
}
public double GetRealPart(){//获取实部
return this.m_dRealPart;
}
public double GetImaginaryPart(){//获取虚部
return this.m_dImaginPart;
}
public double SetRealPart(double d){//设置实部
m_dRealPart = d;
return m_dRealPart;
}
public double SetImaginaryPart(double d){//设置虚部
m_dImaginPart = d;
return m_dImaginPart;
}
ComplexNumber ComplexAdd(ComplexNumber c){//复数相加
double real = c.GetRealPart();
double image = c.GetImaginaryPart();
double newReal = real + m_dRealPart;
double newImage = image + m_dImaginPart;
ComplexNumber Result = new ComplexNumber(newReal,newImage);
return Result;
}
/*ComplexNumber ComplexAdd(double c){//复数相加
double real = c;
double newReal = real + m_dRealPart;
ComplexNumber Result = new ComplexNumber(newReal,0);
return Result;
}*/
ComplexNumber ComplexMinus(ComplexNumber c){//复数相减
double real = c.GetRealPart();
double image = c.GetImaginaryPart();
double newReal = m_dRealPart - real ;
double newImage = m_dImaginPart - image;
ComplexNumber Result = new ComplexNumber(newReal,newImage);
return Result;
}
/* ComplexNumber ComplexMinus(double c){//复数相减
double real = c;
double newReal = real - m_dRealPart;
ComplexNumber Result = new ComplexNumber(newReal,0);
return Result;
}*/
ComplexNumber ComplexMulti(ComplexNumber c){//复数相乘
double real = c.GetRealPart();
double image = c.GetImaginaryPart();
double newReal = real * m_dRealPart;
double newImage = image * m_dImaginPart;
ComplexNumber Result = new ComplexNumber(newReal,newImage);
return Result;
}
/*ComplexNumber ComplexMulti(double c){//复数相乘
double real = c;
double newReal = real * m_dRealPart;
ComplexNumber Result = new ComplexNumber(newReal,0);
return Result;
}*/
public String toString(double a,double b){//把当前复数对象的实部虚部组合成a+bi的字符串形式
String c;
if(b == 0) {c =""+a;}//将double型变量转为String类型
else if(b < 0){c = a+b+"i";}
else {c = a+"+"+b +"i";}
return c;
} }
  • 使用StarUML建模

    • 我的程序没有继承和操作接口,所以用实验示例来做

    • 建立两个类,设定权限和类里面的方法

    • 建立测试类AnimalTest,将测试类依赖这两个类

    • 建立Animal,并设定为父类,将两个子类设定继承该父类,有继承和操作接口的完整图

问题及解决过程

  • 问题:toString类的test出错,经过查询代码,应该没有错误,感觉是test文件不对

  • 解决过程:修改代码还是运行不出来,有待解决

  • 问题:建模时建立了父类Animal子类无法继承

  • 解决过程:对照示例发现Animal没有变成斜体字,无法继承,就勾选了Properties工具栏中的IsAbstract选项,成功

实验体会

  • 这次实验内容很多,学习了单元测试,还接触了一个全新的软件StarUML,并用软件进行建模,感觉实验时间虽然紧张,但是还是学习到了很多,当然也有很多没解决的问题
  • 单元测试真的很方便,在写程序前就可以设计好程序再进行书写,避免有bug,还可以对书写好的类进行全面的测试,体会到了三种代码的区别与用处
  • 建模将Java中类的抽象的封装继承关系具体到图形上,让人更直观的感受到了他们之间的关系

20145308刘昊阳 《Java程序设计》实验二 Java面向对象程序设计 实验报告的更多相关文章

  1. 20155202 《Java程序设计》实验二(面向对象程序设计)实验报告

    20155202 <Java程序设计>实验二(面向对象程序设计)实验报告 代码托管 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉 ...

  2. 20155239《Java程序设计》实验二(面向对象程序设计)实验报告

    实验内容 初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验步骤 单元测试 1.三种代码: 伪代码 ...

  3. 20145308刘昊阳 《Java程序设计》实验四 Android环境搭建 实验报告

    20145308刘昊阳 <Java程序设计>实验四 Android环境搭建 实验报告 实验名称 Android环境搭建 实验内容 搭建Android环境 运行Android 修改代码,能输 ...

  4. 20145308刘昊阳 《Java程序设计》实验三 敏捷开发与XP实践 实验报告

    20145308刘昊阳 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 统计的PSP(Personal ...

  5. 20145308刘昊阳 《Java程序设计》实验五报告

    20145308刘昊阳 <Java程序设计>实验五 Java网络编程及安全 实验报告 实验名称 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: ...

  6. 20145308刘昊阳 《Java程序设计》实验一 Java开发环境的熟悉 实验报告

    20145308刘昊阳 <Java程序设计>实验一报告 实验名称 Java开发环境的熟悉 实验内容 使用JDK编译.运行简单的Java程序 2.使用Eclipse 编辑.编译.运行.调试J ...

  7. 20145308刘昊阳 《Java程序设计》第4周学习总结

    20145308刘昊阳 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 继承与多态 6.1 何谓继承 继承:面向对象中,为避免多个类间重复定义共同行为使用 把相同代码提升为父 ...

  8. 20145308刘昊阳 《Java程序设计》第3周学习总结

    20145308刘昊阳 <Java程序设计>第3周学习总结 教材学习内容总结 第四章 认识对象 要产生对象必须先定义类,类是对象的设计图,对象是类的实例 类是从少数实例推广到大量相似实例的 ...

  9. 20145308刘昊阳 《Java程序设计》第8周学习总结

    20145308刘昊阳 <Java程序设计>第8周学习总结 教材学习内容总结 第15章 通用API 15.1 日志 15.1.1 日志API简介 java.util.loggging包提供 ...

随机推荐

  1. mysql中select五种子句和统计函数

    select 五种子句顺序 where 条件 group by 分组 having 把结果进行再次筛选 order by  排序 limit  取出条目 统计函数  max(列名)  求最大 min( ...

  2. vpn,可以连接上,但是不能访问局域网内共享的文件怎么办

    不选用VPN的上网关,就可以识别域用户访问共享文件的权限了,在VPN连接的属性里双击TCP/IP协议-高级-去掉勾选"在远程网络上使用默认网关".

  3. EasyUi–7.tab和datagrid和iframe的问题

    1. 多个tab切换,第2个不显示 动态添加tab Iframe页面的方法 展开 折叠 <script type="text/javascript"> $(functi ...

  4. Yii 同域名的单点登录 SSO实现

    SSO (Single Sign-on) 顾名思义就是几个子项目共用一个登录点. 原理简单来说就是服务端session 共享, 客户端跨域cookies. 实现非常简单,protected/confi ...

  5. 【转载】Pyqt 添加右键菜单方法

    转载地址: http://www.cnblogs.com/yogalau/p/3954042.html?utm_source=tuicool QListWidget 是继承 QWidget 的, 所以 ...

  6. 【JAVA网络流之TCP与UDP 】

    一.ServerSocket java.lang.Object |-java.net.ServerSocket 有子类SSLServerSocket. 此类实现服务器套接字.服务器套接字等待请求通过网 ...

  7. [LeetCode] Remove Duplicates from Sorted Array

    Given a sorted array, remove the duplicates in place such that each element appear only once and ret ...

  8. Getting Started with Blocks

    本文来源为:developer.apple.com,仅仅是博主练习排版所用. Getting Started with Blocks The following sections help you t ...

  9. [JavaCore]JAVA中的泛型

    JAVA中的泛型 [更新总结] 泛型就是定义在类里面的一个类型,这个类型在编写类的时候是不确定的,而在初始化对象时,必须确定该类型:这个类型可以在一个在里定义多个:在一旦使用某种类型,在类方法中,那么 ...

  10. DateTime还是DateTimeOffset?Now还是UtcNow?

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:新年第一篇文章,就来谈谈关于时间的简单技术问题:该用DateTime还是DateTim ...