日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

哈工大软件构造Lab2

發布時間:2023/12/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 哈工大软件构造Lab2 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

1 實驗目標概述··· 1

2 實驗環境配置··· 1

3 實驗過程··· 1

3.1 Poetic Walks· 1

3.1.1 Get the code and prepare Git repository· 2

3.1.2 Problem 1: Test Graph <String>· 2

3.1.3 Problem 2: Implement Graph <String>· 3

3.1.3.1 Implement ConcreteEdgesGraph· 3

3.1.3.2 Implement ConcreteVerticesGraph· 5

3.1.4 Problem 3: Implement generic Graph<L>· 7

3.1.4.1 Make the implementations generic· 7

3.1.4.2 Implement Graph.empty()· 7

3.1.5 Problem 4: Poetic walks· 9

3.1.5.1 Test GraphPoet· 9

3.1.5.2 Implement GraphPoet· 10

3.1.5.3 Graph poetry slam·· 10

3.1.6 使用Eclemma檢查測試的代碼覆蓋度··· 11

3.1.7 Before you’re done· 11

3.2 Re-implement the Social Network in Lab1· 12

3.2.1 FriendshipGraph類··· 13

3.2.2 Person類··· 13

3.2.3 客戶端main()· 13

3.2.4 測試用例··· 13

3.2.5 提交至Git倉庫··· 14

4 實驗進度記錄··· 15

5 實驗過程中遇到的困難與解決途徑··· 15

6 實驗過程中收獲的經驗、教訓、感想··· 15

6.1 實驗過程中收獲的經驗和教訓··· 15

6.2 針對以下方面的感受··· 15

  • 實驗目標概述
  • 本次實驗訓練抽象數據類型(ADT)的設計、規約、測試,并使用面向對象

    編程(OOP)技術實現 ADT。具體來說:

    針對給定的應用問題,從問題描述中識別所需的 ADT;

    設計 ADT 規約(pre-condition、post-condition)并評估規約的質量;

    根據 ADT 的規約設計測試用例;

    ADT 的泛型化;

    根據規約設計 ADT 的多種不同的實現;針對每種實現,設計其表示(representation)、表示不變性(rep invariant)、抽象過程(abstractionfunction)

    使用 OOP 實現 ADT,并判定表示不變性是否違反、各實現是否存在表

    示泄露(rep exposure);

    測試 ADT 的實現并評估測試的覆蓋度;

    使用 ADT 及其實現,為應用問題開發程序;

    在測試代碼中,能夠寫出 testing strategy 并據此設計測試用例。

  • 實驗環境配置
  • 簡要陳述你配置本次實驗所需環境的過程,必要時可以給出屏幕截圖。

    特別是要記錄配置過程中遇到的問題和困難,以及如何解決的。

    實驗所需的環境在以前的學習中就已經配好。

    在這里給出你的GitHub Lab2倉庫的URL地址(Lab2-學號)。

    https://github.com/ComputerScienceHIT/HIT-Lab2-1190200704

  • 實驗過程
  • 請仔細對照實驗手冊,針對三個問題中的每一項任務,在下面各節中記錄你的實驗過程、闡述你的設計思路和問題求解思路,可輔之以示意圖或關鍵源代碼加以說明(但千萬不要把你的源代碼全部粘貼過來!)。

  • Poetic Walks
  • 需要構造一個Graph,實現或完善規約要求的內容。以邊和點兩種方式實現接口,需要將String拓展為泛型L。實現ConcretEdgesGrap和ConcreteVertexGraph中接口中定義的各個函數。問題四中,根據文件輸入,如果相鄰兩個詞之間構成一條有向邊,從而構成一棵樹,再輸入給定的句子,若相鄰兩個詞之間有一個詞,則插入,有多個,則選取邊權重較大者。

  • Get the code and prepare Git repository
  • 從GitHub獲取該任務的代碼

    在 powershell 下生成公私鑰, 復制生成的公鑰到 github

    復制 github 倉庫的 ssh 地址, 在 intellij 中添加遠程到 github 倉庫

  • Problem 1: Test Graph <String>
  • 該部分就是將Graph.java接口中的empty函數修改為

    如果想通過GraphStaticTest的話, 需要將ConcreteEdgesGraph.java中的vertices函數修改,我們將其補全,返回 Hashset()。

  • Problem 2: Implement Graph <String>
  • 這一部分主要是要求我們分別基于邊為主和點為主來實現圖的存儲和基本操作。

  • Implement ConcreteEdgesGraph
  • 首先設計edge

    edge類的成員變量如下所示

    然后設計方法

    方法如下:

    Edge:利用傳入的參數創建一條新的邊

    getSource:返回邊的源頂點

    getTarget:返回邊的目標頂點

    getWeight:返回邊的權值

    checkRep:檢測edges里是否有重復元素

    toString:按照指定格式打印邊

    由于ConcreteEdgeGraph類需要實現接口Graph中的函數, 忽略empty函數,接下來便一一介紹并實現Graph接口中的函數:

    1. add(L vertex) 函數
    該函數的作用是向點集中加入一個點. 由于Set類型的性質, 如果向Set里加入重復的元素會返回false, 所以不需要查重, 直接返回set.add()的值即可

    2. set(L source, L target, int weight) 函數

    該函數規約很長, 作用也很多, 主要有四個作用:

    (1) 如果輸入的點不存在且輸入的權值為正數, 則需要加點加邊并返回0

    (2) 如果輸入的點存在邊不存在且輸入的權值為正數, 則需要加邊并返回0

    (3) 如果輸入的點和邊存在且輸入的權值為正數, 則需要更新這條邊的權值并返回之前邊的權值

    (4) 如果輸入的點和邊存在且輸入的權值為0, 則需要刪除該邊并返回之前邊的權值

    3. remove(L vertex) 函數
    該函數的作用是刪除該點以及以該點為起點或終點的邊, 具體思想就是遍歷edges, 如果edges里有邊以該點為起點或終點, 那么刪除該邊, 最后刪除該點

    4. vertices() 函數
    該函數會返回圖中的點集

    5. sources(L target) 函數
    該函數會返回圖中以target為終點的邊的起點source與邊的權值的映射關系(就是Map類型)

    6. targets(L source) 函數
    該函數會返回圖中以source為起點的邊的終點target與邊的權值的映射關系(就是Map類型)

    對于Abstraction function:

    由source,target,weight組成的抽象數據型表示從源頂點到目標頂點具有權重的有向邊

    對于Representation invariant:

    weight > 0 source和target不為空

    對于Safety from rep exposure:

    變量都由private和final關鍵字修飾,類中并沒有定義set方法,成員變量都不能從類外部獲取或者賦值,保證了數組不會外泄。

    測試策略如下:

    public String getSource() 返回邊的String類型的源節點
    public String getTarget() 返回邊的String類型的目標節點
    public int getWeight()? 返回邊的int類型的權值
    public String toString() 返回一個字符串 格式如下:邊的源節點->邊的目標節點 權值為:x

    進行測試:

    運行測試全部通過

    覆蓋率測試如上圖所示,覆蓋率為100%

  • Implement ConcreteVerticesGraph
  • 如果想要用vertex來實現圖, 那么需要Java中的Map類型來存放與該點連接的點以及該邊對應的權值, 所以需要的參數不僅有點的標簽, 還需要有以該點為終點的邊的起點及邊的權值映射sources_map, 以及以該點為起點的邊的終點及邊的權值映射targets_map

    首先設計vertex

    vertex類的成員變量如下所示

    對于類的設計實際上與edge類似

    Vertex:含參構造函數

    checkRep:檢測頂點的name不為空或者””并且要求邊的權值>0

    getName:獲取頂點名稱

    getConnec:獲取頂點的邊集

    remove:刪除某條邊

    put:加邊或者修改權值

    getWeight:獲取指定邊的權值

    toString:按指定格式打印

    對于Abstraction function:

    代表有權值的有向邊中的源點

    對于Representation invariant:

    頂點名不為空或者””,邊的權值大于0

    對于Safety from rep exposure:

    變量都由private和final關鍵字修飾,類中并沒有定義set方法,成員變量都不能從類外部獲取或者賦值,保證了數組不會外泄。函數返回時創建一個新的對象

    測試策略如下:

    public String getName(): 返回頂點的名字
    public Map<String,Integer> getConnec():返回頂點的邊的情況(目標定點,權值)
    public void remove(final String target): target頂點和該頂點間之前有邊相連 target頂點和該頂點間之前沒有邊相連
    public void put(final String target, final int weight) 為頂點添加新的邊
    public int getWeight(final String target) 獲得這條邊的權值,如果這條邊與該頂點相連就返回權值,如果邊不相連就返回0
    public String toString() 返回一個字符串

    進行測試:

    運行測試全部通過

    覆蓋率測試如上圖所示,覆蓋率為100%

  • Problem 3: Implement generic Graph<L>
  • 將已有的兩個 Graph<String>的實現改為Graph<L>的泛型實現。

  • Make the implementations generic
  • 只需要將原本是String的地方改為L以及加即可

    在ConcreteEdgesGraph和ConcreteVerticesGraph都用泛型實現后,重新跑測試

    運行測試全部通過

    覆蓋率測試如上圖所示,覆蓋率為100%

  • Implement Graph.empty()
  • 首先選擇ConcreteEdgesGraph 作為返回對象實現Graph.empty()函數:

    然后進行測試,分別嘗試label為long的情況和label為double的情況

    進行測試:

    運行測試全部通過

    覆蓋率測試如上圖所示,覆蓋率為100%

  • Problem 4: Poetic walks
  • 這個問題一部分是用給的語料生成圖,相鄰的單詞間用一條有向邊連接,另一部分是給定一個輸入字符串,通過在圖中判斷它們之間是否有bridge來對字符串進行擴充。

  • Test GraphPoet
  • 構建文本, 輸入一串文字, 如果兩個詞之間存在一個詞, 就會添加到其中,若存在多個, 選擇權值最高的. 但需要注意的是, 若兩個詞之間沒有這樣的路徑(即中間詞的sources(起點)不包含第一個詞或中間詞的targets(終點)不包含第二個詞)的話, 則不添加詞

    測試策略如下:

    對于構造函數:

    1、傳入不存在的文件

    2、傳入的文件為空

    3、傳入的語料文件只有一行單詞

    4、傳入具有多行的語料文件

    對于poem函數:

    1、傳入的字符串為null

    2、傳入的字符串!=null,但只有一個單詞

    ??? 3、傳入的字符串!=null,不止一個單詞(還可以再設計根據權值選bridge的情形)

    對于toString函數:

    1、graph為空

    2、graph不為空,但沒有邊

    3、graph有頂點有邊

  • Implement GraphPoet
  • 對于變量graph

    對于構造函數

    關于GraphPoet函數:

    將文件輸入按行讀入,按空格分開,讀取每個字符串,調用Graph類建立一個有向帶權圖。

    關于poem函數:

    ?????? 在輸入的字符串中添加bridge word,根據Graph類中的sourcetarget函數進行判斷,若前者的target和后者的source有重合,讀取最大權重的邊作為bridgeWord加入。

    對于Abstraction function:

    將文本文件轉化成有向圖,圖的頂點就是文件中的單詞,相鄰單詞在圖中對應的頂點間有有向邊

    對于Representation invariant:

    圖中的頂點不為空或者"",邊的權值要大于0

    對于Safety from rep exposure:

    變量都由private和final關鍵字修飾,類中并沒有定義set方法,成員變量都不能從類外部獲取或者賦值,保證了數組不會外泄。函數返回時創建一個新的對象

    進行測試:

    運行測試全部通過

    覆蓋率測試如上圖所示,覆蓋率為100%

  • Graph poetry slam
  • 節選均出自Edgar Allan Poe的Annabel Lee

    輸入字符串為” angels heaven”,擴充后的結果為” angels in heaven”

    進行測試:

    運行測試通過

  • 使用Eclemma檢查測試的代碼覆蓋度
  • 覆蓋度都是100%

  • Before you’re done
  • 請按照http://web.mit.edu/6.031/www/sp17/psets/ps2/#before_youre_done的說明,檢查你的程序。

    如何通過Git提交當前版本到GitHub上你的Lab2倉庫。

    git add *

    git commit -u “”

    git-push –u origin master

    在這里給出你的項目的目錄結構樹狀示意圖。

  • Re-implement the Social Network in Lab1
  • 這個任務主要是重新實現 Lab1 中的 Social Network,利用在P1中已經寫好的 Graph<L>接口來實現,盡量重用已有的函數。

  • FriendshipGraph類
  • 成員變量Vertex:

    用來保存圖中的各頂點。

    對于addVertex方法:

    使用 Graph<L>里面提供的函數 add,即可實現增加頂點的功能。如果頂點名重復,打印錯誤信息,程序直接退出。

    對于addEdge方法:

    利用 Graph<L>里面提供的函數 set,即可實現增加頂點的功能,不過要先判斷兩個頂點是否相同。如果頂點名重復,打印錯誤信息,程序直接退出。

    對于getDistance方法:

    利用BFS算法來求兩個頂點之間的最短距離。

  • Person類
  • 對于Abstraction function:

    代表圖中頂點

    對于Representation invariant:

    頂點之間不能有相同的name

    對于Safety from rep exposure:

    變量都由private和final關鍵字修飾,只使用了get方法,成員變量都不能從類外部獲取或者賦值,保證了數組不會外泄。函數返回時創建一個新的對象

  • 客戶端main()
  • 利用 Lab1 中已有的 main 客戶端即可。

  • 測試用例
  • 測試策略如下:

    1.空圖的測試

    2.僅有頂點的圖的測試

    3.復雜圖的測試

    開始測試:

    測試全部通過

    代碼覆蓋率為100%

  • 提交至Git倉庫
  • 如何通過Git提交當前版本到GitHub上你的Lab3倉庫。

    git add *

    git commit -u “”

    git-push –u origin master

    在這里給出你的項目的目錄結構樹狀示意圖。

    總結

    以上是生活随笔為你收集整理的哈工大软件构造Lab2的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。