姓名 |
|
學號 |
|
班號 |
|
電子郵件 |
|
手機號碼 |
|
目 錄
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
這個方法考察的是基本的turtle的forward和turn函數,實現起來很簡單。向前走再轉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,所以並不算困難。初次接觸軟件構造,希望能學到一些使用的軟件編程技巧。