哈工大软件构造Lab1实验报告
?
2020年春季學期
計算機學院《軟件構造》課程
Lab 1實驗報告
目錄
?
1 實驗目標概述... 1
2 實驗環境配置... 1
3 實驗過程... 1
3.1 Magic Squares. 1
3.1.1 isLegalMagicSquare(). 1
3.1.2 generateMagicSquare(). 1
3.2 Turtle Graphics. 1
3.2.1 Problem 1: Clone and import 2
3.2.2 Problem 3: Turtle graphics and drawSquare. 2
3.2.3 Problem 5: Drawing polygons. 2
3.2.4 Problem 6: Calculating Bearings. 2
3.2.5 Problem 7: Convex Hulls. 2
3.2.6 Problem 8: Personal art 2
3.2.7 Submitting. 2
3.3 Social Network. 2
3.3.1 設計/實現FriendshipGraph類... 2
3.3.2 設計/實現Person類... 2
3.3.3 設計/實現客戶端代碼main(). 2
3.3.4 設計/實現測試用例... 3
4 實驗進度記錄... 3
5 實驗過程中遇到的困難與解決途徑... 3
6 實驗過程中收獲的經驗、教訓、感想... 3
6.1 實驗過程中收獲的經驗和教訓... 3
6.2 針對以下方面的感受... 3
?
?
1.實驗目標概述
? ? ? ??本次實驗通過求解三個問題,訓練基本Java編程技能,能夠利用Java OO開 發基本的功能模塊,能夠閱讀理解已有代碼框架并根據功能需求補全代碼,能夠 為所開發的代碼編寫基本的測試程序并完成測試,初步保證所開發代碼的正確性。另一方面,利用Git作為代碼配置管理的工具,學會Git的基本使用方法。
? ? ? ??基本的Java OO編程
? ? ? ??基于Eclipse IDE進行Java編程
? ? ? ??基于JUnit的測試
? ? ? ??基于Git的代碼配置管理
? ? ? ??首先,在實驗教程中指定的MIT網站上下載Eclipse、JDK和Git并安裝。
? ? ? ??在為JDK配置環境變量的時候,在系統環境變量中新建一個叫“JAVA_HOME”的環境變量,變量值為JDK的安裝路徑。然后在Path的環境變量中添加一個“%JAVA_HOME%bin”的變量值。
? ? ? ??Magic Squares即幻方,類似數獨游戲
? ? ? ??首先,我們先將文檔中的矩陣讀入并以字符串的形式存儲(每行為一個字符串)
? ? ? ??然后,我們將以字符串形式存儲在result中的矩陣轉化為整型矩陣并在此期間檢查矩陣輸入及矩陣大小是否合法,若非法則返回false并在命令行打印Invalid Input或Invalid Metrics。
? ? ? ??最后,分別從行、列、對角線對矩陣進行求和,檢查其是否相等
流程圖如下所示
(1)兩個Exception原因及解決方案
? ? ? ??NegativeArraySizeException:NegativeArraySizeException產生的原因在于修改前的函數未經檢查直接使用n作為數組下標,當n為負數時,則會拋出此異常
? ? ? ??ArrayIndexOutOfBoundsException:ArrayIndexOutOfBoundsException產生的原因是數組下標越界,當n為偶數時,如下圖所示,以2為例。當填寫2×1單元時,i%n==0,此時row++==2,則會導致數組越界。
? ? ? ??為解決上述問題并“優雅”地退出程序,我們應在函數起始時判斷n的范圍,若n的范圍非法,則返回false并在命令行打印錯誤信息,如下圖所示。
(2)函數拓展有以下兩點,一是在函數初始時加入對n范圍的判斷,該部分已在(1)中詳細說明;二是文件輸出,由于函數中已有命令行輸出函數,文件輸出在命令行輸出的基礎上加入文件操作即可,代碼如下:
文件、命令行輸出及測試結果如下
?
? ? ? ??根據代碼注釋提示補全代碼從而實現一個繪制工具Turtle Graphics。
1、從Github上獲取任務的源代碼,在本地創建git倉庫,使用git管理本地開發
2、畫出正四邊形。
3、完成正多邊形內角和外角的計算
4、計算向量之間的夾角
5、計算凸包
6、繪制自己的圖形
? ? ? ??如何從GitHub獲取該任務的代碼、在本地創建git倉庫、使用git管理本地開發。
? ? ? ??該問題是通過turtle畫一個邊長為sideLength的正方形,實現方法比較簡單,前進四次并轉彎三次即可完成,代碼如下圖所示。
? ? ? ??使用turtle畫正多邊形,首先需要根據正多邊形的邊數計算其內角大小,計算公式:angle=180-360∕s?des? ,源碼如下圖所示:
? ? ? ??然后編寫由邊數計算角度的函數(不明所以),源碼如下圖所示:
? ? ? ??類似上節實驗,正多邊形可以使用for循環完成,如下圖所示
? ? ? ??該部分首先需要補全calculateBearingToPoint方法,該方法的幾何推導如下圖所示:
? ? ? ??完成推導后,即可利用Java進行實現,代碼如下所示:
? ? ? ??該部分還需要補全calculateBearings方法,該方法直接在calculateBearingToPoint方法基礎上迭代即可,源碼如下圖所示:
? ? ? ??本次實驗中,使用貪心策略計算凸包:
? ? ? ??①選取點集中最左下的點為初始基點,并將其加入凸包
? ? ? ??②從初始基點開始,依次搜索點集中每個點并計算其偏移角,找出點集中相對基點最小偏移角所對應的點,將其作為新的基點并加入凸包
??? ? ? ?③依次進行搜索,直到某次所得基點已經在凸包中,結束算法
? ? ? ??算法主循環如上圖所示,我們使用temp記錄搜索過程中每個點相對于基點的偏移角,并用angle記錄最小偏移角,用temp1記錄其對應頂點。
? ? ? ??注意到:每次循環都將angle設置為9999.0是為了接受搜索的第一個頂點
?
選取紅色畫出如圖所示嵌套的三角形(由于不能使用遞歸,無法對其進行全填充)
?
? ? ? ??git add *->git commit -m “”->git push提交到Lab1倉庫
? ? ? ??本處社交網絡可以通過有向圖建模,每個Person為圖中的一個節點。若兩個Person有關聯,則圖中對應的兩個頂點之間有邊。
? ? ? ??分析需求可知,FriendshipGraph類需要存儲以Person類為節點的圖,并且需要實現圖邊和點的添加,以及先廣搜索。
? ? ? ??故本實驗中FriendshipGraph類將各Person節點,以HashMap的形式存儲,并且使用addVertex方法增加節點,addEdge方法增加邊,getDistance方法計算兩點最短路徑,即先廣搜索。
? ? ? ??addVertex方法如下圖所示,接收到輸入后,首先判斷其是否已經在點集中,若在則終止函數并返回false,否則將其存入Vertex中并返回true。
? ? ? ??addEdge方法如下圖所示,接收到輸入后,首先判斷其是否在點集中,若不在則提示錯誤并返回false;若在點集中則繼續執行。隨后判斷輸入兩點間是否已經存在邊,若存在則提示錯誤并返回false,否則將邊加入到邊集中。
? ? ? ??getDistance方法分為三部,預處理部分為后續步驟申請隊列、臨時變量等組件;先廣搜索部分使用先廣搜索算法對圖進行遍歷,同時使用標志變量dot對先廣搜索深度進行記錄;后處理部分則主要將先廣搜索部分設置的標志變量更改為最初的狀態,以便于下次使用。
? ? ? ??本方法中僅展示先廣搜索這一核心部分,如下圖所示。
? ? ? ??分析需求可知,Person類為FriendshipGraph類的節點,本實驗中圖采用鄰接表的形式存于Person類中,即Person類中的成員變量inEdge與outEdge。由于Person類中成員變量以及方法比較簡單,本處不再贅述。
? ? ? ??由實驗手冊,main()代碼如下圖所示
? ? ? ??如果將測試代碼第十行注釋掉,輸出結果為-1,-1,0,-1。
? ? ? ??如果不滿足每個人名字不同,addVertex方法會提示錯誤并終止此次執行
? ? ? ??測試方法中前兩者較為簡單,在此不做介紹,這里主要介紹對getDistance方法的測試
? ? ? ??getDistance方法的代碼如上圖所示
? ? ? ??上述代碼構建如上圖所示的社交網絡圖
? ? ? ??測試結果如下所示
? ? ? ??請使用表格方式記錄你的進度情況,以超過半小時的連續編程時間為一行。
? ? ? ??每次結束編程時,請向該表格中增加一行。不要事后胡亂填寫。
? ? ? ??不要嫌煩,該表格可幫助你匯總你在每個任務上付出的時間和精力,發現自己不擅長的任務,后續有意識的彌補。
| 日期 | 時間段 | 任務 | 實際完成情況 |
| 2021-05-19 | 13:00-15:10 | 編寫問題1的isLegalMagicSquare函數并進行測試 | 按計劃完成 |
| 2021-05-19 | 20:00-22:00 | 編寫Person類及FriendshipGraph類 | 按計劃完成 |
| 2021-05-20 | 16:00-20:00 | 編寫Turtle部分 | 按計劃完成 |
| 遇到的難點 | 解決途徑 |
| Java的文件操作 Java文件操作不輸出 ? | 在CSDN上查找相關操作,并與同學進行討論 經查閱資料得知,FileWriter必須關閉才會在文件中輸出,之前C代碼從來不關閉文件的習慣需要改改了 |
| calculateBearingToPoint方法中atan返回值值域為(-pi/2,pi/2),導致旋轉角不是一一映射 ? ? | 使用atan2方法,該函數返回值值域為(-pi,pi) |
| FriendshipGraph類中存儲圖的頂點使用什么數據結構 ? ? | Java我不太熟悉,知道Python中有字典數據結構,查找資料后發現Java中的Map可以實現類似的功能,故使用Map |
?
總結
以上是生活随笔為你收集整理的哈工大软件构造Lab1实验报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 万字总结 JS 数据结构与常用的算法
- 下一篇: STM32在Kiel4中注意的问题