2021年春季學期 計算機學院《軟體構造》課程 Lab 1實驗報告

allende657發表於2021-07-02

1 實驗目標概述 本次實驗通過求解三個問題,訓練基本 Java 程式設計技能,能夠利用 Java OO 開發基本的功能模組,能夠閱讀理解已有程式碼框架並根據功能需求補全程式碼,能夠為所開發的程式碼編寫基本的測試程式並完成測試,初步保證所開發程式碼的正確性。另一方面,利用 Git 作為程式碼配置管理的工具,學會 Git 的基本使用方法。
基本的 Java OO程式設計 基於 Eclipse IDE進行Java程式設計 基於 Junit的測試 基於Git的程式碼配置管理 2 實驗環境配置 2.1 IDE 本次實驗我選擇的編譯器是IntelliJ IDEA

2.2 Git 從網上下載Git並且根據教程完成配置

image.png

2.3 JUnit 進行JUnit測試的時候沒有JUnit支援,所以將JUnit下載到外部庫中

image.png

2.4 Github倉庫

3 實驗過程 3.1 Magic Squares 在閱讀了實驗指導書之後,知道了MagicSquare是一道關於幻方的問題,需要實現如下下的兩個功能:

  1. 從檔案中讀取幻方並判斷是否合法
  2. 生成一個奇數次的幻方並且儲存在檔案中

所以我們需要掌握關於檔案的讀寫的能力以及判斷幻方是否合法的能力 3.1.1 isLegalMagicSquare() 設計思路: 1.從檔案中讀取矩陣資訊並且將其儲存在一個二維陣列之中 2.判斷讀取的幻方是否合法,從以下的幾個方面考量: a.儲存的行列數是否相等 b.儲存的資料型別是否是int型 c.分割資料的是否是tab 3.如果是合法的矩陣我們就判斷行列以及對角線的和是否相等判斷是否是幻方 4.如果是返回true,如果不是返回false以及錯誤原因 設計過程: 用bufferedreader讀取檔案中的內容

image.png

將矩陣元素儲存在二維陣列之中進行判斷 非法情況如下: 沒有使用tab分隔元素

image.png

有非int型數字

image.png

有負數

image.png

如果都合法,將行列對角線的和儲存在陣列之中,如果陣列中的元素都相等,說明是幻方

image.png

設計結果: 對給出的五個txt檔案進行測試,結果如下

image.png

3.1.2 generateMagicSquare() 流程圖:

image.png

函式分析: 在初始化的時候,首先將1放置在第一行的中間,然後按順序將後面的數字放在當前方格的右上方格中,需要注意的是當右上方格出界的時候,就需要將矩陣想象到無限大,然後想象到的矩陣對應實際矩陣的另一邊進入。如果當右上方格中已經填有數,則把數填入當前方格正下方的方格中 ,然後我們就可以按照以上步驟迴圈直到填寫完所有方格。 異常分析: n為偶數:錯誤資訊為:Thrown to indicate that an array has been accessed with an illegal index. The index is either negative or greater than or equal to the size of the arra.這是因為在初始化的時候row=n-1,然後迴圈判斷n-1%n==0,所以row++導致row=n,此時陣列越界了。 n為負數:錯誤資訊為:Thrown if an application tries to create an array with negative size. 這是因為陣列不能用負數當作索引值。 設計結果: 奇數

image.png

偶數

image.png

負數

image.png

3.2 Turtle Graphics 這個問題使用了要求我們使用turtle 繪圖包,實現包括繪製正方形、計算並繪製任意正 多邊形、計算偏轉角、凸包問題以及繪製自己的藝術圖形等功能。值得注意的是這些功能應該是可以互相呼叫。 3.2.1 Problem 1: Clone and import 從github.com/rainywang/S… Lab1-1190200704/src 中,即可得到 P2的相應檔案。在 IntelliJ 中的操作是將P2標記為源根,就可以開始操作程式碼了。 3.2.2 Problem 3: Turtle graphics and drawSquare 畫正方形只需要前進sideLength之後旋轉90度,重複四次即可。

image.png

3.2.3 Problem 5: Drawing polygons 多邊形的內角和為(邊數-2)*180°,所以每次旋轉的角度為(邊數-2)*180°/邊數。只需要前進sideLength之後旋轉得到的度數,重複n次即可。

image.png

3.2.4 Problem 6: Calculating Bearings 在calculateBearingToPoint函式中使用Math.atan2() 返回從原點(0,0) 到(targetX-currentX,targetY-currentY)的角度,這是起始點與目標點的夾角,需要注意的是這是相對於x軸正半軸來說的。

image.png

用90°減去得到的夾角和給定的currentBearing即為所求

image.png

因為不能是負角度,所以在負數的情況下需要加360°。

image.png

測試結果如下:

image.png

3.2.5 Problem 7: Convex Hulls 凸包的實現方法是: 如果給出的點數小於3,那麼我們就直接返回,

image.png

不然的話我們就選擇最左下的點作為startPoint開始判斷。

image.png

我們要尋找下一個點nextPoint,尋找的方法是呼叫calculateBearingToPoint以求找到與目前點currentPoint夾角最小,

image.png

值得注意的是在多個點都是夾角最小的情況下,需要找到與目前點currentPoint距離最遠的點,

image.png

直到nextPoint找到了startPoint得到的點集合就是凸包。 測試結果如下

image.png

3.2.6 Problem 8: Personal art 呼叫drawRegularPolygon畫六邊形,為了使色彩更加豐富,使用PenColor中的顏色,按順序變換使得圖形有一種動態中的秩序的美感。

image.png

3.2.7 Submitting 在powershell下生成公私鑰

複製生成的公鑰到github

image.png

複製github倉庫的ssh地址

image.png

在intellij中新增遠端到github倉庫

Commit之後提交即可 3.3 Social Network 這個任務要求的是對有向圖進行各項操作,包括加入點,加入邊,計算點之間的距離和關係等功能。這個實驗在現實中的意義在於可以直接展現人物關係,在操作中還包括了一些對於細節的處理,例如人的名字名字不能相同。 3.3.1 設計/實現FriendshipGraph類

構造addVertex實現加入點的功能,值得注意的是要把姓名儲存在nameList連結串列中,如果出現重複的姓名就需要報錯說明新增的姓名重複了。

image.png

構造addEdge實現加入邊的功能,呼叫Person類中的makeFriend函式將沒有關係的兩人單向連線,同時排除連線沒有建立的點的情況

image.png

還需要讀取兩個人之間的最短距離,我使用了資料結構課上學的廣度優先遍歷演算法。將開始節點加入佇列,然後在迴圈中先讀出佇列頭,即出佇列,讀出的頭就是當前節點,圍繞該節點遍歷其能到達的所有所有節點,然後將周圍的節點依次加入到佇列中,並且設定該節點的距離權值,儲存到distanceMap中來。不斷迴圈重複以上操作,逐層遍歷直到找到目的節點,或者佇列為空,若佇列為空都沒有找到目標節點那麼就是該節點不可達,就返回-1。

image.png

3.3.2 設計/實現Person類 Person類的實現相對簡單,首先要實現讀取名字

image.png

構造makeFriend加入新的朋友到friendList連結串列中

image.png

構造isFriend判斷連結串列之中是否有這個朋友。

image.png

3.3.3 設計/實現客戶端程式碼main() main函式已經在報告書中給出 執行結果如下

image.png

有題目要求我們將Rachel -> Ross的社交關係刪除,執行結果如下
    
複製程式碼

image.png

有題目要求我們將Ross 改為 Rachel,執行結果如下
    
複製程式碼

image.png

3.3.4 設計/實現測試用例 我們建立如下的一張有向圖

image.png

測試用例如下

image.png

image.png

image.png

測試的結果如下

image.png

image.png

image.png

image.png

相關文章