日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2022哈工大软件构造lab1小结(知识点)

發布時間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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();

不用把所有相關的知識掌握,把自己需要的代碼掌握就行。
只需要記住:

1. BufferedReader的readLine方法是一種高效讀取文件的方法 適合讀取矩陣等數據 一次讀取最多讀8192個字符,**遇到換行符時返回**2. 創建的scanner對象調用下列方法(函數),讀取用戶在命令行輸入的各種數據類型   next.Byte(), nextDouble(), nextFloat ,nextInt(), nextLine() ,nextLong() ,nextShot() 

上述方法執行時都會造成堵塞**,等待用戶在命令行輸入數據回車確認**

上面提到的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反而早有了經典的算法):
給出兩種方案:

方案一:使用廣搜,算法網上都有,不介紹了 方案二:Floyd算法,同上

總結

本次實驗作者收獲良多,文章寫得生澀,如有建議歡迎提出。

總結

以上是生活随笔為你收集整理的2022哈工大软件构造lab1小结(知识点)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。