技术标签: Java 复数类实验心得
北京电子科技学院(BESTI)实验报告
课程:Java程序设计
班级:1452
指导教师:娄嘉鹏
实验日期:2016.04.08
实验名称: Java面向对象程序设计
实验内容:
初步掌握单元测试和TDD
理解并掌握面向对象三要素:封装、继承、多态
初步掌握UML建模
熟悉S.O.L.I.D原则
了解设计模式
实验目的与要求:
1.使用TDD的方式设计关实现复数类Complex。
2.实验报告中统计自己的PSP(Personal Software Process)时间:
步骤
耗时
百分比
需求分析
1h
20%
设计
2h
40%
代码实现
40min
15%
测试
40min
15%
分析总结
30min
10%
3.实现要有伪代码,产品代码,测试代码。
4.总结单元测试的好处。
实验内容、步骤与体会
一、实验内容:
(一)使用TDD的方式设计关实现复数类Complex:
1.伪代码
请用户输入第一个复数的实部与虚部:
请用户输入第二个复数的实部与虚部:
这两个复数的和为:
这两个复数的差为:
这两个复数的乘为:
这两个复数的除为:
2.产品代码
public class MyUtil{
public static Complex{
//两个复数相加
double real2 = a.getReal();
double image2 = a.getImage();
double newReal = real + real2;
double newImage = image + image2;
Complex result = new Complex(newReal,newImage);
return result;
//两个复数相减
double real2 = a.getReal();
double image2 = a.getImage();
double newReal = real - real2;
double newImage = image - image2;
Complex result = new Complex(newReal,newImage);
return result;
//两个复数相乘
double real2 = a.getReal();
double image2 = a.getImage();
double newReal = real*real2 - image*image2;
double newImage = image*real2 + real*image2;
Complex result = new Complex(newReal,newImage);
return result;
//两个复数相除
double real2 = a.getReal();
double image2 = a.getImage();
double newReal = (real*real2 + image*image2)/(real2*real2 + image2*image2);
double newImage = (image*real2 - real*image2)/(real2*real2 + image2*image2);
Complex result = new Complex(newReal,newImage);
return result;
}
}
3.测试代码
public class MainClass { // 用于测试复数类
public static void main(String[] args) {
System.out.println("请用户输入第一个复数的实部和虚部:");
Complex data1 = new Complex();
System.out.println("请用户输入第二个复数的实部和虚部:");
Complex data2 = new Complex();
// 以下分别为加减乘除
Complex result_add = data1.add(data2);
Complex result_sub = data1.sub(data2);
Complex result_mul = data1.mul(data2);
Complex result_div = data1.div(data2);
result_add.print();
result_sub.print();
result_mul.print();
result_div.print();
}
}
程序源代码
import java.util.Scanner;
public class Complex { // 复数类
double real; // 实部
double image; // 虚部
Complex(){ // 不带参数的构造方法
Scanner input = new Scanner(System.in);
double real = input.nextDouble();
double image = input.nextDouble();
Complex(real,image);
}
private void Complex(double real, double image) { // 供不带参数的构造方法调用
// TODO Auto-generated method stub
this.real = real;
this.image = image;
}
Complex(double real,double image){ // 带参数的构造方法
this.real = real;
this.image = image;
}
public double getReal() {
return real;
}
public void setReal(double real) {
this.real = real;
}
public double getImage() {
return image;
}
public void setImage(double image) {
this.image = image;
}
Complex add(Complex a){ // 复数相加
double real2 = a.getReal();
double image2 = a.getImage();
double newReal = real + real2;
double newImage = image + image2;
Complex result = new Complex(newReal,newImage);
return result;
}
Complex sub(Complex a){ // 复数相减
double real2 = a.getReal();
double image2 = a.getImage();
double newReal = real - real2;
double newImage = image - image2;
Complex result = new Complex(newReal,newImage);
return result;
}
Complex mul(Complex a){ // 复数相乘
double real2 = a.getReal();
double image2 = a.getImage();
double newReal = real*real2 - image*image2;
double newImage = image*real2 + real*image2;
Complex result = new Complex(newReal,newImage);
return result;
}
Complex div(Complex a){ // 复数相除
double real2 = a.getReal();
double image2 = a.getImage();
double newReal = (real*real2 + image*image2)/(real2*real2 + image2*image2);
double newImage = (image*real2 - real*image2)/(real2*real2 + image2*image2);
Complex result = new Complex(newReal,newImage);
return result;
}
public void print(){ // 输出
if(image > 0){
System.out.println(real + " + " + image + "i");
}else if(image < 0){
System.out.println(real + "" + image + "i");
}else{
System.out.println(real);
}
}
}
public class MainClass { // 用于测试复数类
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("请用户输入第一个复数的实部和虚部:");
Complex data1 = new Complex();
System.out.println("请用户输入第二个复数的实部和虚部:");
Complex data2 = new Complex();
// 以下分别为加减乘除
Complex result_add = data1.add(data2);
Complex result_sub = data1.sub(data2);
Complex result_mul = data1.mul(data2);
Complex result_div = data1.div(data2);
result_add.print();
result_sub.print();
result_mul.print();
result_div.print();
}
}
测试结果:
- 以下是建立的模型:
- 从模型中可以看见在Complex类中定义了如下方法:
首先定义了实部real与虚部imaginary,并赋初值0
- getComplex()方法用于置数
- add()方法用于两个复数相加
- multi()方法用于两个复数相乘
- Minus()方法用于两个复数相减
- GetRealPatr()方法得到实部
- GetimaginaryPatr()方法得到实部
- tostring()方法把复数结合成为a+bi形势的字符串
(二)面向对象三要素
1.抽象
"去粗取精、化繁为简、由表及里、异中求同"。抽象就是抽出事物的本质特征而暂时不考虑他们的细节。对于复杂系统问题人们借助分层次抽象的方法进行问题求解;在抽象的最高层,可以使用问题环境的语言,以概括的方式叙述问题的解。在抽象的较低层,则采用过程化的方式进行描述。在描述问题解时,使用面向问题和面向实现的术语。程序设计中,抽象包括两个方面,一是过程抽象,二是数据抽象。
2.封装、继承与多态
面向对象(Object-Oriented)的三要素包括:封装、继承、多态。过程抽象的结果是函数,数据抽象的结果是抽象数据类型(Abstract Data Type,ADT),类可以作具有继承和多态机制的ADT,数据抽象才是OOP的核心和起源。
OOP三要素的第一个要素是封装,封装就是将数据与相关行为包装在一起以实现信息就隐藏。Java中用类进行封装。
封装实际上使用方法(method)将类的数据隐藏起来,控制用户对类的修改和访问数据的程度,从而带来模块化(Modularity)和信息隐藏(Information hiding)的好处;接口(interface)是封装的准确描述手段。
public abstract class Animal {
private String color;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public abstract String shout();
}
public class Dog extends Animal{
public String shout(){
return "汪汪";
}
public String toString(){
return "The Dog's color is " + this.getColor() +", and it shouts "+ this.shout() + "!";
}
}
public class Cat extends Animal{
public String shout(){
return "喵喵";
}
public String toString(){
return "The Cat's color is " + this.getColor() +", and it shouts "+ this.shout() + "!";
}
}
3.设计模式初步
(1)S.O.L.I.D原则
·SRP(Single Responsibility Principle,单一职责原则)
·OCP(Open-Closed Principle,开放-封闭原则)
·LSP(Liskov Substitusion Principle,Liskov替换原则)
·ISP(Interface Segregation Principle,接口分离原则)
·DIP(Dependency Inversion Principle,依赖倒置原则)
(2)模式与设计模式
计算机科学中有很多模式:
GRASP模式
分析模式
软件体系结构模式
设计模式:创建型,结构型,行为型
管理模式: The Manager Pool 实现模式
界面设计交互模式
这里面最重要的是设计模式
(3)设计模式实示例
设计模式有四个基本要素:
Pattern name:描述模式,便于交流,存档
Problem:描述何处应用该模式
Solution:描述一个设计的组成元素,不针对特例
Consequence:应用该模式的结果和权衡(trade-offs)
二、单元测试的好处:
减少问题出现,提高程序质量,在测试中进行项目,边改边写,可以将自己设计的项目不断优化
更快地定位问题出现在哪个模块,提高效率,减少成本,这有助于实现模块的“块内高内聚,块间低耦合”
三、心得体会:
这次实验较第一次实验而言,增加了软件的利用性,不仅要编辑、编译、运行、调试代码,还要建模,单元测试,所以这次实验遇到的最大问题就是软件的使用方面,安装,运行,每一步都有问题,首先是StarUML的安装,在下载完了之后不知道如何安装,好不容易安装好之后发现不能运行,感觉这次实验真的好复杂,有时候在想,不就就是编程嘛,咋就这么麻烦呢,难道编译好代码直接运行代码不行么!也许是自己接触的编程太少太浅显,还没有达到能将编程运用自如的境界,体会不到其中的便利。
首先,如果没有安装PPA的话,先用下面的命令来安装:sudo apt-get install software-properties-common如果已经安装,用上面的命令也没有问题,会提示已经已有最新版本,不会重复安装。PPA - Personal Package Archive,个人包档案然后用下面的命令来安装 Neovimsudo apt-add-repository ppa:neovim-ppa/stablesudo apt-get updatesudo apt-get install
Activity在启动的过程中需要获得一个ActivityRecord实体,表示Activity在ActivityManagerService中的状态,ActivityRecord创建与Activity的启动模式有关系:Activity有四种启动模式:standard:standard模式启动的Activity默认会进入启动它的Activity所属的任务栈TaskRecord这种启...
[[email protected] ironic]# cat test.logDEBUG:paramiko.transport:starting thread (client mode):0x8f9c0290LDEBUG:paramiko.transport:Local version/idstring: SSH-2.0-paramiko_2.7.1DEBUG:paramiko.transport:Remot...
一、关于舵机:舵机(英文叫Servo):它由直流电机、减速齿轮组、传感器和控制电路组成的一套自动控制系统。通过发送信号,指定输出轴旋转角度。舵机一般而言都有最大旋转角度(比如180度。)与普通直流电机的区别主要在,直流电机是一圈圈转动的,舵机只能在一定角度内转动,不能一圈圈转(数字舵机可以在舵机模式和电机模式中切换,没有这个问题)。普通直流电机无法反馈转动的角度信息,而舵机可以。用途也不同,普通直流电机一般是整圈转动做动力用,舵机是控制某物体转动一定角度用(比如机器人的关节)。舵机的形状和大小多的让人眼
数据库查询时,出现如下错误:Caused by: com.mysql.jdbc.exceptions.jdbc4MySQLSyntaxErrorException: In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'credit_server.cred...
Peer-to-Peer Sockets 工程入门作者:Brad Neuberg译者:gracepig [email protected]版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明作者:Brad Neuberg ;gracepig原文地址:http://www.onjava.com/pub/a/onjava/2003/12/03/p2pso
首先,这不是报错,这个结果是"迭代器"。可以用循环打开,还可以用" “.join()的方式打开。这里讲” ".join()的方式打开。来,看好:import jiebatxt_1 = "我说话真的不结巴啊,你信不信?"res = jieba.lcut(txt_1)#精确模式,返回一个列表类型,其中参数txt是表示文本的名字。吐字清晰版。print("---吐字清晰版---")print...
如何编译带Vulkan支持的PyTorch以及Android库,并在Android设备上通过Vulkan调用GPU进行推理
https://jingyan.baidu.com/article/546ae185d818941148f28c6c.html?qq-pf-to=pcqq.c2c禁用完运行代码出错bcdedit.exe /set nointegritychecks on //关闭签名bcdedit.exe /set nointegritychecks off //开签名设置元素数据时出错。该值..._1671465600
【单选题】下列关于Python的说法,错误的是()。【多选题】走查特点 (10.0分)【简答题】【留言板 】【提交代码文件、数据库文件及录像】 (1) 数据库信息如下图所示。 (2) 实现PHP页面中对数据库进行增删查的操作,效果如视频 “BBS.wmv”。【填空题】时间常数τ是表征________的常数。【简答题】请将下列程序补充完整,并将源代码和运行结果截图提交。 要求:从键盘输入任意实数,请...
1 项目背景及意义当前互联网信息越来越多,呈现指数增长的趋势。视频服务网站是互联网的重要组成部分,往往都存着数以万计的电影资源[1],用户打开电影网站时也许没有明确的目标,使得查找时所涉及的电影资源数量仍然巨大,并且很难轻松获得符合自己兴趣的新资源。在这种情况下,通过对用户行为信息和电影资源信息进行关联性分析来预测并推荐与用户喜好相符的电影,会很大程度上增加用户的观看兴趣。视频服务已经成为用户浏览互联网时最关注的服务之一,因而,提升在线视频服务的用户体验具有重要的研究价值[2]。而视频服务中的电影推荐系
出处: ISOIEC 13818-1PS流:PS流由PSGOP组成,每个PSGOP是由I帧起始的多帧集合,每个GOP之间没有相互依赖信息,可以剪切拼接。| PSGOP0 | PSGOP1 | PSGOP2 | PSGOP3 | PSGOP4 | ...... |PSGOP:PSGOP由一个或多个PS包组成,一个PS包包含一个PSH(PS Header)和若干个PES(Packetized Elem...