20202324 2020-2021-2《資料結構與面向物件程式設計》課程總結
《資料結構與面向物件程式設計》課程總結
-
課程內容總結
-
緒論
- Java程式設計語言
- 程式開發
- 問題求解
- 軟體開發行為
- 面向物件程式設計
我們首次接觸Java是從其程式設計語言和基本的程式開發過程開始的。我們瞭解程式編譯執行的步驟,理解問題求解的一般方法,瞭解軟體開發的一般過程,面向物件技術相關概念,面向物件的程式設計,類是物件的藍圖,虛擬機器介紹與安裝,IDEA介紹與安裝。還提到了面向物件程式設計的三大特徵:封裝、繼承、多型。封裝的意義:1、封裝的意義在於保護或者防止程式碼(資料)被我們無意中破壞。2、保護成員屬性,不讓類以外的程式直接訪問和修改;3、隱藏方法細節。繼承的意義:主要實現重用程式碼,節省開發時間。多型的三個條件:1.繼承的存在(繼承是多型的基礎,沒有繼承就沒有多型);2、子類重寫父類的方法(多型下呼叫子類重寫的方法)3、父類引用變數指向子類物件(子類到父類的型別轉換)。實現多型方式:1.介面多型性;2.繼承多型性;3.通過抽象類實現的多型性。多型的好處:1.可替換性;2.可擴充性;3.介面性;4.靈活性;5.簡化性。
-
資料和表示式
- 字串
- 變數和賦值
- 基本資料型別
- 表示式
- 資料轉化
- 讀輸入資料
1.字串
- print及println方法
- 字串連線
- 轉義字元
- 變數和賦值
2.變數和賦值
- 賦值語句
- 常量
- 基本資料型別
- 整型和浮點型
- 字元型別
- boolean型別
3.基本資料型別
-
8 種基本型別(byte,short,int,long,float,double,boolean,char)
-
6種數字型別(byte,short,int,long,float,double)
-
4種整數型別(byte,short,int,long),
4.表示式
- 算術運算子
- 運算子優先順序
- 自增及自減運算子
- 賦值運算子
5.資料轉化
- 轉換技術
- 基本型別之間的轉換:加寬轉換與縮窄轉換。
6.輸入資料
- Scanner類的輸入
7.字串
- print及println方法
- 字串連線
- 轉義字元
- 變數和賦值
8.變數和賦值
- 賦值語句
- 常量
- 基本資料型別
- 整型和浮點型
- 字元型別
- boolean型別
9.基本資料型別
-
8 種基本型別(byte,short,int,long,float,double,boolean,char)
-
6種數字型別(byte,short,int,long,float,double)
-
4種整數型別(byte,short,int,long),
10.表示式
- 算術運算子
- 運算子優先順序
- 自增及自減運算子
- 賦值運算子
11.資料轉化
- 轉換技術
- 基本型別之間的轉換:加寬轉換與縮窄轉換。
12.輸入資料
- Scanner類的輸入
在本章節中,我們跟著王老師學習了java中簡單的操作以及基本原理,如資料型別、型別轉換之類的。
-
使用類和物件
- 建立物件
- String類
- 包
- Random類
- Math類
- 格式化輸出
- 列舉型別
- 包裝類
在java中,類是一個模板,它描述一類物件的行為和狀態,它表示一個共性的產物,類之中定義的是屬性和行為(方法);而物件是類的一個例項,是一種個性的表示,表示一個獨立的個體,每個物件擁有自己獨立的屬性,依靠屬性來區分不同物件。
可以一句話來總結出類和物件的區別:類是物件的模板,物件是類的例項。類只有通過物件才可以使用,而在開發之中應該先產生類,之後再產生物件。類不能直接使用,物件是可以直接使用的。
-
條件和迴圈
- 布林表示式
- if語句
- 資料比較
- switch語句
- while語句
- 迭代器
- do語句
- for語句
這章感覺沒啥好說的,畢竟迴圈語句判斷語句在c裡就已經很熟悉了,本章也主要側重如何在Java中實現迴圈判斷功能。
-
編寫類
- 再談類和物件
- 類的剖析
- 封裝
- 方法的剖析
- 靜態類成員
- 類方法
- 方法設計
- 方法過載
- 測試
- 除錯
-
陣列
- 陣列元素
- 陣列的宣告及使用
- 物件陣列
- 命令列引數
- 變長引數表
- 二維陣列
-
繼承
- 建立子類
- 方法的重寫
- 類層次
- 可見性
- 設計繼承
-
多型
- 後繫結
- 通過繼承實現多臺
- 介面
- 通過介面實現多型
-
異常
- 異常處理
- 不捕獲異常
- try-catch語句
- 異常傳播
- 異常類的層次
- I/O異常
-
遞迴
- 遞迴思想
- 遞迴程式設計
- 使用遞迴
-
演算法分析
- 演算法效率
- 增長函式和打O符號
- 比較增長函式
-
查詢與排序
- 查詢
- 排序
- 分析查詢及排序演算法
本章的查詢和排序演算法一大堆,作業也很多,但學習到了很多關於計算機資料處理、存放方面的知識
查詢
-
線性查詢
-
二分查詢:從中間開始,要求表是有序的,每次比較後可以減少查詢池中的一半元素。
-
分塊查詢:先二分查詢,再線性查詢。
-
雜湊查詢:直接通過關鍵字找到儲存地址,是的查詢時間可以常數級。
-
雜湊查詢
排序
-
選擇排序:分別將每個值放在排好序的最終位置,從而完成一組值的排序。
-
插入排序:將一個具體的值插入到表中已有序的子系列中,從而完成一組值的排序。
-
氣泡排序:重複地比較表中的相鄰元素,如果它們不符合要求則交換他們。
-
快速排序:根據一個任意選定的劃分元素來對錶進行劃分,然後再遞迴地對劃分元素兩邊的欄位進行排序,從而完成對錶的排序。
-
歸併排序:遞迴地對分表,知道每個子表只含有一個元素時為止,然後再將子表按序合併,從而完成對錶的排序。
分析查詢及排序演算法
確實很多,嗯。
-
棧
- 集合的介紹
- 棧集合
- 繼承、多型和泛型
- 棧的ADT
- 使用棧:計算字尾表示式
- 異常
- 使用陣列實現棧
- ArrayStack類
- 將引用作為鏈
- 管理連結串列
- 沒有鏈的元素
- 使用鏈實現棧
- 使用java.util.Stack類實現棧
- 包
本章所介紹的資料結構是非常重要的棧(stack),它是一種有序特殊的線性表,只能在棧頂執行插入和刪除操作,最後插入的元素將第一個被刪除,因此棧也稱為FILO的線性表。我們還學習了棧的基本操作如建立棧,判空,入棧,出棧,獲取棧頂元素等。
-
佇列
-
佇列是一個線性集合,它在一端新增元素,在另一端刪除元素————先進先出。
-
介面中一般有以下功能:
- enqueue:將元素插入到隊尾。
- dequeue:從隊頭刪除元素。
- first:檢測隊頭的元素。
- isEmpty:判定佇列是否為空。
- size:斷定佇列中的元素個數。
-
-
佇列也是種線性表(特殊的),因為它只能對錶的前端進行刪除操作,而在表的後端進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。
演算法簡單,理解上和棧一樣沒什麼難度。
-
-
樹
- 樹
- 樹的遍歷
- 數的實現策略
- 二叉樹的實現
- 決策樹
樹是一種資料結構,它是由n(n≥1)個有限節點組成一個具有層次關係的集合。把它叫做“樹”是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。它具有以下的特點:每個節點有零個或多個子節點;沒有父節點的節點稱為根節點;每一個非根節點有且只有一個父節點;除了根節點外,每個子節點可以分為多個不相交的子樹。
雖然樹的資料結構簡單明瞭,但這演算法可是一點也不簡單,
-
二叉排序樹
- 二叉查詢樹
- 二叉查詢樹的實現
- 平衡二叉查詢樹
二叉查詢樹
- 左子樹小於結點,右子樹大於結點;
- 最有效的二叉查詢樹是平衡的;
- 可以對二叉樹進行旋轉使其達到平衡;
-
堆和優先佇列
- 堆
- 堆的實現
- 堆排序
- 優先佇列
堆
-
可以使用陣列形式,用順序結構儲存最為合適。
-
最小堆(小頂堆)
-
最大堆(大頂堆)
-
圖
- 無向圖
- 有向圖
- 帶權圖
- 常用的圖演算法
- 圖的實現策略
圖也是一種非線性資料結構,並且每個資料元素之間可以任意關聯。正是任意關聯性,導致了圖結構中資料關係的複雜性。頂點和邊是它的兩個組成部分。有向圖無向圖,帶權的不帶權的,加上各種演算法敲程式碼堪稱坐牢。二、總結所做過的作業
- 作業1:安裝虛擬機器
- 作業2:《資料結構與面向物件程式設計》第一週作業
- 作業3:編寫簡單的類
- 作業4:類繼承作業
- 作業5:複數計算器
- 作業6:棧實踐
- 作業7:二分查詢(折半查詢)實踐
- 作業8:二叉樹的建立和層序遍歷法實踐
- 作業9:哈夫曼編碼實踐
- 實踐1:使用VIM編輯器編寫Java程式
- 實踐2:查詢及ASL作業
- 實踐3:排序
- 實踐4:樹-計算題
- 實踐5:哈夫曼編碼測試
- 實踐6:地圖染色問題
- 實踐7:最小生成樹測試
- 實踐8:Dijkstra(迪傑斯特拉)演算法測試 好多。。。
實驗一:linux命令列和編寫簡單java程式
1、基於命令列進行簡單的Java程式編輯、編譯、執行和除錯
2、練習Linux基本命令;
3、學習Java程式的JDB除錯技能:https://www.cnblogs.com/rocedu/p/6371262.html
4、編寫簡單的Java程式。
實驗二:編寫簡單的計算器
1.實驗內
(1) 編寫簡單的計算器,完成加減乘除模運算。
(2) 要求從鍵盤輸入兩個數,使用判定語句選擇一種操作,計算結果後輸出,然後使用判定和迴圈語句選擇繼續計算還是退出。
(3) 編寫測試程式碼,測試驗證。(https://www.cnblogs.com/rocedu/p/4472842.html)實驗三:面向物件程式設計
- 初步掌握單元測試和TDD
- 理解並掌握面向物件三要素:封裝、繼承、多型
- 初步掌握UML建
實驗四:Java Socket程式設計
1.實驗內容
(一)Java Socket程式設計
1.學習藍墨雲上教材《Java和Android程式設計》“第16章 輸入/輸出 ”和“第22章 網路”,學習JavaSocket程式設計
2.結對程式設計。結對夥伴A編寫客戶端SocketClient.java,結對夥伴B編寫伺服器端。
3.截圖加學號水印上傳藍墨雲,程式碼push到碼雲,並撰寫實驗報告。(二)Java和密碼學
參考http://www.cnblogs.com/rocedu/p/6683948.html
以結對的方式完成Java密碼學相關內容的學習(帖子中所有程式碼和相關知識點需要學習)。提交學習成果碼雲連結和代表性成果截圖,要有學號水印。
(三)編寫有理數/複數計算器
結對程式設計,結對夥伴A編寫有理數計算器。結對夥伴B編寫複數計算器。截圖加水印上傳藍墨雲,程式碼push碼雲。
(四)遠端有理數計算器
結對程式設計,結對夥伴A程式設計實現客戶端,結果夥伴B實現伺服器端。
客戶端通過鍵盤輸入一個有理數計算的公式(例如:1/4 + 1/6 = ),並把該公式以字串的形式傳送給夥伴B(伺服器端),伺服器端根據字串計算出結果為5/12,並把結果返回給客戶端A,A收到結果後輸出結果。截圖加水印上傳藍墨雲,程式碼push碼雲。(五)遠端複數計算器
結對程式設計,結對夥伴B程式設計實現客戶端,結果夥伴A實現伺服器端。
客戶端通過鍵盤輸入一個有理數計算的公式(例如:1/4 + 1/6 = ),並把該公式以字串的形式傳送給夥伴A(伺服器端),伺服器端根據字串計算出結果為5/12,並把結果返回給客戶端B,B收到結果後輸出結果。截圖加水印上傳藍墨雲,程式碼push碼雲。
注意實驗四(4)和實驗四(5),一個人不能僅實現客戶端,必須實現一個客戶端和伺服器,否則兩個實驗均不得分!!!(六)實驗報告
在規定時間前發表部落格,標題“學號 實驗四 《資料結構與面向物件程式設計》實驗報告”
實驗五和六:線性結構及連結串列
1.連結串列練習,要求實現下列功能:
- 通過鍵盤輸入一些整數,建立一個連結串列;
這些數是你學號中依次取出的兩位數。 再加上今天的時間。
例如你的學號是 20172301
今天時間是 2018/10/1, 16:23:49秒
數字就是
20, 17,23,1, 20, 18,10,1,16,23,49
列印所有連結串列元素, 並輸出元素的總數。
在你的程式中,請用一個特殊變數名來紀錄元素的總數,變數名就是你的名字。 例如你叫 張三, 那麼這個變數名就是
int nZhangSan = 0; //初始化為 0.
做完這一步,把你的程式簽入原始碼控制(git push)。
2.連結串列練習,要求實現下列功能:
- 實現節點插入、刪除、輸出操作;
繼續你上一個程式, 擴充套件它的功能,每做完一個新功能,或者寫了超過10行新程式碼,就簽入程式碼,提交到原始碼伺服器;
從磁碟讀取一個檔案, 這個檔案有兩個數字。
從檔案中讀入數字1, 插入到連結串列第 5 位,並列印所有數字,和元素的總數。 保留這個連結串列,繼續下面的操作。
從檔案中讀入數字2, 插入到連結串列第 0 位,並列印所有數字,和元素的總數。 保留這個連結串列,並繼續下面的操作。
從連結串列中刪除剛才的數字1. 並列印所有數字和元素的總數。
3.連結串列練習,要求實現下列功能:
- 使用氣泡排序法或者選擇排序法根據數值大小對連結串列進行排序;
如果你學號是單數, 選擇氣泡排序, 否則選擇選擇排序。
在排序的每一個輪次中, 列印元素的總數,和目前連結串列的所有元素。
在(2)得到的程式中繼續擴充套件, 用同一個程式檔案,寫不同的函式來實現這個功能。 仍然用 nZhangSan (你的名字)來表示元素的總數。
實驗七:查詢與排序
1.定義一個Searching和Sorting類,並在類中實現linearSearch,SelectionSort方法,最後完成測試。要求不少於10個測試用例,提交測試用例設計情況(正常,異常,邊界,正序,逆序),用例資料中要包含自己學號的後四位提交執行結果圖。
2.重構你的程式碼把Sorting.java Searching.java放入 cn.edu.besti.cs2023.(姓名首字母+四位學號) 包中(例如:cn.edu.besti.cs1823.G2301)把測試程式碼放test包中重新編譯,執行程式碼,提交編譯,執行的截圖(IDEA,命令列兩種)
3.參考http://www.cnblogs.com/maybe2030/p/4715035.html ,學習各種查詢演算法並在Searching中補充查詢演算法並測試提交執行結果截圖
4.實現排序方法等(至少3個)測試實現的演算法(正常,異常,邊界)提交執行結果截圖(如果編寫多個排序演算法,即使其中三個排序程式有瑕疵,也可以酌情得滿分)
5.編寫Android程式對實現各種查詢與排序演算法進行測試提交執行結果截圖推送程式碼到碼雲(選做,額外加分)
實驗八:樹
1.參考教材PP16.1,完成鏈樹LinkedBinaryTree的實現(getRight,contains,toString,preorder,postorder)
用JUnit或自己編寫驅動類對自己實現的LinkedBinaryTree進行測試,提交測試程式碼執行截圖,要全屏,包含自己的學號資訊
課下把程式碼推送到程式碼託管平臺2.基於LinkedBinaryTree,實現基於(中序,先序)序列構造唯一一棵二㕚樹的功能,比如給出中序HDIBEMJNAFCKGL和後序ABDHIEJMNCFGKL,構造出附圖中的樹
用JUnit或自己編寫驅動類對自己實現的功能進行測試,提交測試程式碼執行截圖,要全屏,包含自己的學號資訊
課下把程式碼推送到程式碼託管平臺3.自己設計並實現一顆決策樹
提交測試程式碼執行截圖,要全屏,包含自己的學號資訊
課下把程式碼推送到程式碼託管平臺4.輸入中綴表示式,使用樹將中綴表示式轉換為字尾表示式,並輸出字尾表示式和計算結果(如果沒有用樹,正常評分。如果用到了樹,即使有小的問題,也酌情給滿分)
提交測試程式碼執行截圖,要全屏,包含自己的學號資訊實驗九:圖
一、實驗內容
(1) 初始化:根據螢幕提示(例如:輸入1為無向圖,輸入2為有向圖)初始化無向圖和有向圖(可用鄰接矩陣,也可用鄰接表),圖需要自己定義(頂點個數、邊個數,建議先在草稿紙上畫出圖,然後再輸入頂點和邊數)(2分)
(2) 圖的遍歷:完成有向圖和無向圖的遍歷(深度和廣度優先遍歷)(4分)
(3) 完成有向圖的拓撲排序,並輸出拓撲排序序列或者輸出該圖存在環(3分)
(4) 完成無向圖的最小生成樹(Prim演算法或Kruscal演算法均可),並輸出(3分)
(5) 完成有向圖的單源最短路徑求解(迪傑斯特拉演算法)(3分
-