20192319 2020-2021-1《資料結構與面向物件程式設計》課程總結
20192319 2020-2021-1《資料結構與面向物件程式設計》課程總結
課程內容總結
-
第一章(緒論)介紹了Java程式設計語言和基本的程式開發過程。介紹了面向物件的開發方法,包括相關的概念和術語。
-
第二章(資料和表示式) 探討了Java程式中使用的基本資料型別及執行計算時表示式的使用。討論了資料型別之間的轉換,以及如何藉助於Scanner類互動地從使用者讀入輸入。
-
第三章(使用類和物件) 探討了預定義地類及由它們建立的物件的使用。使用類和物件來操作字串、產生隨機數、執行復雜的計算及格式化輸出。本章討論了包、列舉型別和包裝類。
-
第四章(條件和迴圈) 介紹了用於判定的布林表示式的使用。討論了與條件及迴圈相關的所有語句,包括for迴圈的增強版本。為了分析並讀入文字檔案中的重複輸入,再次討論了Scanner類。
-
第五章(編寫類) 探討了與編寫類及方法相關的基本問題。內容包括例項資料、可見性、作用域、方法引數及返回值型別,也涉及了構造方法、方法設計、靜態資料和方法過載等內容。
-
第六章(圖形使用者介面) 全面研究了JavaGUI處理,重點是元件、事件和偵聽器。使用多個an例子討論了不同類的元件和事件。另外,也介紹了佈局管理器、汕器層次、邊框、工具示和助記符等內容。
-
第七章(陣列) 涉及陣列的基本概念和陣列的處理,內容包括邊界檢查、初值表、命令列引數、變長引數列表和多維陣列等。
-
第八章(繼承) 討論了類的派生及相關概念,包括類層次、重寫及可見性等。
-
第九章(多型) 探討了繫結的概念,以及它與多型的關係。之後研究瞭如何使用繼承或介面來完成多型引用。
-
第十章(異常) 介紹了異常處理及不捕獲異常時的後果。探討了try-catch語句,分析了異常的傳播。本章還介紹了處理輸入/輸出時的異常使用。
-
第十一章(遞迴) 介紹了遞迴的概念、遞迴的實現及其正確的用法。
-
第十二章(演算法分析) 討論了包括遞迴演算法在內的演算法複雜度的分析技術,介紹了大O符號。
-
第十三章(查詢與排序) 探討了線性查詢和二分查詢演算法,還介紹了5個排序演算法,其中包括平方階及O(n log n)的演算法。同時還研究了這些演算法的效率。
-
第十四章(棧) 介紹了集合的概念,確定了將介面與現實分開的重要意義。介紹了棧的動態及定長的兩種實現方法。介紹了泛型,詳述了泛型對集合類的支援。
-
第十五章(佇列) 介紹了FIFO佇列,討論了不同的實現選擇。本章首先介紹了佇列的概念,然後作為工具來幫助我們解決問題,最後研究所使用的資料結構。討論了基於陣列和動態連結串列的兩種實現方式。
-
第十六章(樹) 介紹了樹的術語和相關概念,討論了不同的實現策略,詳細介紹了遞迴的鏈式實現方法。
-
第十七章(二叉查詢樹) 介紹了查詢樹的概念,以及典型的二叉查詢樹的鏈式實現。
-
第十八章(堆和優先佇列) 討論了堆的概念,以及堆和樹的關係。研究了堆的完全鏈式實現方式。同時還分析了堆和優先佇列之間的關係。
-
第十九章(圖) 討論了有向圖和無向圖。此外,還介紹了帶權圖、廣度優先遍歷和深度優先遍歷之間的差別。介紹了最小生成樹,討論了它的實現策略。
-
第二十章(雜湊方法) 涉及建立雜湊表以便於儲存及獲取物件的相關概念。本章還介紹了Java API中與雜湊相關的幾種應用。
做過的作業
作業一:安裝虛擬機器
作業二:使用VIM編輯器編寫Java程式
(1)任務1:使用VIM編輯器編寫Java程式。要求輸入2個Int型別的數值m和n,當m不為0時,計算(m!)+(m的n次方),並輸出。當m為0時提示重新輸入。
要求程式能夠執行成功,否則後面均不得分。
①:程式執行結果截圖(全屏截圖+學號水印)(4分)
②:git push成功的截圖(全屏截圖+學號水印)(4分)
③:單步除錯,檢視當m=2時的m和n的中間值(可以使用locals或print等檢視)(全屏截圖+學號水印)(4分)
本題12分,如果存在下面問題則扣分:
①不使用判斷和迴圈語句扣1分。②不用VIM編輯器扣1分。③不用命令列的方式編譯執行扣1分。④沒有截全屏扣1分。
可以直接截圖,也可以放到一個word檔案,把word檔案傳到這裡。
(2)任務2:使用VIM編輯器編寫Java程式。要求輸入1個Int型別的數值n。當m>0時,輸出一個m行的三角形(醜或漂亮的三角形都行)。當m小於等於0時提示重新輸入。
要求程式能夠執行成功,否則後面均不得分。
本題8分,要求①把執行結果截圖上傳(全屏截圖+學號水印),每個同學輸入的值不同(例如01號輸入1,02輸入2,12號輸入3,22號輸入4,29號輸入11)
要求②把上傳碼雲成功的截圖(全屏截圖+學號水印)和碼雲連結寫上。
扣分項:
不用VIM編輯器扣1分。不用命令列的方式編譯執行扣1分。沒有截全屏扣1分。其他根據實際情況扣分,例如截圖不清楚可以扣分。
可以直接截圖,也可以放到一個word檔案,把word檔案傳到這裡。
作業三:類繼承作業
(1)編寫一個類(書、人、動物、汽車、球員、遊課程、戲角色等),定義類的屬性和方法。
(2)編寫測試類(暫用包含main方法的類),new一個上面類的物件並初始化,然後呼叫類的屬性和方法。
(3)編譯執行通過,程式碼傳到碼雲。
把以上程式碼和執行截圖放到一個word或者pdf檔案中,傳到這裡。
本題總分6分,根據實際情況酌情判分。
作業四:複數計算器
實現複數類(加減乘除運算和比較大小)。要求使用Comparable介面、要求自定義介面、要求使用繼承。
作業五:棧實踐
用陣列實現自己的棧,ArrayStackADT,需要包含棧的常規操作,並測試。需要包含push、pop、peek、size、isEmpty等操作。
作業六:查詢及ASL作業(計算)
給定關鍵字序列19 14 23 1 68 20 84 27 55 11 10 79,試分別用順序查詢、折半查詢、二叉排序樹查詢、雜湊查詢(用線性探查法和鏈地址法)來實現查詢。試畫出它們的對應儲存形式(順序查詢的順序表,二分查詢的判定樹,二叉排序樹查詢的二叉排序樹,兩種雜湊查詢的散列表),並求出每一種查詢的成功平均查詢長度。其中,雜湊函式H(k)=k%11。
作業七:排序
使用選擇和插入排序法,寫出第3次排序的結果:3 1 9 3 6 2 10
作業八:二分查詢(折半查詢)
給Searching類新增二分查詢演算法的遞迴實現方法。建立驅動程式來演示這個實現機制。
(1)程式設計實現遞迴
(2)建立一個測試類,測試遞迴實現的二分查詢是否正確。
作業九:樹-計算題
計算題:
(1)有1023個結點的完全二叉樹,其高度是多少?葉結點數是多少?(2分)
(2)高度為h的完全二叉樹至少有多少個結點?至多有多少個結點?(2分)
(3)已知一棵度為m的樹中有n1個度為1的結點,n2個度為2的結點,…,nm個度為m的結點,問該樹中有多少個葉結點?(2分)
作業十:二叉樹的建立和層序遍歷法實踐
(1)給定一個序列AB#CD###E#F##建立一顆樹,根據“二叉樹的生成”演算法構造這顆樹。(3分)
(2)使用層序遍歷方法完成遍歷並測試(3分)。
作業十一:哈夫曼編碼測試
哈夫曼編碼測試,畫出哈夫曼樹,寫出各個葉子節點的編碼。
作業十二:最小生成樹測試
(1)畫出Prim演算法的最小生成樹的生成過程
(2)畫出Kruscal演算法的最小生成樹的生成過程
(3)計算最小權值
作業十三:Dijkstra(迪傑斯特拉)演算法測試
使用Dijkstra(迪傑斯特拉)演算法計算單源(V1出發)最短路徑。
要求
(1)寫出V1到各個頂點的最短路徑
(2)要求寫出最短路徑計算過程(類似於圖2)
作業十四:地圖染色問題
給圖染色,具體演算法如下:
(1)將圖的結點按照度數遞減的次序排列.
(2)用第一種顏色對第一個結點著色,並按照結點排列的次序
對與前面著色點不鄰接的每一點著以相同顏色.
(3)用第二種顏色對尚未著色的點重複步驟2,直到所有點著色完為止.
實驗報告連結彙總
實驗一: 20192319李歆韻 第一週作業
1.對專業的認識和期望
2.上學期C語言總程式碼量情況與在這門課程即將遇到的挑戰
3.上學期程式設計基礎課程學習情況
Oracle VirtualBox 6.1.14版本虛擬機器安裝
Ubuntu 20.04版本系統安裝
VIM、GIT、Cheat命令安裝
學習Linux
實驗二: 20192319 2020-2021-1 《資料結構與面向物件程式設計》實驗一報告
基於命令列和IDEA進行簡單的Java程式編輯、編譯、執行和除錯。
練習Linux基本命令;
學習Java程式的JDB除錯技能:https://www.cnblogs.com/rocedu/p/6371262.html
編寫簡單的Java程式。
實驗三: 20192319 2020-2021-1 《資料結構與面向物件程式設計》實驗二報告
(1) 編寫簡單的計算器,完成加減乘除模運算。
(2) 要求從鍵盤輸入兩個數,使用判定語句選擇一種操作,計算結果後輸出,然後使用判定和迴圈語句選擇繼續計算還是退出。
(3) 編寫測試程式碼,測試驗證。(https://www.cnblogs.com/rocedu/p/4472842.html)
實驗四: 20192319 2020-2021-1 《資料結構及面向物件程式設計》實驗三報告
1.初步掌握單元測試和TDD
2.理解並掌握面向物件三要素:封裝、繼承、多型
3.初步掌握UML建模
4.完成藍墨雲上 (1)-(5)實驗。
實驗五: 20192319 2020-2021-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碼雲。
實驗六: 20192319 2020-2021-1 《資料結構及其面向物件程式設計》實驗五報告
1.Android Stuidio的安裝測試:
參考《Java和Android開發學習指南(第二版)(EPUBIT,Java for Android 2nd)》第二十四章:
參考http://www.cnblogs.com/rocedu/p/6371315.html#SECANDROID,安裝 Android Stuidio
完成Hello World, 要求修改res目錄中的內容,Hello World後要顯示自己的學號,自己學號前後一名同學的學號,提交程式碼執行截圖和碼雲Git連結,截圖沒有學號要扣分
學習Android Stuidio除錯應用程式
2.Activity測試
參考《Java和Android開發學習指南(第二版)(EPUBIT,Java for Android 2nd)》第二十五章:
構建專案,執行教材相關程式碼
建立 ThirdActivity, 在ThirdActivity中顯示自己的學號,修改程式碼讓MainActivity啟動ThirdActivity
3.UI測試
參考《Java和Android開發學習指南(第二版)(EPUBIT,Java for Android 2nd)》第二十六章:
構建專案,執行教材相關程式碼
修改程式碼讓Toast訊息中顯示自己的學號資訊
4.佈局測試:
參考《Java和Android開發學習指南(第二版)(EPUBIT,Java for Android 2nd)》第二十七章:
構建專案,執行教材相關程式碼
修改佈局讓P290頁的介面與教材不同
5.事件處理測試:
參考《Java和Android開發學習指南(第二版)(EPUBIT,Java for Android 2nd)》第二十八章:
構建專案,執行教材相關程式碼
提交程式碼執行截圖和碼雲Git連結,截圖要有學號水印,否則會扣分
實驗七: 20192319 2020-2021-1 《資料結構及其面向物件程式設計》實驗六報告
1.連結串列練習,要求實現下列功能:
通過鍵盤輸入一些整數,建立一個連結串列;這些數是你學號中依次取出的兩位數,再加上今天的時間。列印所有連結串列元素, 並輸出元素的總數。
在你的程式中,請用一個特殊變數名來紀錄元素的總數,變數名就是你的名字。做完這一步,把你的程式簽入原始碼控制(git push)。
2.連結串列練習,要求實現下列功能:
實現節點插入、刪除、輸出操作;繼續你上一個程式,擴充套件它的功能,每做完一個新功能,或者寫了超過10行新程式碼,就簽入程式碼,提交到原始碼伺服器;從磁碟讀取一個檔案,這個檔案有兩個數字。從檔案中讀入數字1,插入到連結串列第 5位,並列印所有數字,和元素的總數。保留這個連結串列,繼續下面的操作。從檔案中讀入數字2,插入到連結串列第0位,並列印所有數字,和元素的總數。保留這個連結串列,並繼續下面的操作。從連結串列中刪除剛才的數字1,並列印所有數字和元素的總數。
3.連結串列練習,要求實現下列功能:
使用氣泡排序法或者選擇排序法根據數值大小對連結串列進行排序;如果你學號是單數, 選擇氣泡排序,否則選擇選擇排序。在排序的每一個輪次中,列印元素的總數,和目前連結串列的所有元素。
在android上實現實驗(1)和(2)
在android平臺上實現實驗(3)
實驗八: 20192319 2020-2021-1 《資料結構及其面向物件程式設計》實驗七報告
定義一個Searching和Sorting類,並在類中實現linearSearch,SelectionSort方法,最後完成測試。
要求不少於10個測試用例,提交測試用例設計情況(正常,異常,邊界,正序,逆序),用例資料中要包含自己學號的後四位
提交執行結果圖。
重構你的程式碼
把Sorting.java Searching.java放入 cn.edu.besti.cs1823.(姓名首字母+四位學號) 包中(例如:cn.edu.besti.cs1823.G2301)
把測試程式碼放test包中
重新編譯,執行程式碼,提交編譯,執行的截圖(IDEA,命令列兩種)
參考http://www.cnblogs.com/maybe2030/p/4715035.html ,學習各種查詢演算法並在Searching中補充查詢演算法並測試
提交執行結果截圖
補充實現課上講過的排序方法:希爾排序,堆排序,二叉樹排序等(至少3個)
測試實現的演算法(正常,異常,邊界)
提交執行結果截圖(如果編寫多個排序演算法,即使其中三個排序程式有瑕疵,也可以酌情得滿分)
編寫Android程式對實現各種查詢與排序演算法進行測試
提交執行結果截圖
推送程式碼到碼雲(選做,加分)
實驗九: 20192319 2020-2021-1 《資料結構及其面向物件程式設計》實驗八報告
參考教材PP16.1,完成鏈樹LinkedBinaryTree的實現(getRight,contains,toString,preorder,postorder)
用JUnit或自己編寫驅動類對自己實現的LinkedBinaryTree進行測試,提交測試程式碼執行截圖,要全屏,包含自己的學號資訊
課下把程式碼推送到程式碼託管平臺
基於LinkedBinaryTree,實現基於(中序,先序)序列構造唯一一棵二㕚樹的功能,比如給出中序HDIBEMJNAFCKGL和先序ABDHIEJMNCFGKL,構造出附圖中的樹
用JUnit或自己編寫驅動類對自己實現的功能進行測試,提交測試程式碼執行截圖,要全屏,包含自己的學號資訊
課下把程式碼推送到程式碼託管平臺
自己設計並實現一顆決策樹
提交測試程式碼執行截圖,要全屏,包含自己的學號資訊
課下把程式碼推送到程式碼託管平臺
輸入中綴表示式,使用樹將中綴表示式轉換為字尾表示式,並輸出字尾表示式和計算結果(如果沒有用樹,正常評分。如果用到了樹,即使有小的問題,也酌情給滿分)
提交測試程式碼執行截圖,要全屏,包含自己的學號資訊
實驗十: 20192319 2020-2021-1 《資料結構及其面向物件程式設計》實驗九報告
完成圖的綜合實踐
(1)初始化:根據螢幕提示(例如:輸入1為無向圖,輸入2為有向圖)初始化無向圖和有向圖(可用鄰接矩陣,也可用鄰接表),圖需要自己定義(頂點個數、邊個數,建議先在草稿紙上畫出圖,然後再輸入頂點和邊數)(2分)
(2)圖的遍歷:完成有向圖和無向圖的遍歷(深度和廣度優先遍歷)(4分)
(3)完成有向圖的拓撲排序,並輸出拓撲排序序列或者輸出該圖存在環(3分)
(4)完成無向圖的最小生成樹(Prim演算法或Kruscal演算法均可),並輸出(3分)
(5)完成有向圖的單源最短路徑求解(迪傑斯特拉演算法)(3分)
PS:本題12分,批閱時注意查重。目前沒有明確指明圖的頂點和連通邊,如果雷同或抄襲,建議本次實驗0分。
程式碼託管連結:besti1923 / 李歆韻20192319
1.給出statistic.sh的執行結果,說明本學期的程式碼量目標達到沒有?
基本達到預期
2.加點程式碼,改點程式碼是理解的最好方式,參考程式設計的智慧,談談你的心得
程式設計是一個具有相當創造性的工作,在對一段程式碼的修改,即加點程式碼,改點程式碼,這個過程中,體現的就是你對程式設計的理解和創造性,只有你對這一段程式碼理解的相當透徹,才有可能通過加點程式碼改點程式碼來優化它,而這種創造性,只有通過不斷的練習來獲得,程式碼打得多了,程式設計能力自然就提升了。
3.積極主動敲程式碼做到沒?教材實踐上有什麼經驗教訓?
很可惜沒有做到積極主動敲程式碼,大部分時間都是根據老師的要求敲程式碼,缺乏學習的積極性。
教材實踐的經驗教訓最主要的還是再一次提醒了我基礎的重要性吧,教材上的知識和方法可以解決大部分可能遇到的問題。
課程收穫與不足
1.自己的收穫(投入,效率,效果等)
一個學期許多零碎時間的投入,感覺還是缺乏積極性,只學到一些基本的知識。
2.自己需要改進的地方
對於基礎知識的掌握不夠牢靠,一個是由於實踐什麼的時間比較緊迫,沒有太多的時間重新沉下心來再認真自學一遍課本上的知識,再一個也是對於基礎知識的重視還是不夠
程式碼量不太夠,大部分程式碼都是固定格式,固定套路的重複工作,真正灌注了我所學所用知識的有靈魂的程式碼還是不夠多,總的來說,自主練習太少
3.結對學習是不是真正貫徹了?寫一下你提供的幫助或接受了什麼幫助,並對老師提供參考建議
還是基本貫徹了,有些不懂的知識問了之後理解的更透徹了。
問卷調查
1.你平均每週投入到本課程有效學習時間有多少?
18小時左右
2.每週的學習效率有提高嗎?你是怎麼衡量的?
極不穩定的,遇到難的很難獨立去實現,花了很多時間。
3.藍墨雲班課的使用對你的學習有促進嗎?有什麼建議和意見嗎?
有用的、很方便。希望老師可以多多開發這方面的實用功能。
4.你覺得這門課老師應該繼續做哪一件事情?
不考試就是yyds!!!
5.你覺得這門課老師應該停止做哪一件事情?
掛人。(滑稽)
發揮時間
志強老師新年快樂啊!!!
總結中涉及到的連結的二維碼
作業一:
作業二:
作業三:
作業四:
作業五:
作業六:
作業七:
作業八:
作業九:
作業十:
作業十一:
作業十二:
作業十三:
作業十四:
實驗一
實驗二
實驗三
實驗四
實驗五
實驗六
實驗七
實驗八
實驗九