# 20202304 2021-2022-1 《資料結構與面向對象程式設計》實驗報告
課程:《程式設計與資料結構》
班級: 2023
姓名:何銳
學号:20202304
實驗教師:王志強
實驗日期:2021年9月30日
必修/選修: 必修
## 1.實驗内容
下載下傳安裝并使用IDEA,完成下面實驗(https://www.cnblogs.com/rocedu/p/6371315.html)。
1. 初步掌握單元測試和TDD
2. 了解并掌握面向對象三要素:封裝、繼承、多态
3. 初步掌握UML模組化
4. 完成藍墨雲上 (1)-(5)實驗。
## 2.實驗過程及結果
即雲班課上的實驗第(1)、(2)部分,着重于介紹程式設計和程式設計的基礎。程式設計前要把幹什麼、如何幹想清楚才能把程式寫對、寫好。
想用程式解決問題時,要會寫三種碼:
- 僞代碼
- 産品
- 代碼
- 測試代碼
僞代碼即易了解的人類語言,不涉及任何具體程式設計語言文法相關的語句。
從意圖層面來解決問題,
是
産品代碼最自然的、最好的注釋。
産品代碼即具體程式設計語言去實作功能。
測試代碼則負責查找Bug和驗證程式代碼有無問題,程式員對類實作的測試便叫做單元測試。
以下為(1)的例子:
僞代碼:
百分制轉五分制:
如果成績小于60,轉成“不及格”
如果成績在60與70之間,轉成“及格”
如果成績在70與80之間,轉成“中等”
如果成績在80與90之間,轉成“良好”
如果成績在90與100之間,轉成“優秀”
其他,轉成“錯誤”
産品代碼:
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
}
測試結果:

單元測試就完成了,一個暫時沒有什麼大問題的程式也就寫好了。
然後,是學習TDD即Test Driven Development,測試驅動開發
現在的思路恰好相反,我們思路是先寫測試代碼,再寫産品代碼。
TDD的一般步驟如下:
- 明确目前要完成的功能,記錄成一個測試清單
- 快速完成編寫針對此功能的測試用例
- 測試代碼編譯不通過(沒産品代碼呢)
- 編寫産品代碼
- 測試通過
- 對代碼進行重構,并保證測試通過(重構下次實驗練習)
- 循環完成所有功能的開發
下面是例子(通過TDD來學習StringBuffer):
測試:
程式:
(1)封裝與繼承
封裝:使用private關鍵字将類的某些資訊隐藏在類内部,不允許外部程式直接通路,通過該類提供的getter、setter方法通路。
繼承:子類繼承父類的屬性和方法,可以修改添加。
(需注意:一個子類隻能繼承一個父類,但可以疊加繼承)
有以下兩個程式分别展現繼承和多态
碼雲路徑:https://gitee.com/besti2023javads/hr20202304.git(有需要自取)
對一個Animal類做了簡單的模組化:
4. 完成藍墨雲上 (1)-(5)實驗
如圖:
(1)任務詳情
參考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST
參考http://www.cnblogs.com/rocedu/p/6736847.html
送出最後三個測試用例都通過的截圖,截圖上要有畫圖加水印,輸入自己的學号。

(2)任務詳情
參考 積極主動敲代碼,使用JUnit學習Java (http://www.cnblogs.com/rocedu/p/4837092.html)
參考http://www.cnblogs.com/rocedu/p/6736847.html
以 TDD的方式研究學習StringBuffer,送出你的單元測試用例和測試通過的截圖,截圖要加上學号水印。
3)任務詳情
實驗三 Java面向對象程式設計(http://www.cnblogs.com/rocedu/p/4472842.html)
參考http://www.cnblogs.com/rocedu/p/6736847.html
對設計模式示例進行擴充,體會OCP原則和DIP原則的應用,初步了解設計模式
用自己的學号%6進行取餘運算,根據結果進行代碼擴充:
0:讓系統支援Byte類,并在MyDoc類中添加測試代碼表明添加正确,送出測試代碼和運作結的截圖,加上學号水印
1:讓系統支援Short類,并在MyDoc類中添加測試代碼表明添加正确,送出測試代碼和運作結的截圖,加上學号水印
2:讓系統支援Boolean類,并在MyDoc類中添加測試代碼表明添加正确,送出測試代碼和運作結的截圖,加上學号水印
3:讓系統支援Long類,并在MyDoc類中添加測試代碼表明添加正确,送出測試代碼和運作結的截圖,加上學号水印
4:讓系統支援Float類,并在MyDoc類中添加測試代碼表明添加正确,送出測試代碼和運作結的截圖,加上學号水印
5:讓系統支援Double類,并在MyDoc類中添加測試代碼表明添加正确,送出測試代碼和運作結的截圖,加上學号水印
對設計模式示例擴充,Float型
4)任務詳情
送出:單元測試代碼和運作成功截圖及碼雲上代碼連結,截圖要加上學号水印
參考http://www.cnblogs.com/rocedu/p/6736847.html
任務:以TDD的方式開發一個複數類Complex,要求如下:
// 定義屬性并生成getter,setter
double RealPart;
double ImagePart;
(5)任務詳情
使用[WhiteStarUML](http://whitestaruml.sourceforge.net/)對實驗二中的代碼進行模組化,發類圖的截圖,加上學号水印。
參考http://www.cnblogs.com/rocedu/p/6736847.html
## 3. 實驗過程中遇到的問題和解決過程
1.junit一開始總是找不到,也不會使用。
後來通過課堂和b站課堂學會了使用方法。
2.複數程式自己寫了好多遍,不太能展現,也老是出錯。
後通過學習學長,并在老師的檔案和課件幫助下完成複數電腦。
3.不會使用starUML
後通過學習b站和婁老師的文章學會。