2022哈工大软件构造lab1小结(知识点)
哈工大軟件構(gòu)造lab1小結(jié)
提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔
文章目錄
- 前言
- 問題一
- 使用的庫
- 異常處理機(jī)制
- 字符串內(nèi)容檢查
- 寫入文件
 
 
- 問題二
- problem 3:畫一個(gè)正方形
- problem 5:畫一個(gè)多邊形
- problem 6:計(jì)算軸承
- problem 7:計(jì)算凸包
- problem 8:個(gè)人藝術(shù)
 
 
- 問題三
- 設(shè)計(jì)/實(shí)現(xiàn)Person類
- 設(shè)計(jì)/實(shí)現(xiàn)FriendshipGraph類
 
 
- 總結(jié)
前言
本次實(shí)驗(yàn)作者收獲了很多關(guān)于java編程的知識(shí),在這里和大家分享一下。
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
問題一
使用的庫
import java.util.Scanner; import java.io.*;... BufferedReader br = new BufferedReader(new FileReader(fileName)); String str = null; while ((str = br.readLine()) != null) {...} br.close();...Scanner input = new Scanner(System.in); ... input.close();不用把所有相關(guān)的知識(shí)掌握,把自己需要的代碼掌握就行。
 只需要記住:
上述方法執(zhí)行時(shí)都會(huì)造成堵塞**,等待用戶在命令行輸入數(shù)據(jù)回車確認(rèn)**
上面提到的scanner的用法和文件操作就是比較簡(jiǎn)單的操作,讀者可以把這些代碼直接拿來使用。
異常處理機(jī)制
try {...} catch (FileNotFoundException e) {e.printStackTrace();}異常檢測(cè)我們這里推薦使用try catch語句,使用框架參考上面的代碼,注意下面幾點(diǎn):
1. 如果 try 語句塊中發(fā)生異常,那么一個(gè)相應(yīng)的異常對(duì)象就會(huì)被拋出,然后 catch 語句就會(huì)依據(jù)所拋出異常對(duì)象的類型進(jìn)行捕獲,并處理。處理之后,程序會(huì)跳過 try 語句塊中剩余的語句,***轉(zhuǎn)到 catch 語句塊后面的第一條語句開始執(zhí)行。*** 2. Java處理異常的方式是中斷處理(停止java虛擬機(jī)JVM)。常用的異常有: 1、空指針異常類: NullPointerException2、數(shù)據(jù)類型轉(zhuǎn)換異常:ClassCastException3、沒有訪問權(quán)限:IllegalAccessException4、方法的參數(shù)錯(cuò)誤:IllegalArgumentException5、數(shù)組下標(biāo)越界異常:IndexOutOfBoundsException6、文件已結(jié)束異常:EOFException7、文件未找到異常:FileNotFoundException8、字符串轉(zhuǎn)換為數(shù)字異常:NumberFormatException9、指定的類不存在: ClassNotFoundException10、實(shí)例化異常:InstantiationException字符串內(nèi)容檢查
if (string.matches("[0-9]+")) {...} elsereturn false;框架見上面,知識(shí)點(diǎn):
1. boolean matches(String regex): matches() 方法用于檢測(cè)字符串是否匹配給定的正則表達(dá)式。 2. 參數(shù):regex – 匹配字符串的正則表達(dá)式。正則表達(dá)式怎么構(gòu)造可以自己在網(wǎng)上學(xué)習(xí),構(gòu)造技巧也非常簡(jiǎn)單,這里不多加講解了。
寫入文件
PrintWriter pw = new PrintWriter("...", "UTF_8");for (i = 0; i < n; i++) {for (j = 0; j < n; j++)pw.print(...);pw.println();}pw.close(); 1. java.io.PrintWriter是java中很常見的一個(gè)類,該類可用來創(chuàng)建一個(gè)文件并向文本文件寫入數(shù)據(jù)。可以理解為java中的文件輸出,java中的文件輸入可以用java.io.File。 2. 只要記住:使用print類不會(huì)在文本末尾加上任何東西,如果需要分隔符應(yīng)該手工添加,**使用println自動(dòng)在字符串末尾加一個(gè)行分隔符,并清空緩沖區(qū)**(如果非要用print方法,記得要添上flush()方法以及換行符)問題二
problem 3:畫一個(gè)正方形
代碼如下(示例):
public static void drawSquare(Turtle turtle, int sideLength) {for(int i = 0; i < 4; i++) {turtle.forward(sideLength);turtle.turn(90);}}代碼很簡(jiǎn)單,就是向前移動(dòng)和轉(zhuǎn)彎,旋轉(zhuǎn)角度為90度。使用上述模板(可以自己修改參數(shù))畫出來的圖形是一個(gè)正多邊形,旋轉(zhuǎn)角度讀者可以自己計(jì)算。
problem 5:畫一個(gè)多邊形
代碼如下(示例):
... return (180.00*(sides - 2)) /sides ; //已知邊數(shù),計(jì)算正多邊形的內(nèi)角度數(shù) ... return (int)Math.round(360.00/(180.00-angle)); //已知內(nèi)角度數(shù),計(jì)算正多邊形的邊數(shù) ...上面幾個(gè)語句都是數(shù)學(xué)上的一些結(jié)論,大家看看就行。
problem 6:計(jì)算軸承
Angle = 450.00 - currentBearing - Math.toDegrees(Math.atan((float)(targetY - currentY) / (targetX - currentX)));計(jì)算角度的方法非常簡(jiǎn)單,大家可以自行推導(dǎo),注意上面使用到的兩個(gè)函數(shù):
1. Java中Math.toDegrees()用于將**以弧度測(cè)量的角度轉(zhuǎn)換為以度為單位的近似等效角度**,也就是將-π/2到π/2之間的弧度值轉(zhuǎn)化為度。 2. 如果要將角度轉(zhuǎn)成成弧度用Math.toRadians。 3. Math.atan() 函數(shù)返回一個(gè)數(shù)值的反正切(以弧度為單位),也就是返回一個(gè)-π/2到π/2之間的弧度值其他的就沒什么難的點(diǎn)了。
problem 7:計(jì)算凸包
凸包算法非常常見,這里不多介紹,我們關(guān)注一個(gè)細(xì)節(jié):
public static Set<Point> convexHull(Set<Point> points) {... }這個(gè)函數(shù)中我們用到了Set(集合)這個(gè)概念。關(guān)于集合,大家在上大學(xué)之前就有所了解,我們介紹下面幾個(gè)java知識(shí)點(diǎn):
1. Set繼承于Collection接口,是一個(gè)不允許出現(xiàn)重復(fù)元素,并且無序的集合,主要有HashSet和TreeSet兩大實(shí)現(xiàn)類。1.1 HashSet是哈希表結(jié)構(gòu),主要利用HashMap的key來存儲(chǔ)元素,當(dāng)有元素插入的時(shí)候,**會(huì)計(jì)算元素的hashCode值,將元素插入到哈希表對(duì)應(yīng)的位置中來;**1.2 TreeSet是紅黑樹結(jié)構(gòu),每一個(gè)元素都是樹中的一個(gè)節(jié)點(diǎn),插入的元素都會(huì)進(jìn)行**排序**。TreeSet具有排序功能,分為自然排序(123456)和自定義排序兩類。2. 關(guān)于尖括號(hào): <"T">是ageneric,通常可以讀作"T型"。它取決于<>左邊的類型實(shí)際意味著什么。 ex: 如果你看到例如ArrayList<Integer>: 那就意味著"An Array List of Integers"。 另一個(gè)例子是HashMap<String, Integer>,意思是"**帶有String keys和Integer 值的 Map** "。關(guān)于set的詳細(xì)代碼:見https://www.jianshu.com/p/b48c47a42916
problem 8:個(gè)人藝術(shù)
這個(gè)就比較隨意了,可以根據(jù)個(gè)人喜好對(duì)圖形進(jìn)行設(shè)計(jì):
 包括顏色、大小、形狀等等,具體代碼就不介紹了。
問題三
我們對(duì)報(bào)告中要求的順序略微改動(dòng)一下,先設(shè)計(jì)person類,再設(shè)計(jì)FriendshipGraph類更加通順。
設(shè)計(jì)/實(shí)現(xiàn)Person類
public class Person {public String name;...} }設(shè)計(jì)person類可以根據(jù)讀者喜好自行改變,設(shè)計(jì)思路也非常簡(jiǎn)單,只需要保證包含名字這個(gè)必要元素即可。
設(shè)計(jì)/實(shí)現(xiàn)FriendshipGraph類
import java.util.*; ... Map map = new HashMap();首先是導(dǎo)入了一個(gè)常用工具包,并建立一個(gè)Map接口。知識(shí)點(diǎn)有:
1. Map集合用于儲(chǔ)存元素對(duì),**Map儲(chǔ)存的是一對(duì)鍵值(key和value)**,是通過key映射到它的value; 2. HashMap是Map的實(shí)現(xiàn)類,**實(shí)現(xiàn)了 Map 接口,根據(jù)鍵的 HashCode 值存儲(chǔ)數(shù)據(jù)**,具有很快的訪問速度,最多允許一條記錄的鍵為 null,不支持線程同步這里我們建立HashMap的目的是實(shí)現(xiàn)檢查重名的方法。
HashMap本身的功能相當(dāng)強(qiáng)大,有興趣的讀者可以在這個(gè)網(wǎng)站對(duì)HashMap的功能進(jìn)行查看:
 https://www.runoob.com/java/java-hashmap.html
接下來我們關(guān)注數(shù)據(jù)結(jié)構(gòu):
public Person []vertexList = new Person[num]; private final int [][]relation = new int[num][num];構(gòu)建社交網(wǎng)絡(luò)最初級(jí)的版本就是使用二維數(shù)組(矩陣),這里注意使用到的private和final:
1. 可以將實(shí)例字段定義為final,**這樣的字段必須在構(gòu)造對(duì)象時(shí)初始化,而且一經(jīng)設(shè)置,在接下來的語句中不能修改**,這樣使得數(shù)據(jù)被保護(hù)起來。 2. 方法可以調(diào)用這個(gè)方法的所屬類的所有對(duì)象的私有數(shù)據(jù) 3. 如果不希望方法被修改,可以使用private關(guān)鍵字對(duì)方法進(jìn)行標(biāo)識(shí),**如果你修改了實(shí)現(xiàn)方式,將不保證可用。** 4. Java中引入private的類型,目的是為了防止類中的數(shù)據(jù)成員,在類的定義之外被修改。 // 添加節(jié)點(diǎn)public boolean addVertex(Person person) {...vertexList[num_of_verts++] = person;...} // 將邊加入關(guān)系矩陣中public boolean addEdge(Person person1, Person person2) {...start = get_index_of_ver(person1);end = get_index_of_ver(person2);relation[start][end] = 1;...}這里我們提供了添加節(jié)點(diǎn)和邊的代碼,實(shí)現(xiàn)起來非常簡(jiǎn)單,只需要對(duì)數(shù)組和矩陣進(jìn)行操作就行了。
最后我們關(guān)注最短路徑問題的求解(最后的大boss反而早有了經(jīng)典的算法):
 給出兩種方案:
總結(jié)
本次實(shí)驗(yàn)作者收獲良多,文章寫得生澀,如有建議歡迎提出。
總結(jié)
以上是生活随笔為你收集整理的2022哈工大软件构造lab1小结(知识点)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 银联渠道实名认证鉴权接口
- 下一篇: 网页去重算法介绍
