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