軟體構造實驗LAB1 部分心得記錄
Question 1 Magic Squares
在編寫isLegalMagicSquare()函式時,需要注意的方面有:
1.數字不能重複,必須是正整數。
2.輸入檔案格式要正確,數字之間要以製表符分開。
3.幻方格式要正確,必須是標準的正方形。
4.對角線,行,列的和必須相等。
除了關注幻方本身,還要關注檔案讀取是否會出現異常,用try catch語句處理異常。
在閱讀generateMagicSquare()函式並查閱資料後,可得知該函式採用Siamese方法建構函式,具體方法如下:
- 把放置在第一行的中間。
- 順序將等數放在右上方格中。
- 當右上方格出界的時候,則由另一邊進入。
- 當右上方格中已經填有數,則把數填入正下方的方格中。
- 按照以上步驟直到填寫完所有個方格。
該方法只能用於奇數級幻方構造,偶數報錯java.lang.ArrayIndexOutOfBoundsException::原因為越界訪問陣列。當填入了偶數,必定有一個n的倍數被填入[n-1][n-1],此時由於原函式未作防越界措施:
if (i % n == 0)
row++;
導致row越界訪問,而即使做好防越界措施,計算得出的幻方也不正確。
負數報錯java.lang.NegativeArraySizeException:陣列的規格被定義為負數,因此報錯。
Question 2:Turtle Grapic
在實驗過程中,個人認為Convex Hulls帶來的困難較大,另外比較簡單。
首先明確函式的目的以及凸包的定義:該函式目的為計算一系列點陣中構成凸包的點,其中點集Q的凸包(convex hull)是指一個最小凸多邊形,滿足Q中的點或者在多邊形邊上或者在其內。圖1中由紅色線段表示的多邊形就是點集Q={p0,p1,...p12}的凸包。值得注意的是凸包不包括凸包已有線段上的點。
本人採用的凸包演算法為:尋找x座標最小的點位,並在其中尋找y最小的點,以此為起點,y正方向為初始位置,利用上一個Problem中的計算偏轉角度函式尋找偏轉角度最小的點,並以那個點為起點繼續尋找。
編寫程式過程中出了兩次錯誤:一是沒有仔細檢視凸包概念,把邊界上的點也算入凸包了,在檢查test檔案以後發現了問題並修改。二是計算偏轉角度的函數出錯:
要注意偏轉角度不能超出0-360的範圍,還要注意的是java的atan()方法返回值為弧度制,且範圍為-Π/2-Π/2,需要自己調整範圍。
函式caculateBearings()是計算一系列點之間的偏轉角度,需要提前瞭解List型別的使用方法。另外只需要呼叫上一個函式進行計算即可。
Question 3:Social Network
主要關注Java類的編寫,其中成員為保證安全應該使用private字首,防止外部直接訪問。
測試的編寫要關注多種情況,如對於計算社交距離的函式,應該嘗試測試未新增的節點,不連通的節點,有多條通路的節點,重複的節點。
總結
以前對Java語言不大熟悉的我,經過第一次軟體構造實驗,初步體驗了Git使用與Java的編寫。自學的能力也得到了提升,希望在今後的軟體構造課程與實驗中,我能保持學習狀態,更進一步。