2017-2018-2 20165221实验二《Java面向对象程序设计》实验报告
JAVA实验二报告
课程:Java程序设计
姓名:谭笑
学号:20165221 实验时间:2018.4.13--2018.4.15
实验2--1
实验内容
实现百分制成绩转成“优、良、中、及格、不及格”五级制成绩的功能
提交要求
提交最后三个测试用例都通过的截图,截图上要有画图加水印,输入自己的学号。
实验具体操作
- 先通过思考产生伪代码,再选择用Java语言描述,即产生了产品代码
public class MyUtil{
public static String percentage2fivegrade(int grade){
//如果成绩小于0,转成“错误”
if ((grade < 0))
return "错误";
//如果成绩小于60,转成“不及格”
else if (grade < 60)
return "不及格";
//如果成绩在60与70之间,转成“及格”
else if (grade < 70)
return "及格";
//如果成绩在70与80之间,转成“中等”
else if (grade < 80)
return "中等";
//如果成绩在80与90之间,转成“良好”
else if (grade < 90)
return "良好";
//如果成绩在90与100之间,转成“优秀”
else if (grade <= 100)
return "优秀";
//如果成绩大于100,转成“错误”
else
return "错误";
}
}
- 写测试代码
从正常值,错误值,边界值,三个角度对代码进行测试
()
在对边界值的错误进行测试时,发现了一个bug,即在判断优秀时,未将100包含在内。
然后,我修改了产品代码,做了如下改动
此时再运行测试用例,显示正常
但是就上图如果真的出现test failed
,想要解决的话,则需要新建测试,具体操作见下
重新编写测试代码
import org.junit.Test;
import junit.framework.TestCase;
public class MyUtilTest extends TestCase {
@Test
public void testNormal() {
assertEquals("不及格", MyUtil.percentage2fivegrade(55));
assertEquals("及格", MyUtil.percentage2fivegrade(65));
assertEquals("中等", MyUtil.percentage2fivegrade(75));
assertEquals("良好", MyUtil.percentage2fivegrade(85));
assertEquals("优秀", MyUtil.percentage2fivegrade(95));
}
}
运行,此时运行,会显示自己的断言与实际的差距。
- 小结 这一部分主要是边界值和考虑问题全面与否的问题,就上面的例子,有多个角度进行测试,自己能力有限,只是选取了老师提供的几个思考角度,进行了测试验证,重点还是掌握整体的思路,理解伪代码到产品代码再到测试代码,由测试代码发现的问题再返回修改产品代码的过程。
实验2--2
实验内容
以TDD的方式研究学习StringBuffer
实验操作
- 根据老师给的代码
理解代码意思
StringBuffer( ):分配16个字符的缓冲区
length():返回字符串的长度
harAt(int i) :返回此序列中指定索引处的 char 值。第一个 char 值在索引 0 处,第二个在索引 1 处,依此类推
indexOf(String s):返回输入的子字符串的第一个字母在母字符串的位置
capacity():返回string分配的存储容量
- 然后自己设置了几个长度不同的字符串进行测试
我按照自己的学号设置了字符串5221xuexijava
,在增长代码长度时,选择了重复上述字符串,测试代码如下
实验代码
import org.junit.Test;
import junit.framework.TestCase;
public class StringBufferDemoTest extends TestCase {
StringBuffer a = new StringBuffer("5221xuexijava");
StringBuffer b = new StringBuffer("5221xuexijava5221xuexijava");
StringBuffer c = new StringBuffer("5221xuexijava5221xuexijava5221xuexijava");
@Test
public void testcharAt() throws Exception {
assertEquals('u', a.charAt(5));
assertEquals('2', c.charAt(1));
assertEquals('j', c.charAt(9));
}
@Test
public void testcapacity() throws Exception {
assertEquals(29, a.capacity());
assertEquals(55, c.capacity());
assertEquals(55, c.capacity());
}
@Test
public void testlength() throws Exception {
assertEquals(13, a.length());
assertEquals(39, c.length());
assertEquals(39, c.length());
}
}
- 其运行结果如下:
实验2-3
实验内容
对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式
用自己的学号%6进行取余运算:
-
0:让系统支持Byte类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
-
让系统支持Short类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
-
让系统支持Boolean类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
-
让系统支持Long类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
-
让系统支持Float类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
-
让系统支持Double类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
实验操作
我选择第一个:即支持byte
类,实验代码如下:
import java.util.Objects;
abstract class Data {
abstract public void DisplayValue();
}
class Integer extends Data {
int value;
Integer() {
value=100;
}
public void DisplayValue(){
System.out.println (value);
}
}
class Long extends Data {
long value;
Long() {
value=(long)20165221;
}
public void DisplayValue(){
System.out.println (value);
}
}
class Byte extends Data {//Byte继承Data类
byte value;
Byte() {
value=(byte)20165221;
}
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 = factory.CreateDataObject();
}
public void DisplayData(){
data.DisplayValue();
}
}
public class StringBufferDemoTest {
static Document d;
static Document c;
public static void main(String[] args) {
d = new Document(new ByteFactory());
d.DisplayData();
c = new Document(new LongFactory());
c.DisplayData();
}
}
测试代码如下:
import static org.junit.Assert.*;
import org.junit.Test;
import junit.framework.TestCase;
public class ComplexTest extends TestCase {
Complex complex = new Complex(1,1);
@Test
public void testAdd(){
assertEquals(new Complex(2.0,1.6), complex.ComplexAdd(new Complex(5.2,2.1)));
}
//测试加法
@Test
public void testSub()
assertEquals(new Complex(-2.0,-1.6), complex.ComplexSub(new Complex(5.2,3.0)));
}
//测试减法
@Test
public void testMulti(){
assertEquals(new Complex(3.0,2.0), complex.ComplexMulti(new Complex(3.0,2.0)));
}
//测试乘法
@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)));
//边缘测试
}
@Test
public void testequals(){
assertEquals(true, complex.equals(new Complex(1.0,1.0)));
}
//测试判断相等
}
运行结果如下:
实验2-4
实验内容
-
参考博客
-
任务:以TDD的方式开发一个复数类Complex,要求如下:
实验过程
- 还是按照先伪代码的思路
// 定义属性并生成getter,setter
double RealPart;
double ImagePart;
// 定义构造函数
public Complex()
public Complex(double R,double I)
//Override Object
public boolean equals(Object obj)
public String toString()
// 定义公有方法:加减乘除
Complex ComplexAdd(Complex a)
Complex ComplexSub(Complex a)
Complex ComplexMulti(Complex a)
Complex ComplexDiv(Complex a)
(1)属性:复数包含实部和虚部两个部分,
double RealPart;复数的实部
double ImagePart;复数的虚部
getRealPart():返回复数的实部
getImagePart();返回复数的虚部
setRealPart():设置复数的实部
setImagePart();设置复数的虚部
输出形式:a+bi
(2)方法:
①定义构造函数
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 = R;
this.ImagePart = I;
}
public double getRealPart() {
return RealPart;
}
public void setRealPart(double realPart) {
RealPart = realPart;
}
public double getImagePart() {
return ImagePart;
}
public void setImagePart(double imagePart) {
ImagePart = imagePart;
}
//Override Object
public boolean equals(Object obj){
if(this == obj) {
return true;
}
if(!(obj instanceof Complex)) {
return false;
}
Complex complex = (Complex) obj;
if(complex.RealPart != ((Complex) obj).RealPart) {
return false;
}
if(complex.ImagePart != ((Complex) obj).ImagePart) {
return false;
}
return true;
}
public String toString() {
String string = "";
if (ImagePart > 0)
string = RealPart + "+" + ImagePart + "i";
if (ImagePart == 0)
string = RealPart + "";
if (ImagePart < 0)
string = RealPart + " " + ImagePart + "i";
return string;
}
// 定义公有方法:加减乘除
Complex ComplexAdd(Complex a) {
return new Complex(RealPart+a.RealPart,ImagePart+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+RealPart*a.ImagePart);
}
Complex ComplexDiv(Complex a) {
Complex d = new Complex();
d.RealPart = (this.RealPart * a.RealPart + this.ImagePart * a.ImagePart)/(a.RealPart*a.RealPart+a.ImagePart*a.ImagePart);
d.ImagePart = (this.ImagePart * a.RealPart - this.RealPart * a.ImagePart)/(a.RealPart*a.RealPart+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 = new Complex(1,1);
@Test
public void testAdd(){
assertEquals(new Complex(2.0,1.6), complex.ComplexAdd(new Complex(5.2,3.0)));
}
//测试加法
@Test
public void testSub(){
assertEquals(new Complex(-2.0,-1.6), complex.ComplexSub(new Complex(5.2,3.0)));
}
//测试减法
@Test
public void testMulti(){
assertEquals(new Complex(3.0,2.0), complex.ComplexMulti(new Complex(3.0,2.0)));
}
//测试乘法
@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)));
//边缘测试
}
@Test
public void testequals(){
assertEquals(true, complex.equals(new Complex(1.0,1.0)));
}
//测试判断相等
}
使用StarUML对实验二中的代码进行建模
存在的问题解决
- 在找until的位置,配置时,自己开始找不到,最后倒回去看博客,下载了everything,查找,
通过最终找到适配成功!
- 在进行实验2-2设置字符串时,我看给的例子的字符串都是英文字母,自己换成了英文字母加自己学号的设置,就是要注意字符所占的长度
- 在使用markdown在线编辑时,自己在有道云上能够顺利编译,但是粘贴到博客园上,就出现下面代码格式错误的问题,
文字描述
即把中间的文字部分代码化了,后来通过调整排版才解决。
总结
这次试验自己做的还是很认真的,也花了很多时间,测试代码都是根据实例代码,然后按照要求,改成包含自己学号信息的格式编译运行的!这次的收获应该算不小了,因为上周修过一次电脑,所有东西都重装了,自己也从jdk配置开始,又重头学习了一遍idea,及整个实验。
但是还有很多不足:
- 比如实验2--2成绩判定的程序,其实有很多个测试方面,除了边界值,临界值,输出错误等,自己并没有想到新的角度只是按照老师给的方向,进行了测试。
- 对idea的操作还不是很熟悉,重装了idea后,自己操作时,发现很多步骤,比如新建test,在实验代码上新建测试的方法都没有记住,还是熟能生巧吧。
总助,这次试验比第一次繁琐很多,自己相比第一次花了更多的时间来完成此次试验,收获还是有的!