哈工大 软件构造Lab1的设计实现
2021年春季學期
計算學部《軟件構造》課程
Lab 1實驗報告
目錄
1. 實驗目標概述 3
2. 實驗環境配置 3
3. 實驗過程 6
3.1 Magic Squares 6
3.1.1 isLegalMagicSquare() 6
3.1.2 generateMagicSquare() 8
3.2 Turtle Graphics 10
3.2.1 Problem 1: Clone and import 10
3.2.2 Problem 3: Turtle graphics and drawSquare 10
3.2.3 Problem 5: Drawing polygons 11
3.2.4 Problem 6: Calculating Bearings 11
3.2.5 Problem 7: Convex Hulls 12
3.2.6 Problem 8: Personal art 12
3.2.7 Submitting 14
3.3 Social Network 14
3.3.1 設計/實現FriendshipGraph類 14
3.3.2 設計/實現Person類 15
3.3.3 設計/實現客戶端代碼main() 16
3.3.4 設計/實現測試用例 17
4. 實驗進度記錄 18
5. 實驗過程中遇到的困難與解決途徑 19
6. 實驗過程中收獲的經驗、教訓、感想 19
6.1 實驗過程中收獲的經驗和教訓 19
6.2 針對以下方面的感受 19
實驗目標概述
本次實驗通過求解三個問題,訓練基本 Java 編程技能,能夠利用 Java OO 開
發基本的功能模塊,能夠閱讀理解已有代碼框架并根據功能需求補全代碼,能夠
為所開發的代碼編寫基本的測試程序并完成測試,初步保證所開發代碼的正確性。
另一方面,利用 Git 作為代碼配置管理的工具,學會 Git 的基本使用方法。
? 基本的 Java OO 編程
? 基于 Eclipse IDE 進行 Java 編程
? 基于 JUnit 的測試
? 基于 Git 的代碼配置管理
實驗環境配置
在這里給出你的GitHub Lab1倉庫的URL地址。
https://github.com/ComputerScienceHIT/HIT-Lab1-1190200828
實驗過程
Magic Squares
該任務的目標:設計isLegalMagicSquare()函數,判定給定的幾個矩陣是否為magic
square;將給定的生成奇數階的magic
square的generateMagicSquare()函數作為靜態函數加入我的程序代碼中,將生成的矩陣存入6.txt并調用isLegalMagicSquare()判斷所生成的矩陣是否正確。該階段涉及到文件讀寫操作、對某些特定函數的調用(例如split等)、對部分異常的處理(例如矩陣中有負數、浮點數,或是行列數不相等)等。
isLegalMagicSquare()
1.根據實驗要求,我不能上來直接就去用magic矩陣的定義去判斷其正確性,即每行每列每個對角線的元素和都相等;而是應該先判斷給定的矩陣是否合理,即判斷行列數是否相等、矩陣中是否有浮點數、負數等。由此,我的想法是設置一個整型變量n = 0,對于txt文件先按行讀入,每讀入一行n++,直到讀完文件,此時n的值即為矩陣行數。然后,依舊是按行讀入文件,每讀入一行,將其存入String line中,并調用split(“\t”)將其分割并存入String[] line_cut,比較行數n與line_cut.length,不相等則輸出錯誤提示并返回false,后經過測試,當文件未用”\t”進行分割時,也會導n != line_cut.length,因此在這里一并輸出錯誤提示;然后判斷line_cut中的每一個元素是否都是正整數,按位尋訪line_cut,若出現某一位不在數字字符’0’-‘9’中,則輸出錯誤提示并返回false。綜上所述,即有如下代碼:
至此,isLegalMagicSquare()函數設計完畢;
generateMagicSquare()
程序代碼已經在ppt中給出,程序流程圖如下:
除該程序代碼外,需對該函數的輸入進行測試,以防輸入為偶數或負數。該測試在我的main函數中完成,輸入階數為負數或偶數或輸入階數小于2時輸出錯誤提示并予以重新輸入,但是,如果輸入根本并非整數,而是浮點數或字符時,則輸出錯誤提示且不允許重新輸入,于是有如下代碼:
除此之外,還需要在函數中加入文件寫入操作,將產生的magic矩陣存入6.txt以便于main函數中測試其生成的magic矩陣的正確性,添加的代碼如下:
結果展示:
Turtle Graphics
該任務的目標:clone已有的程序后,利用turtle按照要求畫圖,主要需要修改及再編程的是TurtleSoup類,其中的一些函數編程時需要結合我們已有的數學幾何知識、TurtleSoup類中的提示信息以及測試用的TurtleSoupTest類中的提示信息,最后可以發揮想象力進行自己的創作。
Problem 1: Clone and import
由于clone出現問題,找不到實驗報告上給的那個鏈接,所以我進入該鏈接后,將代碼逐個復制到我的程序類中。
初始化本地倉庫
git init
Problem 3: Turtle graphics and drawSquare
該函數需要實現:已知邊長,畫出邊長為指定數值的正方形。參數是海龜對象turtle和邊長sideLength。
循環執行,每次畫筆直行sideLength距離,然后畫筆方向旋轉90度,循環執行4次后即可得到所需要的正方形,函數代碼如下:
結果展示(sideLength = 40):
Problem 5: Drawing polygons
首先,要求計算已知正多邊形邊數的內角度,該計算由已知公式可以推導,因此相關函數代碼如下:
根據正方形的畫法,只需要將畫筆的轉向角度設置為180 –
內角度數,循環多邊形邊數次數即可。考慮到畫筆轉向既能是順時針又能是逆時針,故在此聲明:sides可為負數,且當sides為負整數時,代表著畫筆將逆時針旋轉,且旋轉度數為180
– 內角度數,并且取sides的絕對值為正多邊形邊數。函數代碼如下:
Problem 6: Calculating Bearings
首先,已知起點和當前朝向角度,要求起點到終點需要轉動的角度。根據幾何運算,得函數代碼如下:
上述問題的擴展:此時有若干個點,要求從第一個點開始到第二個點,再從第二個點到第三個點……以此類推每次轉向的角度。以起點為第一個點,循環n-1次,每次將第i+1號點設置為“終點”,通過上一個函數計算旋轉角度并存儲到List中,將下一次的“起點”用當前“終點”更新,繼續循環。程序代碼如下:
Problem 7: Convex Hulls
由凸包算法(CSDN(ConvexHull凸包算法之Gift-Wrapping_Innovative
Workstation-CSDN博客)上查閱),可得該函數代碼為:
Problem 8: Personal art
函數代碼:
結果展示:
Submitting
由于第一次提交時已經進行過初始化以及與我的云倉庫的關聯,本次提交中只需要添加文件、注釋以及提交三個步驟。
Social Network
該任務的目標:設計一張社交網絡無向圖,連接互為朋友的人與人,并且能計算任意兩人之間需要的最少的關聯路徑。于是,該問題為最短路徑問題,而構建的圖為無向無權圖,所以利用DFS深度優先遍歷即可得到兩點間的最短路徑。
設計/實現FriendshipGraph類
存儲圖中的人姓名的集合:
addVertex()函數:首先判斷Person
p是否在圖中,若已經存在于圖中,則輸出錯誤信息,程序結束;否則將p添加至person中。
addEdge()函數:在a、b的朋友列表里分別加入彼此。
getDistance()函數:DFS深度優先算法求最短路徑
設計/實現Person類
Person類包括:
Person():包括這個人的名字p_name,這個人的朋友列表friends;
IsFriendOf(Person p):在p_name的朋友列表里加入p;
設計/實現客戶端代碼main()
由ppt給出:
設計/實現測試用例
思想:將a通過addVertex()函數加入testGraph1中,b不加入,因此,測試用例為a在testGraph1.person中,b不在;
思想:將a、b通過addVertex()函數加入testGraph1中,調用addEdge()函數,在a、b加一條線,即關聯在一起,那么,a、b的朋友列表將包含彼此,因此測試用例中,a在b.friends中,b也在a.friends中;
思想:getDistance測試中應包括自己與自己、相互認識的兩人、相互不認識但是有中間人關聯的兩人以及互不相干的兩人;
測試結果:
至此,實驗設計結束。
總結
以上是生活随笔為你收集整理的哈工大 软件构造Lab1的设计实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pb+api实际应用
- 下一篇: opencv学习(三十五)之仿射变换wa