軟件構造-實驗一-僅供參考


 

 

 

 

 

 

 

 

 

姓名

 

學號

 

班號

 

電子郵件

 

手機號碼

 

 


 

 

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

3.4 Tweet Tweet 3

3.4.1 Problem 1: Extracting data from tweets. 3

3.4.2 Problem 2: Filtering lists of tweets. 3

3.4.3 Problem 3: Inferring a social network. 3

3.4.4 Problem 4: Get smarter 3

4 實驗進度記錄.... 3

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

6 實驗過程中收獲的經驗、教訓、感想... 4

6.1 實驗過程中收獲的經驗和教訓... 4

6.2 針對以下方面的感受.... 4

 

 

 

1 實驗目標概述

這次實驗通過解決求解四個問題,訓練基本的Java編程技能,並且利用JavaOO開發基本的功能模塊,閱讀已有的代碼框架並且根據需求補全代碼,能夠為所開發的代碼編寫基本的測試程序並完成測試。學會使用GIT。

2 實驗環境配置

安裝jdk 隨意選擇目錄 只需把默認安裝目錄 \java 之前的目錄修改即可

安裝jre→更改→ \java 之前目錄和安裝 jdk 目錄相同即可

安裝完JDK后配置環境變量  計算機→屬性→高級系統設置→高級→環境變量

系統變量→新建 JAVA_HOME 變量 。

變量值填寫jdk的安裝目錄

系統變量→尋找 Path 變量→編輯

在變量值最后輸入 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

系統變量→新建 CLASSPATH 變量

變量值填寫   .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(注意最前面有一點)

系統變量配置完畢

URL:

3 實驗過程

3.1 Magic Squares

Magic Squares就是一個矩陣橫豎斜都的和都一樣就算Magic Squares。這個實驗考驗了打開文件和處理從文件中獲得數據的能力。

3.1.1 isLegalMagicSquare()

從文件中讀取的矩陣,如果有負數或小數,行和列不一樣再或者和有一個和不一樣就返回false。可以運用求和和判斷類型來排除不是幻方的文件。

3.1.2 generateMagicSquare()

生成一個幻方,然后用上面寫的函數判斷是否是幻方,只能生成為基數的矩陣,如果輸入為負就報錯。

如果輸入偶數則返回:

生成的文件寫入6.txt中。

 

3.2 Turtle Graphics

完善TurtleSoup.java文件,這個實驗是為了訓練使用java自帶的畫圖庫。

每個方法上都有注釋讓我們了解這個函數應該完成什么樣的功能。再加上MIT給的實驗指導很清晰,讓我們有了很清晰的方向。

3.2.1 Problem 1: Clone and import

代碼在GitHub中點擊按鈕就可以下載到本地,也可以使用URL下載到本地,還有GitHub的客戶端進行管理。客戶端的功能很全面,能實現克隆代碼上傳等功能。

3.2.2 Problem 3: Turtle graphics and drawSquare

這個方法考察的是基本的turtleforwardturn函數,實現起來很簡單。向前走再轉90度,每次轉向都是一個方向即可。

3.2.3 Problem 5: Drawing polygons

  這個任務包含了幾個方法

1 calculatePloygonSidesFromAngle

 給定內角度數要求計算出邊數。

2 drawRegularPolygon

根據給定的長度和邊數畫出多邊形,根據我們上面的函數我們可以很快的完成。

3 calculateRegularPolygonAngle

給定邊數要求計算出來邊數。

根據數學上的技巧可以解出答案。

3.2.4 Problem 6: Calculating Bearings

1 calculateHeadingToPoint

這個函數是計算給定兩個向量之間的方向角,通過給定的點進行處理。

2 calculateHeadings

函數計算邊構成的向量之間的夾角,得出轉動的角度的大小,使用上一個函數計算出角度。

3.2.5 Problem 7: Convex Hulls

計算凸邊,使用遞歸和分治的方法。

將這些點集分為兩個部分。如果點的個數小於兩個直接返回,否則根據遞歸法則將點分成小一點的集合。

3.2.6 Problem 8: Personal art

我畫出了一個漸近線

 

3.2.7 Submitting

先用git clone URI 將在github上創建的庫克隆到本地,然后將要上傳的文件移到目錄下。

然后使用命令

Git add -A

Git commit -m “lab1”

Git pull –rebase origin master

Git push origin master

就能將本地倉庫同步到雲端

 

3.3 Social Network

該任務是考驗我們使用圖的功夫,然后建立社交網,判斷一個人的社交活動和影響力。

3.3.1 設計/實現FriendshipGraph類

       這個類是實現了主函數要求的功能。

主要要求的方法有:

adjGraph 是表明這是一個圖,統計點的個數

addVertex添加一個人進入圖中

addEdge將存在圖中的兩個人聯系起來

getDistance獲取兩個聯系人之間的距離

BFS廣度搜索來獲取距離

3.3.2 設計/實現Person類

Person方法將名字賦給類中的name

linkListAdd在SocialList中添加一個聯系人

netWorkSize獲取聯系人的大小

edgeExist判斷邊是否存在

getSocial判斷聯系人的社會位置

3.3.3 設計/實現客戶端代碼main()

public static void main(String[] args)

       {

              // TODO Auto-generated method stub

              FriendShipGraph graph = new FriendShipGraph();

           Person rachel = new Person("rachel");

           Person ross = new Person("ross");

           Person ben = new Person("ben");

           Person kramer = new Person("kramer");

           graph.addVertex(rachel);

           graph.addVertex(ross);

           graph.addVertex(ben);

           graph.addVertex(kramer);

           graph.addEdge(rachel, ross);

           graph.addEdge(ross, rachel);

           graph.addEdge(ross, ben);

           graph.addEdge(ben, ross);

           System.out.println(graph.getDistance(rachel,ross));

           System.out.println(graph.getDistance(rachel,ben));

           System.out.println(graph.getDistance(rachel,rachel));

           System.out.println(graph.getDistance(rachel,kramer));

       }

3.3.4 設計/實現測試用例

測試用例涵蓋了非法情況,就是考驗我們代碼的健壯性。

FriendShipGraph graph = new FriendShipGraph();

           Person rachel = new Person("rachel");

           Person ross = new Person("ross");

           Person ben = new Person("ben");

           Person kramer = new Person("kramer");

           graph.addVertex(rachel);

           graph.addVertex(ross);

           graph.addVertex(ben);

           graph.addVertex(kramer);

           graph.addEdge(rachel, ross);

           graph.addEdge(ross, rachel);

           graph.addEdge(ross, ben);

           graph.addEdge(ben, ross);

           System.out.println(graph.getDistance(rachel,ross));

           System.out.println(graph.getDistance(rachel,ben));

           System.out.println(graph.getDistance(rachel,rachel));

           System.out.println(graph.getDistance(rachel,kramer));

我就用的是實驗報告中的實驗用例。

3.4 Tweet Tweet

3.4.1 Problem 1: Extracting data from tweets

獲得發tweet的時間和發tweet的人

public static Timespan getTimespan(List<Tweet> tweets)

獲取時間間隔

public static Set<String> getMentionedUsers(List<Tweet> tweets)

獲取用戶,通過截斷字符串來實現。

3.4.2 Problem 2: Filtering lists of tweets

public static List<Tweet> writtenBy(List<Tweet> tweets, String username)

獲取特定用戶的tweet

public static List<Tweet> inTimespan(List<Tweet> tweets, Timespan timespan)

獲取特定時間段發的tweet。

public static List<Tweet> containing(List<Tweet> tweets, List<String> words)

獲取包含關鍵詞的tweet

3.4.3 Problem 3: Inferring a social network

檢索用戶可能感興趣的聯系人和計算影響力

計算影響力時建立一個聯系人和數字對應的哈希表,這樣再找出最大的數字即可。這是一個很聰明的方法。

3.4.4 Problem 4: Get smarter

這個方法中我實現了查找互相關注的人的一個圖。

public static Map<String, Set<String>> getSmarter(List<Tweet> tweets) {

           String name=null;

           String[] word=null;

           Map<String, Set<String>> MAP = guessFollowsGraph(tweets);

              Map<String, Set<String>> Map = new HashMap<>();

        for(Tweet onlyuser: tweets)

        {

               word=onlyuser.getText().split("[^0-9a-zA-Z-_@]");

               for(String hi:word)

               {

                      if(hi.startsWith("@")&&hi.length()>1)

                      {

                             name=hi.substring(1);

                             for(Tweet user: tweets)

                             {

                                    if(Map.containsKey(user.getAuthor()))

                                    {

                                           Map.get(user.getAuthor()).add(name);

                                    }

                                    else {

                                                 Set<String>  tt=new HashSet<>();

                                                 tt.add(name);

                                                 Map.put(user.getAuthor(),tt);

                                          }

                             }

                             }

                      }

    }

        for(String username:MAP.keySet())

        {

               Set<String> followers=new HashSet<String>();

               followers=MAP.get(username);

               for(String ttt:followers)

               {

               if(RTMap.containsKey(ttt))

               {

                      MAP.get(username).addAll(Map.get(ttt));

               }

        }

        }

        return MAP;

    }

4 實驗進度記錄

請使用表格方式記錄你的進度情況,以超過半小時的連續編程時間為一行。

每次結束編程時,請向該表格中增加一行。不要事后胡亂填寫。

不要嫌煩,該表格可幫助你匯總你在每個任務上付出的時間和精力,發現自己不擅長的任務,后續有意識的彌補。

日期

時間段

任務

實際完成情況

2019.3.6

15:45-17:30

編寫問題1的isLegalMagicSquare函數並進行測試

開始查找資料,開始寫P1

2019.3.10

 

寫P1

P1完成

2019.3.11

 

寫P2

P1未完成

2019.3.13

 

寫P2

P2完成

2019.3.14

 

寫P3

P3未完成

2019.3.15

 

寫P4

P3完成,P4未完成

2019.3.16

 

寫P4

P4完成

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

遇到的難點

解決途徑

不太會Java

通過看Java編程思想和看mooc完成

一些函數不太理解

通過百度來完成

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

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

這次的實驗需要java而我是第一次接觸,所以在完成上遇到了很大的困難。參考了很多的資料。仍然在完成上遇到了困難,但是我相信情況會越來越好。

開始不懂junit測試的時候,按照網上的方法一步一步來結果有一個初始化的問題,查遍全網發現是測試的函數不能帶有static字樣,修改后才正確,這讓我意識到java有一套嚴格的權限控制體系。

6.2 針對以下方面的感受

因為以前也安裝過類似的IDE,所以並不算困難。初次接觸軟件構造,希望能學到一些使用的軟件編程技巧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM