1. 程式人生 > >20175330 實驗二《Java面向對象程序設計》實驗報告

20175330 實驗二《Java面向對象程序設計》實驗報告

actor for pla 加減 play -i pac oid jdi

一、前期準備:
unit的安裝與使用:
打開idea,Preferences中點擊Plugins,在market中搜索junit,如圖點選JUnitGenerator V2.0進行安裝,安裝後會顯示installed。 技術分享圖片

新建立的文件可以點擊小燈泡,建立test文件,或者選中類名,Go to>test,新建test文件並勾選要測試的方法即可
點擊File——>Progect------->Dependencies導入包。 技術分享圖片

二、實驗步驟:
任務一:在一個MyUtil類中解決一個百分制成績轉成“優、良、中、及格、不及格”五級制成績的功能。
偽代碼:
```
百分制轉五分制:
如果成績小於60,轉成“不及格”
如果成績在60與70之間,轉成“及格”
如果成績在70與80之間,轉成“中等”
如果成績在80與90之間,轉成“良好”
如果成績在90與100之間,轉成“優秀”
其他,轉成“錯誤”
``` 產品代碼:
```
public class MyUtil{
public static String percentage2fivegrade(int grade){
//如果成績小於60,轉成“不及格”
if (grade<60&&grade>=0)
return "不及格";
//如果成績在60與70之間,轉成“及格”
else if (grade < 70&&grade>=60)
return "及格";
//如果成績在70與80之間,轉成“中等”
else if (grade < 80&&grade>=70)
return "中等";
//如果成績在80與90之間,轉成“良好”
else if (grade < 90&&grade>=80)
return "良好";
//如果成績在90與100之間,轉成“優秀”
else if (grade <= 100&&grade>=90)
return "優秀";
//其他,轉成“錯誤”
else
return "錯誤";
}
}
``` 測試代碼:
```
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));
}
@Test
public void testException(){
assertEquals("錯誤",MyUtil.percentage2fivegrade(-55));
assertEquals("錯誤",MyUtil.percentage2fivegrade(105));
}
@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));
}
}
``` 結果截圖 技術分享圖片

任務二:以TDD的方式研究學習StringBuffer

產品代碼:
```
public class StringBufferDemo{
StringBuffer buffer = new StringBuffer();
public StringBufferDemo(StringBuffer buffer){
this.buffer = buffer;
}
public Character charAt(int i){
return buffer.charAt(i);
}
public int capacity(){
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.*;
// 20175308
public class StringBufferDemoTest extends TestCase {
StringBuffer a = new StringBuffer("StringBuffer");
StringBuffer b = new StringBuffer("StringBufferStringBuffer");
StringBuffer c = new StringBuffer("StringBuffer tested by 175308");
@Test
public void testCharAt() throws Exception{
assertEquals(‘S‘,a.charAt(0));//驗證返回是否是整個字符串中的第一個字符
assertEquals(‘g‘,b.charAt(5));//驗證返回是否是整個字符串的第六個字符
assertEquals(‘t‘,c.charAt(16));
}
@Test
public void testcapacity() throws Exception{//
assertEquals(28,a.capacity());
assertEquals(40,b.capacity());
assertEquals(45,c.capacity());
}
@Test
public void testlength() throws Exception{
assertEquals(12,a.length());//驗證字符串a的長度
assertEquals(24,b.length());
assertEquals(29,c.length());
}
@Test
public void testindexOf(){
assertEquals(6,a.indexOf("Buff"));
assertEquals(3,b.indexOf("ing"));
assertEquals(23,c.indexOf("1753"));
}
}
```
結果截圖: 技術分享圖片

任務三:對設計模式示例進行擴充,體會OCP原則和DIP原則的應用,初步理解設計模式 依據OCP原則和DIP原則, 在擴充示例使其支持Boolean類時不應該直接添加或修改已有類中的方法(OCP原則要求軟件實體對修改封閉), 而是采用一種抽象工廠的方法來進行對於程序的擴充。 具體代碼如下:
```
abstract class Data {
abstract public void DisplayValue();
}
class Integer extends Data {
int value;
Integer() {
value=100;
}
public void DisplayValue(){
System.out.println (value);
}
}
class Boolean extends Data{
boolean value;
Boolean(){
value=true;
}
public void DisplayValue(){
System.out.println(value);
}
}
abstract class Factory {
abstract public Data CreateDataObject();
}
class IntFactory extends Factory {
public Data CreateDataObject(){
return new Integer();
}
}
class BooleanFactory extends Factory{
public Data CreateDataObject(){
return new Boolean();
}
}
class Document {
Data pd;
Document(Factory pf){
pd = pf.CreateDataObject();
}
public void DisplayData(){
pd.DisplayValue();
}
}
//Test class
public class MyDoc {
static Document d;
static Document e;
public static void main(String[] args) {
d = new Document(new IntFactory());
d.DisplayData();
e=new Document(new BooleanFactory());
e.DisplayData(); }
}
``` 運行成功截圖: 技術分享圖片

任務四:以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)
```
測試代碼:
```
import org.junit.Test;
import junit.framework.TestCase;
public class ComplexTest extends TestCase {
Complex a =new Complex(3.0,4.0);
Complex b =new Complex( 2.0,-4.0);
Complex c =new Complex(0.0,0.0);
Complex d =new Complex(-3.0,0.0);
Complex e =new Complex(-6.0,-0.8);
@Test
public void testgetRealPart()throws Exception{
assertEquals(3.0,a.getRealPart());
assertEquals(2.0,b.getRealPart());
assertEquals(0.0,c.getRealPart());
assertEquals(-3.0,d.getRealPart());
assertEquals(-6.0,e.getRealPart());
}
@Test
public void testgetImagePart()throws Exception{
assertEquals(4.0,a.getImagePart());
assertEquals(-4.0,b.getImagePart());
assertEquals(0.0,c.getImagePart());
assertEquals(0.0,d.getImagePart());
assertEquals(0.8,e.getImagePart()); }
@Test
public void testtoString()throws Exception{
assertEquals("3.0+4.0i",a.toString());
assertEquals("2.0-4.0i",b.toString());
assertEquals("0",c.toString());
assertEquals("-3.0",d.toString());
assertEquals("-6.0-8.0i",e.toString());
}
@Test
public void testComplexAdd()throws Exception{
assertEquals("5.0",a.ComplexAdd(b).toString());
assertEquals("2.0-4.0i",b.ComplexAdd(c).toString());
assertEquals("-1.0-4.0i",b.ComplexAdd(d).toString());
}
@Test
public void testComplexSub()throws Exception{
assertEquals("1.0+8.0i",a.ComplexSub(b).toString());
assertEquals("-2.0+4.0i",c.ComplexSub(b).toString());
assertEquals("3.0",c.ComplexSub(d).toString());
}
@Test
public void testComplexMulti()throws Exception{
assertEquals("22.0-4.0i",a.ComplexMulti(b).toString());
assertEquals("0",b.ComplexMulti(c).toString());
assertEquals("18.0+2.4i",d.ComplexMulti(e).toString());
}
@Test
public void testComplexDiv()throws Exception{
assertEquals("-0.2-1.25i",a.ComplexDiv(b).toString());
assertEquals("0",c.ComplexDiv(b).toString());
}
@Test
public void testequals()throws Exception{
assertEquals(true,a.equals(a));
assertEquals(false,a.equals(b)); }
}
```
產品代碼:
```
import com.sun.jdi.DoubleValue;
import java.util.zip.CheckedOutputStream;
import java.text.DecimalFormat; public class Complex {
double RealPart=0;
double ImagePart=0;
public Complex(){}
public Complex(double RealPart,double ImagePart){
this.RealPart=RealPart;
this.ImagePart=ImagePart; }
public double getRealPart(){
return RealPart;
}
public double getImagePart(){
return ImagePart;
}
public String toString(){
String s = "";
double r=RealPart;
double i=ImagePart;
if(r==0&&i==0){
s="0";
}
else if(r==0&&i!=0){
s=i+"i";
}
else if(r!=0&&i<0){
s=r+""+i+"i";
}
else if(r!=0&&i==0){
s=r+"";
}
else
{
s=r+"+"+i+"i";
}
return s;
}
public boolean equals(Object obj){
if(this==obj){
return true;
}
else return false;
}
DecimalFormat df = new DecimalFormat( "0.0");
public Complex ComplexAdd(Complex a){
return new Complex(RealPart+a.getRealPart(),ImagePart+a.getImagePart());
}
public Complex ComplexSub(Complex a){
return new Complex(RealPart-a.getRealPart(),ImagePart-a.getImagePart());
}
public Complex ComplexMulti(Complex a){
double r=RealPart*a.getRealPart()-ImagePart*a.getImagePart();
double i =ImagePart*a.getRealPart()+RealPart*a.getImagePart();
return new Complex(Double.valueOf(df.format(r)),Double.valueOf(df.format(i)));
}
public Complex ComplexDiv(Complex a){
double r=(RealPart * a.ImagePart + ImagePart * a.RealPart) / (a.ImagePart * a.ImagePart + a.RealPart * a.RealPart);
double i=(ImagePart * a.ImagePart + RealPart * a.RealPart) / (a.RealPart * a.RealPart + a.RealPart * a.RealPart);
return new Complex(Double.valueOf(df.format(r)),Double.valueOf(df.format(i)));
}
}
```
測試成功截圖: 技術分享圖片


任務五:對實驗二中的代碼進行建模

任務要求類圖中至少要有兩個類,符合要求的是MyDoc.java的代碼,UML圖如下:

技術分享圖片

實驗中遇到的問題及解決:

1.下載Junit後仍然出現標紅無法使用。

File菜單欄找到Project Structure

將包勾選好

技術分享圖片

20175330 實驗二《Java面向對象程序設計》實驗報告