哈工大软件构造lab1
2020年春季學(xué)期
計算機學(xué)院《軟件構(gòu)造》課程
Lab 1實驗報告
?
| 姓名 | 麥昌瀚 |
| 學(xué)號 | 190110920 |
| 班號 | 7 |
| 電子郵件 | 835889372@qq.com |
| 手機號碼 |
目錄
1 實驗?zāi)繕烁攀?.. 1
2 實驗環(huán)境配置... 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 設(shè)計/實現(xiàn)FriendshipGraph類... 2
3.3.2 設(shè)計/實現(xiàn)Person類... 2
3.3.3 設(shè)計/實現(xiàn)客戶端代碼main(). 2
3.3.4 設(shè)計/實現(xiàn)測試用例... 3
4 實驗進度記錄... 3
5 實驗過程中遇到的困難與解決途徑... 3
6 實驗過程中收獲的經(jīng)驗、教訓(xùn)、感想... 3
6.1 實驗過程中收獲的經(jīng)驗和教訓(xùn)... 3
6.2 針對以下方面的感受... 3
本次實驗通過求解三個問題,訓(xùn)練基本 Java編程技能,能夠利用 Java OO開發(fā)基本的功能模塊,能夠閱讀理解已有代碼框架并根據(jù)功能需求補全代碼,能夠為所開發(fā)的代碼編寫基本的測試程序并完成測試,初步保證所開發(fā)代碼的正確性。另一方面,利用 Git作為代碼配置管理的工具,學(xué)會 Git的基本使用方法。
1、基本的 Java OO編程
2、基于 Eclipse IDE進行 Java編程
3、基于 JUnit的測試
4、基于 Git的代碼配置管理
簡要陳述你配置本次實驗所需開發(fā)、測試、運行環(huán)境的過程,必要時可以給出屏幕截圖。特別是要記錄配置過程中遇到的問題和困難,以及如何解決的。
由于之前已經(jīng)安裝過jdk,所以此次我直接打開高級系統(tǒng)設(shè)置查看環(huán)境變量路徑,并在命令行窗口檢查確認jdk為1.8版本。隨后在lab0的實驗報告中根據(jù)給出的網(wǎng)址下載安裝了ecilpse,在git官網(wǎng)下載安裝了git-bash。
難點:由于實驗指導(dǎo)書安裝eclipse的教程充斥著大量晦澀難懂的英文和復(fù)雜操作,所以結(jié)合csdn的教程順利安裝好程序并初步掌握eclipse的使用和java基礎(chǔ)編程。
GitHub Lab1倉庫的URL地址(Lab1-學(xué)號)
https://github.com/ComputerScienceHIT/HIT-Lab1-190110920
請仔細對照實驗手冊,針對四個問題中的每一項任務(wù),在下面各節(jié)中記錄你的實驗過程、闡述你的設(shè)計思路和問題求解思路,可輔之以示意圖或關(guān)鍵源代碼加以說明(但無需把你的源代碼全部粘貼過來!)。
為了條理清晰,可根據(jù)需要在各節(jié)增加三級標題。
MagicSquare是一個正整數(shù)組成的正方形,他的每一行、每一列和對角線的數(shù)字之和都相等。
任務(wù)一:編寫一個Java程序(Magicsquare.java)用于檢查矩陣的行/列/對角線值,該程序能夠從五個已經(jīng)提供的txt文檔中讀入數(shù)據(jù),來判斷輸入的數(shù)據(jù)能否構(gòu)成一個MagicSquare,若是則返回true,若不是則返回false且說明原因。
任務(wù)二:對給出的generateMagicSquare函數(shù)進行擴充,使之能夠產(chǎn)生一個MagicSquare并且將其輸入到文本6.txt中,然后對其判斷是否為MagicSquare。并且滿足若輸入的為奇數(shù)能產(chǎn)生MagicSquare,而輸入偶數(shù)或者負數(shù)會返回false。
首先需要判斷讀入的數(shù)據(jù)能否構(gòu)成一個矩陣。根據(jù)實驗手冊,需要判斷的三張錯誤:
行列數(shù)不相等:逐行讀取得知總行數(shù),然后對每一行按照\t進行分割得出列數(shù),判斷每一列是否與行數(shù)相等,若有一列不相等,則返回false。
矩陣中某些數(shù)字不是正整數(shù):按照\t將分割后的字符串裝入數(shù)組中,然后判斷這些字符串是否包含”.”或者”-”,若包含,則返回false。
不是以\t作為分隔符:按照\t將分割后的字符串裝入數(shù)組中,然后判斷這些字符串是否包含空格,若包含,則返回false。
可以構(gòu)成矩陣時,讀入文件中的數(shù)字,用二維數(shù)組表示矩陣,分別計算矩陣每一行、每一列、對角線的和是否相等來判斷能否構(gòu)成MagicSquare,并返回true。
使用try-catch組合,若文件讀取本身出現(xiàn)問題,呈現(xiàn)相關(guān)錯誤信息
輸出的結(jié)果:
輸入的 n不合法時(n為偶數(shù)、n為負數(shù)等)提示錯誤并“優(yōu)雅的”退出:
將產(chǎn)生的 magic square寫入文件\src\P1\txt\6.txt中并檢驗
實現(xiàn)一個繪圖工具Trurtle Graphics,需要我們完成的任務(wù)為:畫出一個正方形,計算正多邊形內(nèi)角,由正多邊形內(nèi)角得到邊數(shù),計算從一個點到另外一個點所需要轉(zhuǎn)過的角度,給定一系列點計算每次轉(zhuǎn)過的角度并返回在集合中,計算一系列點中的凸包,調(diào)用函數(shù)繪制個人藝術(shù)作品,使用junit進行單元測試。
從github上獲取代碼:網(wǎng)頁download。
從本地創(chuàng)建git倉庫:1、git init初始化本地倉庫2、git add remote添加遠程庫源3、在遠程倉庫創(chuàng)建master分支4、git pull origin master將遠程倉庫同步到本地5、git add * ->git commit -m “……”->git push將本地文件加入到本地倉庫,將本地倉庫同步到遠程倉庫。
通過四次循環(huán),使用forward、turn函數(shù)每次前進+轉(zhuǎn)90°就可以得到正方形。
補全calculateRegularPolygonAngle。正多邊形的內(nèi)角等于180 – 360./ 邊數(shù)
補全calculatePolygonSidesFromAngle。知道正多邊形的內(nèi)角求邊數(shù),由前句進行簡單數(shù)學(xué)公式轉(zhuǎn)換即可
補全drawRegularPolygon。畫出指定邊長的正多邊形。調(diào)用calculateRegularPolygonAngle(sides)計算正多邊形的內(nèi)角,調(diào)用forward和turn函數(shù)進行前進和轉(zhuǎn)向。
補全calculateBearingToPoint。該函數(shù)利用atan2函數(shù)計算前進方向與x軸正向夾角,之后再把該角度轉(zhuǎn)換成與y軸正向的夾角,注意如果出現(xiàn)負數(shù)要再加上360°。
補全calculateBearings。對列表中的每兩個相鄰點調(diào)用calculateBearingToPoint計算夾角,列表保存并返回
計算給定集合中的凸包需要利用Gift wrapping algorithm算法。點數(shù)少于3個時直接得凸包,否則先找到最左下角的點加入集合:
然后比較剩余點到此點的偏轉(zhuǎn)角,找到偏轉(zhuǎn)角最小的加入集合,當(dāng)偏轉(zhuǎn)角相同時,需要找到最長的一條邊的點加入集合,當(dāng)回到起點時終止程序,最后即可得到凸包的點集:
經(jīng)計算后繪制得到一個頂角豎直向上的五色正五角星:
(1).打開git-bash
(2).cd /D/P2
(3).git add .HIT- Lab1-190110920
(4).git commit –m “P2”
(5)git push origin master
實現(xiàn)并測試Friendship Graph類和Person類,模擬社交網(wǎng)絡(luò),可以計算圖中兩個人之間的距離。
1.定義一個Person集合來儲存所有人的對象,定義一個String集合來儲存所有已經(jīng)存在的名字并進行初始化:
2.函數(shù)addVertex:增加一個人的對象。 實現(xiàn)此功能需要注意用來增加的Person對象是否已經(jīng)存在,所以需要在開始判斷name中是否已經(jīng)有了匹配的的名字,若已經(jīng)存在,則輸出“輸入人名重復(fù)”并結(jié)束程序,若沒有則將待增加的新的Person對象加入people集合中,對象的名字加入name集合中:
3.函數(shù)addEdge:增加一條有向邊。實現(xiàn)此功能只需要調(diào)用Person類的addnewfriend方法即可
4.函數(shù):getDistance:得到兩個人之間的最短距離。使用廣度優(yōu)先搜索方式求最短路徑的方法。若兩個Person對象為同一個,則返回0。然后定義一個Map集合way和一個Person隊列thequeue,隊列thequeue用來儲存廣搜的遍歷結(jié)果,theway的Map集合用來儲存廣搜的所有元素及他們與第一個元素的距離。具體實現(xiàn)為將第一個元素c1入隊,并且把c1和下標0入集合,當(dāng)隊列非空時,彈出隊首元素top,并且得到top在集合theway中的下標distance,然后只要隊首元素的所有朋友friend,中的元素與c2不同就全部入隊,這些元素及下標distance+1放入集合。隊列非空則繼續(xù)執(zhí)行以上步驟,直到找到某個元素與c2相同并且返回這個元素在集合way中的下標。如果直到隊列為空還沒找到c2,則返回-1:
1.定義String變量name儲存名字,定義一個Person的集合friend,定義一個
2.構(gòu)造方法:依據(jù)輸入的字符串初始化這個名字,并且將這個名字加入集合friend中:
3.增加本人新朋友addnewfriend:直接將新Person對象加入friend中即可
4.得到本人的名字getname:直接返回name
5.得到本人的朋友列表getthisfriend,直接返回friends
基于實驗報告的代碼稍加修改
輸出結(jié)果為:
創(chuàng)建對象測試public void addVertextest()
加入朋友關(guān)系測試public void addEdgetest()
覆蓋每個頂點先建立交際網(wǎng),再測試距離是否正確public void getDistancetest()
請使用表格方式記錄你的進度情況,以超過半小時的連續(xù)編程時間為一行。
每次結(jié)束編程時,請向該表格中增加一行。不要事后胡亂填寫。
不要嫌煩,該表格可幫助你匯總你在每個任務(wù)上付出的時間和精力,發(fā)現(xiàn)自己不擅長的任務(wù),后續(xù)有意識的彌補。
| 日期 | 時間段 | 任務(wù) | 實際完成情況 |
| 2021-05-13 | 15:45-17:00 | 嘗試初步編寫問題1的isLegalMagicSquare函數(shù) | 按計劃完成 |
| 2021-05-16 | 14:00-16:00 | 編寫問題1的isLegalMagicSquare函數(shù)并完成測試 | 延期1小時完成 |
| 2021-05-20 | 15:45-17:00 | 編寫問題1的generateMagicSquare函數(shù)并完成測試 | 按計劃完成 |
| 2021-05-20 | 19:00-20:00 | 嘗試了解第二題的概況并完成1-4 | 延期1小時完成 |
| 2021-05-21 | 15:00-17:00 | 完成P2的凸包和個人藝術(shù)設(shè)計,并經(jīng)過調(diào)試后通過了自帶的測試 | 按計劃完成 |
| 2021-05-22 | 13:00-17:00 | 完成P3的Person類和FriendshipGraph類 | 按計劃完成 |
| 2021-05-22 | 19:00-20:00 | 完成P3的測試 | 按計劃完成 |
| 2021-05-23 | 19:00-21:00 | 完成收尾工作 | 按計劃完成 |
| 遇到的難點 | 解決途徑 |
| 初次接觸java,文件讀寫出現(xiàn)很多問題 | 通過查閱資料理解了flie類和bufferreader類等的關(guān)系與使用 |
| p2的英文教程在初次接觸時造成了許多困難 | 經(jīng)過耐心閱讀領(lǐng)會了題目的意思和大致目標 |
| …… | …… |
此次實驗初次使用java,我對眾多語法和結(jié)構(gòu)不熟悉。但是在一段時間的鉆研后,我學(xué)到了java領(lǐng)域的許多新奇知識,并逐漸熟悉了git、eclipse和junit的使用,受益匪淺。
第一印象不錯,具有面向?qū)ο缶幊坦逃械脑S多優(yōu)點與特色
對于初學(xué)者十分友好,自動提示與糾錯功能非常強大
較為生疏,還需要深入研究
英文教程障礙較大
適中
收獲頗豐
其他收獲:
Scanner cannot be resolved to a type
剛開始接觸java,這個問題非常簡單但是在網(wǎng)上怎么也找不到答案
Scanner類使用前需要將其導(dǎo)入。
在代碼的最前端加入
import java.util.Scanner;
即可
?
總結(jié)
以上是生活随笔為你收集整理的哈工大软件构造lab1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gs地图开发_地图编制小课堂 | 境界分
- 下一篇: 大二网页制作实习总结