20145308刘昊阳 《Java程序设计》实验二 Java面向对象程序设计 实验报告
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面向对象程序设计 实验报告的更多相关文章
- 20155202 《Java程序设计》实验二(面向对象程序设计)实验报告
20155202 <Java程序设计>实验二(面向对象程序设计)实验报告 代码托管 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉 ...
- 20155239《Java程序设计》实验二(面向对象程序设计)实验报告
实验内容 初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验步骤 单元测试 1.三种代码: 伪代码 ...
- 20145308刘昊阳 《Java程序设计》实验四 Android环境搭建 实验报告
20145308刘昊阳 <Java程序设计>实验四 Android环境搭建 实验报告 实验名称 Android环境搭建 实验内容 搭建Android环境 运行Android 修改代码,能输 ...
- 20145308刘昊阳 《Java程序设计》实验三 敏捷开发与XP实践 实验报告
20145308刘昊阳 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 统计的PSP(Personal ...
- 20145308刘昊阳 《Java程序设计》实验五报告
20145308刘昊阳 <Java程序设计>实验五 Java网络编程及安全 实验报告 实验名称 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: ...
- 20145308刘昊阳 《Java程序设计》实验一 Java开发环境的熟悉 实验报告
20145308刘昊阳 <Java程序设计>实验一报告 实验名称 Java开发环境的熟悉 实验内容 使用JDK编译.运行简单的Java程序 2.使用Eclipse 编辑.编译.运行.调试J ...
- 20145308刘昊阳 《Java程序设计》第4周学习总结
20145308刘昊阳 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 继承与多态 6.1 何谓继承 继承:面向对象中,为避免多个类间重复定义共同行为使用 把相同代码提升为父 ...
- 20145308刘昊阳 《Java程序设计》第3周学习总结
20145308刘昊阳 <Java程序设计>第3周学习总结 教材学习内容总结 第四章 认识对象 要产生对象必须先定义类,类是对象的设计图,对象是类的实例 类是从少数实例推广到大量相似实例的 ...
- 20145308刘昊阳 《Java程序设计》第8周学习总结
20145308刘昊阳 <Java程序设计>第8周学习总结 教材学习内容总结 第15章 通用API 15.1 日志 15.1.1 日志API简介 java.util.loggging包提供 ...
随机推荐
- Lattice Diamond 学习之编译、检查和设置约束
在新建工程以及完成代码的输入之后.则就要进行编译,并检测错误. 一. Generate Hierarchy(产生层次结构). 1. 点击Generate Hierarchy 图标或者Design -- ...
- CLR via C#学习笔记----知识总概括
第1章 CLR的执行模型 托管模块的各个组成部分:PE32或PE32+头,CLR头,元数据,IL(中间语言)代码. 高级语言通常只公开了CLR的所有功能的一个子集.然而,IL汇编语言允许开发人员访问C ...
- 与你相遇好幸运,Linux常用命令
开机挂载硬盘 cat /etc/fstab /dev/sda1 /mnt/sda1 ext3 defaults 0 0 挂载硬盘 mount /dev/sdb5 /home/dis ...
- 无废话ExtJs 入门教程十五[员工信息表Demo:AddUser]
无废话ExtJs 入门教程十五[员工信息表Demo:AddUser] extjs技术交流,欢迎加群(201926085) 前面我们共介绍过10种表单组件,这些组件是我们在开发过程中最经常用到的,所以一 ...
- 一些常用的C++标准函数
一些常用的C++标准函数 double atof(const char* p); int atoi(const char* p); long atol(const char* p); cstdlib ...
- 高质量C++[转]
高质量C++/C编程指南 文件状态 [ ] 草稿文件 [√] 正式文件 [ ] 更改正式文件 文件标识: 当前版本: 1.0 作 者: 林锐 博士 完成日期: 2001年7月24日 版 本 ...
- 在Salesforce中将 Decimal 数据转换成美元格式
闲言少叙,直接上代码(Apex Class 中的方法): private string ConvertToMoneyFormat(decimal price){ if (price == null | ...
- 第一个java程序hello world
首先需要配置环境,没配置的请参考:详细配置教程:http://www.cnblogs.com/qq1871707128/p/6047232.html 切入主题: java基础首先得了解基本的dos命令 ...
- Linux学习笔记(22) Linux启动管理
1. 系统运行级别 运行级别 含义 关机 1 单用户模式,可想象为windows的安全模式,主要用于系统修复 2 不完全的命令行模式,不含NFS服务 完全的命令行模式,就是标准字符界面 4 系统保留 ...
- LoadRunner参数化之数据取值和更新方式
其实看LR已经很久了,每次看到参数化的取值更新时,都没有看透,了解个大概就为止了,也确实挺搞脑子的. 现在理解下来 分成2部分 取值方式 Select next row 如何从数据列表中取值 Seq ...