热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

20165230《Java程序设计》实验二(Java面向对象程序设计)实验报告一、实验报告封面课程:Java程序设计班级:1652班姓名:

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

一、实验报告封面

课程:Java程序设计 班级:1652班 姓名:田坤烨 学号:20165230 成绩:

指导教师:娄嘉鹏 实验日期:2018年4月16日

实验时间:15:45 - 17:20

实验序号:实验二 实验名称:Java面向对象程序设计

实验内容:

初步掌握单元测试和TDD

理解并掌握面向对象三要素:封装、继承、多态

初步掌握UML建模

熟悉S.O.L.I.D原则

了解设计模式

实验要求:

没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程;

完成实验、撰写实验报告,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等);

实验报告中统计自己的PSP(Personal Software Process)时间;

严禁抄袭。

二、实验内容及步骤

(一)单元测试

(1) 三种代码

伪代码

如果成绩小于0,转成“错误”

如果成绩小于60,转成“不及格”

如果成绩在60与70之间,转成“及格”

如果成绩在70与80之间,转成“中等”

如果成绩在80与90之间,转成“良好”

如果成绩在90与100之间,转成“优秀”

如果成绩大于100,转成“错误”

产品代码

public class MyUtil{

public static String percentage2fivegrade(int grade){

//如果成绩小于0,转成“错误”

if ((grade <0))

return "错误";

//如果成绩小于60&#xff0c;转成“不及格”

else if (grade <60)

return "不及格";

//如果成绩在60与70之间&#xff0c;转成“及格”

else if (grade <70)

return "及格";

//如果成绩在70与80之间&#xff0c;转成“中等”

else if (grade <80)

return "中等";

//如果成绩在80与90之间&#xff0c;转成“良好”

else if (grade <90)

return "良好";

//如果成绩在90与100之间&#xff0c;转成“优秀”

else if (grade <&#61; 100)

return "优秀";

//如果成绩大于100&#xff0c;转成“错误”

else

return "错误";

}

}

测试代码

import junit.framework.TestCase;

import org.junit.Test;

import static org.junit.Assert.*;

public class MyUtilTest extends TestCase {

&#64;Test

public void testNormal() {

assertEquals("不及格", MyUtil.percentage2fivegrade(55));

assertEquals("及格", MyUtil.percentage2fivegrade(65));

assertEquals("中等", MyUtil.percentage2fivegrade(75));

assertEquals("良好", MyUtil.percentage2fivegrade(85));

assertEquals("优秀", MyUtil.percentage2fivegrade(95));

}

&#64;Test

public void testException(){

assertEquals("错误",MyUtil.percentage2fivegrade(-55));

assertEquals("不及格",MyUtil.percentage2fivegrade(55));

}

&#64;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));

}

}

测试代码截图

dcb0b3b19d0f15603a7a3128881bb2c1.png

(二)以TDD的方式研究学习StringBuffer

伪代码

测试charAt方法&#xff1a;字符串中指定索引处的字符与原序列是否匹配

测试capacity方法&#xff1a;StringBuffer的容器容量

测试length方法&#xff1a;字符串长度

测试indexOf方法&#xff1a;子字符串的第一个字母在母字符串的位置

产品代码

public class StringBufferDemo{

StringBuffer buffer &#61; new StringBuffer();

public StringBufferDemo(StringBuffer buffer){

this.buffer &#61; buffer;

}

public Character charAt(int i){//字符串中指定索引处的字符与原序列是否匹配

return buffer.charAt(i);

}

public int capacity(){//StringBuffer的容器容量

return buffer.capacity();

}

public int length(){//字符串长度

return buffer.length();

}

public int indexOf(String buf) {//子字符串的第一个字母在母字符串的位置

return buffer.indexOf(buf);

}

}

测试代码

import junit.framework.TestCase;

import org.junit.Test;

import static org.junit.Assert.*;

public class StringBufferDemoTest extends TestCase {

StringBuffer string1 &#61; new StringBuffer("tiankunye");//测试9个字符

StringBuffer string2 &#61; new StringBuffer("tiankunye is learning");//测试21个字符

StringBuffer string3 &#61; new StringBuffer("tiankunye is learning java");//测试26个字符

&#64;Test

public void testCharAt(){//测试字符串中指定索引处的字符与原序列是否匹配

assertEquals(&#39;t&#39;,string1.charAt(0));

assertEquals(&#39;k&#39;,string2.charAt(4));

assertEquals(&#39;y&#39;,string3.charAt(7));

}

&#64;Test

public void testCapacity(){//测试StringBuffer的容器容量

assertEquals(25,string1.capacity());

assertEquals(37,string2.capacity());

assertEquals(42,string3.capacity());

}

&#64;Test

public void testindexOf() {//测试子字符串的第一个字母在母字符串的位置

assertEquals(4, string1.indexOf("kun"));

assertEquals(10, string2.indexOf("is"));

assertEquals(22, string3.indexOf("java"));

}

&#64;Test

public void testlength() {//测试字符串长度

assertEquals(9, string1.length());

assertEquals(21, string2.length());

assertEquals(26, string3.length());

}

}

测试代码截图

f6c65395697db465cc2bffe316ecb356.png

(三)体会OCP原则和DIP原则的应用

支持Byte类代码

import java.util.Objects;

abstract class Data {

abstract public void DisplayValue();

}

class Integer extends Data {

int value;

Integer() {

value&#61;100;

}

public void DisplayValue(){

System.out.println (value);

}

}

class Long extends Data {

long value;

Long() {

value&#61;(long)20165230;

}

public void DisplayValue(){

System.out.println (value);

}

}

class Byte extends Data {//Byte继承Data类

byte value;

Byte() {

value&#61;(byte)20165230;

}

public void DisplayValue(){

System.out.println (value);

}

}

// Pattern Classes

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 ByteFactory extends Factory {//ByteFactory继承工厂类

public Data CreateDataObject(){

return new Byte();

}

}

//Client classes

class Document {

Data data;

Document(Factory factory){

data &#61; factory.CreateDataObject();

}

public void DisplayData(){

data.DisplayValue();

}

}

public class MyDoc {

static Document d;

static Document c;

public static void main(String[] args) {

d &#61; new Document(new ByteFactory());

d.DisplayData();

c &#61; new Document(new LongFactory());

c.DisplayData();

}

}

代码运行截图

ff301adc3d78b64aa7977fe2ee696b01.png

(四)以TDD的方式开发一个复数类Complex

伪代码

(1)属性&#xff1a;复数包含实部和虚部两个部分&#xff0c;

double RealPart;复数的实部

double ImagePart;复数的虚部

getRealPart():返回复数的实部

getImagePart();返回复数的虚部

setRealPart():设置复数的实部

setImagePart();设置复数的虚部

输出形式&#xff1a;a&#43;bi

(2)方法&#xff1a;

①定义构造函数

public Complex()

public Complex(double R,double I)

②定义公有方法:加减乘除

Complex ComplexAdd(Complex a):实现复数加法

Complex ComplexSub(Complex a):实现复数减法

Complex ComplexMulti(Complex a):实现复数乘法

Complex ComplexDiv(Complex a):实现复数除法

③Override Object

public String toString():将计算结果转化为字符串形式并输出

产品代码

public class Complex {

// 定义属性并生成getter,setter

private double RealPart;

private double ImagePart;

// 定义构造函数

public Complex(){

}

public Complex(double R, double I){

this.RealPart &#61; R;

this.ImagePart &#61; I;

}

public double getRealPart() {

return RealPart;

}

public void setRealPart(double realPart) {

RealPart &#61; realPart;

}

public double getImagePart() {

return ImagePart;

}

public void setImagePart(double imagePart) {

ImagePart &#61; imagePart;

}

//Override Object

public boolean equals(Object obj){

if(this &#61;&#61; obj) {

return true;

}

if(!(obj instanceof Complex)) {

return false;

}

Complex complex &#61; (Complex) obj;

if(complex.RealPart !&#61; ((Complex) obj).RealPart) {

return false;

}

if(complex.ImagePart !&#61; ((Complex) obj).ImagePart) {

return false;

}

return true;

}

public String toString() {

String string &#61; "";

if (ImagePart > 0)

string &#61; RealPart &#43; "&#43;" &#43; ImagePart &#43; "i";

if (ImagePart &#61;&#61; 0)

string &#61; RealPart &#43; "";

if (ImagePart <0)

string &#61; RealPart &#43; " " &#43; ImagePart &#43; "i";

return string;

}

// 定义公有方法:加减乘除

Complex ComplexAdd(Complex a) {

return new Complex(RealPart&#43;a.RealPart,ImagePart&#43;a.ImagePart);

}

Complex ComplexSub(Complex a) {

return new Complex(RealPart-a.RealPart,ImagePart-a.ImagePart);

}

Complex ComplexMulti(Complex a) {

return new Complex(RealPart*a.RealPart-ImagePart*a.ImagePart,ImagePart*a.RealPart&#43;RealPart*a.ImagePart);

}

Complex ComplexDiv(Complex a) {

Complex d &#61; new Complex();

d.RealPart &#61; (this.RealPart * a.RealPart &#43; this.ImagePart * a.ImagePart)/(a.RealPart*a.RealPart&#43;a.ImagePart*a.ImagePart);

d.ImagePart &#61; (this.ImagePart * a.RealPart - this.RealPart * a.ImagePart)/(a.RealPart*a.RealPart&#43;a.ImagePart*a.ImagePart);

return d;

}

}

测试代码

import static org.junit.Assert.*;

import org.junit.Test;

import junit.framework.TestCase;

public class ComplexTest extends TestCase {

Complex complex &#61; new Complex(1,1);

&#64;Test

public void testAdd(){

assertEquals(new Complex(2.0,1.6), complex.ComplexAdd(new Complex(5.2,3.0)));

}

//测试加法

&#64;Test

public void testSub(){

assertEquals(new Complex(-2.0,-1.6), complex.ComplexSub(new Complex(5.2,3.0)));

}

//测试减法

&#64;Test

public void testMulti(){

assertEquals(new Complex(3.0,2.0), complex.ComplexMulti(new Complex(3.0,2.0)));

}

//测试乘法

&#64;Test

public void testDiv(){

assertEquals(new Complex(1.0,1.0), complex.ComplexDiv(new Complex(1.0,1.0)));

assertEquals(new Complex(0.0,0.0), complex.ComplexDiv(new Complex(1.0,0.0)));

//assertEquals(new Complex(0.0,0.0), complex.ComplexDiv(new Complex(3,4)));

//边缘测试

}

&#64;Test

public void testequals(){

assertEquals(true, complex.equals(new Complex(1.0,1.0)));

}

//测试判断相等

}

测试代码截图

6b9c5ab26b132bb75d3a400cf154f569.png

(五)使用StarUML对实验二中的代码进行建模

c5be0135956ffa7b5edac87beb9a9fce.png

三、实验遇到的问题

问题1&#xff1a;查询不到junit,如何导入Junit

1ed999ec86fa04d5fb66c95d357ac95c.png

问题1解决方案:通过学习学长学姐的博客&#xff0c;找到了解决方法&#xff0c;步骤如下&#xff1a;

打开File中的Project Structure

点击Dependencies,单击右上角的&#43;,然后选择第一个JARs...

找到下载IDEA的路径&#xff0c;在lib文件夹中找到junit-4.12.jar和junit,jar文件&#xff0c;点击ok

选中这两个包然后点击ok

问题2&#xff1a;Stringbuffer类的capcity()方法是什么意思&#xff1f;

问题2解决方案&#xff1a;通过查询API学习到是返回当前容量

9ea94494e938b0003c5f7f1a5321ead0.png

接着学习了狄维佳学姐的博客&#xff0c;了解到

如果小于16则默认容器的大小为16。如果大于16则会调用expandCapacity 函数进行容量的扩展。所以第一次append时&#xff0c;小于16则不需扩展&#xff0c;如果大于16则会直接扩展到34(162&#43;2)&#xff0c;比较得到大于append后的长度的话则用34&#xff0c;如果不 是则用append后的长度。此时capacity的大小等于append后的长度&#xff0c;如果在append的话&#xff0c;若不超过70(342&#43;2)的话&#xff0c;此时则capacity为70&#xff0c;如果超过70则继续用第二次append后的总长度。

问题3&#xff1a;如何实现复数的除法&#xff1f;

解决方案&#xff1a;首先通过上网查询学习到除法的运算法则

(a&#43;bi)/(c&#43;di)&#61;(ac&#43;bd)/(c^2 &#43; d^2) &#43;((bc-ad)/(c^2 &#43; d^2))i

接着通过代码中对abcd的定义套入公式便实现了复数的除法。

四、实验心得

单元测试的好处

单元测试可最大限度的减少bug

可快速定位bug&#xff0c;减少调试时间

可突破构思瓶颈

提高代码质量

在这次实验中学习到了如何进行Junit测试&#xff0c;并初步掌握了面向对象编程的过程&#xff0c;同时了解了TDD方式&#xff0c;OCP、DIP原则和SOLID原则&#xff0c;知道了模式的重要作用和设计模式在Java中的重要地位。通过对老师给出的例子进行学习扩充&#xff0c;运用了举一反三的学习方法&#xff0c;对编程有了进一步的认识和熟悉

五、PSP时间

步骤

耗时

百分比

|需求分析 | 40min | 9% |

| 设计 | 65min | 16% |

| 代码实现 | 120min | 29% |

|测试 | 60min | 15% |

|分析总结 | 120min | 29% |

六、参考资料



推荐阅读
author-avatar
撒药拿拉的唐小妄
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有