2018-2019-2 20175310 實驗二《Java面向對象程序設計》實驗報告
2018-2019-2 20175310 實驗二《Java面向對象程序設計》實驗報告
一、實驗步驟及內容
(一)、面向對象程序設計-1
參考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST
參考http://www.cnblogs.com/rocedu/p/6736847.html
提交最後三個測試用例都通過的截圖,截圖上要有畫圖加水印,輸入自己的學號。
1、在IDEA中安裝JUnit
插件,選擇File->Setting
打開設置對話框:
2、在設置對話框中選擇Plugins
, 單擊Installed
,在插件安裝對話框的搜索中輸入junit
,單擊JunitGenerator V2.0
Install
按鈕安裝:3、我們在IDEA中新建一個項目,然後新建一個類MyUtil
,我們要在一個MyUtil
類中解決一個百分制成績轉成“優、良、中、及格、不及格”五級制成績的功能。
針對上面的問題,我們可以通過偽代碼這樣解決:
百分制轉五分制:
如果成績小於60,轉成“不及格”
如果成績在60與70之間,轉成“及格”
如果成績在70與80之間,轉成“中等”
如果成績在80與90之間,轉成“良好”
如果成績在90與100之間,轉成“優秀”
其他,轉成“錯誤”
4、有了偽代碼,我們用特定編程語言翻譯一下,就是可用的產品代碼了,產品代碼如下:
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 "錯誤"; } }
5、在 IDEA中我們把產品代碼放在src
目錄中,把測試代碼放在test
目錄中,右鍵單擊項目,在彈出的菜單中選擇New->Directory
新建一個目錄:
6、輸入目錄名test
:
7、設置SOURCEPATH
環境變量,右鍵單擊test
目錄,在彈出的菜單中選擇Mark Directory as->Test Sources Root
:
8、鼠標單擊類名會出現一個燈泡狀圖標,單擊圖標或按Alt + Entert
,在彈出的菜單中選擇Create Test
:
9、選擇創建JUnit3
的測試用例 :
9、測試代碼如下:
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 testExceptions(){//測試出錯情況 assertEquals("錯誤", MyUtil.percentage2fivegrade(105)); assertEquals("錯誤", MyUtil.percentage2fivegrade(-55)); } @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)); } }
10、測試代碼及結果如下圖:
(二)、面向對象程序設計-2
參考 積極主動敲代碼,使用JUnit學習Java (http://www.cnblogs.com/rocedu/p/4837092.html)
參考http://www.cnblogs.com/rocedu/p/6736847.html
以 TDD
的方式研究學習StringBuffer
,提交你的單元測試用例和測試通過的截圖,截圖要加上學號水印。
1、產品代碼:
public class StringBufferDemo{
StringBuffer str=new StringBuffer();
StringBufferDemo(StringBuffer str){
this.str=str;
}
public char charAt(int i){
return str.charAt(i);
}
public int capacity(){
return str.capacity();
}
public int length(){
return str.length();
}
public int indexOf(String buf) {
return str.indexOf(buf);
}
}
2、測試代碼:
import junit.framework.TestCase;
import org.junit.Test;
public class StringBufferDemoTest extends TestCase {
StringBuffer a = new StringBuffer("StringBuffer");//測試12個字符(<=16)
StringBuffer b = new StringBuffer("StringBufferStringBuffer");//測試24個字符(>16&&<=34)
StringBuffer c = new StringBuffer("StringBufferStringBufferStringBuffer");//測試36個字符(>34)
@Test
public void testcharAt(){
assertEquals('S',a.charAt(0));
assertEquals('B',a.charAt(6));
assertEquals('r',a.charAt(11));
}
@Test
public void testcapacity(){
assertEquals(28,a.capacity());
assertEquals(40,b.capacity());
assertEquals(52,c.capacity());
}
@Test
public void testlength(){
assertEquals(12,a.length());
assertEquals(24,b.length());
assertEquals(36,c.length());
}
@Test
public void testindexOf(){
assertEquals(0,a.indexOf("Str"));
assertEquals(6,a.indexOf("Buff"));
assertEquals(10,a.indexOf("er"));
}
}
3、測試結果截圖:
(三)、面向對象程序設計-3
實驗二 Java面向對象程序設計(http://www.cnblogs.com/rocedu/p/4472842.html)
參考http://www.cnblogs.com/rocedu/p/6736847.html
對設計模式示例進行擴充,體會OCP
原則和DIP
原則的應用,初步理解設計模式
讓系統支持Float
類,並在MyDoc
類中添加測試代碼表明添加正確,提交測試代碼和運行結的截圖,加上學號水印
1、產品代碼:
// Server Classes
abstract class Data {
abstract public void DisplayValue();
}
class Integer extends Data {
int value;
Integer() {
value=100;
}
public void DisplayValue(){
System.out.println (value);
}
}
class Float extends Data {
float value;
Float() {
value=1.23456F;
}
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 FloatFactory extends Factory {
public Data CreateDataObject(){
return new Float();
}
}
class Document { //Client classes
Data pd;
Document(Factory pf){
pd = pf.CreateDataObject();
}
public void DisplayData(){
pd.DisplayValue();
}
}
//Test class
public class MyDoc {
static Document d,f;
public static void main(String[] args) {
d = new Document(new IntFactory());
d.DisplayData();
f = new Document(new FloatFactory());
f.DisplayData();
}
}
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、產品代碼:
Complex.java
public class Complex {
// 定義屬性並生成getter,setter
double RealPart;
double ImagePart;
void setRealPart(double r){
RealPart=r;
}
void setImagePart(double i){
ImagePart=i;
}
double getRealPart(Complex a){
return a.RealPart;
}
double getImagePart(Complex a){
return a.ImagePart;
}
// 定義構造函數
public Complex(double r,double i){
RealPart=r;
ImagePart=i;
}
//Override Object
public String toString(){
String result = new String();
if (ImagePart>0)
result = RealPart+"+"+ImagePart+"i";
if (ImagePart==0)
result = RealPart+"";
if (ImagePart<0)
result = RealPart+"-"+ImagePart*(-1)+"i";
return result;
}
public Complex ComplexAdd(Complex a){
return new Complex(RealPart+a.RealPart,ImagePart+a.ImagePart);
}
public Complex ComplexSub(Complex a){
return new Complex(RealPart-a.RealPart,ImagePart-a.ImagePart);
}
public Complex ComplexMulti(Complex a){
return new Complex(RealPart*a.RealPart-ImagePart*a.ImagePart,RealPart*a.ImagePart+ImagePart*a.RealPart);
}
public Complex ComplexDiv(Complex a){
double d = Math.sqrt(a.RealPart * a.RealPart) + Math.sqrt(a.ImagePart * a.ImagePart);
return new Complex((RealPart*a.RealPart+ImagePart*a.ImagePart)/d,(ImagePart*a.RealPart-RealPart*a.ImagePart)/d);
}
}
ComplexDemo.java
public class ComplexDemo {
public static void main(String[] a) {
Complex b = new Complex(2, 6);
Complex c = new Complex(1, -3);
System.out.println("("+b + ")+(" + c + ")=" + b.ComplexAdd(c));
System.out.println("("+b + ")-(" + c + ")=" + b.ComplexSub(c));
System.out.println("("+b + ")*(" + c + ")=" + b.ComplexMulti(c));
System.out.println("("+b + ")/(" + c + ")=" + b.ComplexDiv(c));
}
}
2、測試代碼:
import junit.framework.TestCase;
import org.junit.Test;
public class ComplexTest extends TestCase {
Complex b = new Complex(2,6);
Complex c = new Complex(1,-3);
@Test
public void testComplexAdd(){
assertEquals("3.0+3.0i",b.ComplexAdd(c)+"");
}
@Test
public void testComplexSub(){
assertEquals("1.0+9.0i",b.ComplexSub(c)+"");
}
@Test
public void testComplexMulti(){
assertEquals("20.0",b.ComplexMulti(c)+"");
}
@Test
public void testComplexDiv(){
assertEquals("-4.0+3.0i",b.ComplexDiv(c)+"");
}
}
3、測試結果截圖:
(五)、面向對象程序設計-5
使用WhiteStarUML對實驗二中的代碼進行建模,發類圖的截圖,加上學號水印。
參考http://www.cnblogs.com/rocedu/p/6736847.html
二、實驗過程中遇到的問題及其解決
問題1:
在做第四個實驗的時候,當復數的虛部為負時,表達式顯示錯誤:
問題1解決方案:
首先用()
把兩個復數隔開,更加清晰
然後判斷虛部的正負,當虛部為負時,將ImagePart*(-1)
作為一個整體輸出。
- 問題2:
測試代碼時,提示不正確
問題2解決方案:
可以看到提示說,希望得到的和實際得到的,看起來是一樣的,但是編譯不通過,所以應該是類型不同。
將計算結果最後加上“”
,將結果轉換成字符串類型,就可以編譯通過了。
三、碼雲鏈接
四、參考代碼
Intellj IDEA 簡易教程
實驗二《Java面向對象程序設計》的一點說明
積極主動敲代碼,使用JUnit學習Java
實驗二 Java面向對象程序設計
五、PSP時間
步驟 | 耗時(min) | 百分比 |
---|---|---|
需求分析 | 30 | 13% |
設計 | 40 | 17% |
代碼實現 | 90 | 39% |
測試 | 30 | 13% |
分析總結 | 40 | 17% |
2018-2019-2 20175310 實驗二《Java面向對象程序設計》實驗報告