1. 程式人生 > 其它 >20202326 2020-2021-2《資料結構與面向物件程式設計》課程總結

20202326 2020-2021-2《資料結構與面向物件程式設計》課程總結

課程內容總結

課程:《程式設計與資料結構》
班級: 2023
姓名:張修齊
學號:20202326
實驗教師:王志強
總結日期:2022年1月1日
必修/選修: 必修

一、課程總結

  第一章:緒論

  • Java程式設計的基礎
  • 程式開發
  • 虛擬機器的安裝
  • Linux作業系統
  • Linux命令

從第一節課的虛擬機器安裝使用,讓我們從系統命令列的方式來熟悉Linux系統基本操作方式,瞭解基本檔案建立,編輯,儲存,以及編輯器的使用,讓我們從底層操作的角度看到我們日常生活中所使用的

快捷編輯方式的具體執行過程,隨後,我們學習了在虛擬機器上實現java安裝,編輯和使用的相關知識,這也是從底層的角度看到我們平常使用的程式設計軟體是如何執行和實現原理,通過本章的學習內容,讓我

們從底層的角度看待程式設計的操作實現,為我們後面在進行程式編輯提供理論知識基礎。

第二章:引言——java程式設計入門

  • 程式開發
  • Java程式設計入門
  • 計算及體系結構
  • Java程式的編輯與執行

程式開發是指先從程式的語言規範到將程式翻譯成計算機能識別並進行相關操作的機器語言,最後還能反饋程式的錯誤的過程,程式語言可以大致分為四類:機器語言、組合語言、高階語言、第四代語言

不論什麼程式最後都會被翻譯成機器語言進行運作,Java作為一種面向物件的組合語言,通過物件進行訊息傳遞來實現操作,其程式是由類的申明和類的使用,而類的例項就是指物件。Java程式要編輯和執行

需要藉助Java編輯器和直譯器的使用,Java直譯器把Java位元組碼轉換成機器語言然後執行,Java編輯器就是將Java的原始碼轉譯成Java位元組碼。一般程式設計人員在程式中所使用的單詞稱作識別符號,在Java中,

識別符號包含字母,數字,下劃線等等,其中數字不能作為開頭,Java同樣也是大小寫敏感的語言,不同識別符號如果首字母大小寫不同也代表不同的含義,程式設計時需要切記!根據編寫識別符號的物件,識別符號可

以分為自定的和他定,自定就是指程式設計師自己擬定的識別符號(sum,div···);而他定就是指不是由自己申明的,但大家都按照這個識別符號操作,比如有其他程式設計師選定的(String、System、out···)還有保留

特殊含義的詞語(class、static、void···)其中包含特殊含義的只能按照預定好的方式進行使用。

第三章:資料和表示式

  • 字串與輸出
  • 變數與賦值
  • 8種基本資料型別
  • 表示式
  • 優先順序
  • 運算子
  • 型別轉換
  • Scanner類

本章從Java的基本資料的申明和使用開始,類比上學期學習的C語言,Java在申明變數的方面略有不同,資料型別跟C一樣,分為:整數與浮點型(6種)、字元型(1種)、布林型(1種)

首先在資料申明的方面,跟C不同的是需要呼叫一個類的方法(Scanner類),這也是我們學習Java遇到的第一個類,其中大致有: .nextInt(讀入下一個輸入的整數)、.nextline(讀入下一行的資料)···

Java的運算子分為:+ / - / * / % / //。運算優先順序時()優先,其次依次是:(!(非) +(正) -(負)++ --)、(* / %)、(+ (加)-(減))、(< <= > >=)、(== !=)、(^)、(&&)、(||)、

(?:)、(= += -= *= /= %=)。Java中資料轉換型別分為三類:賦值型別轉換、提升型別轉換、強制型別轉換。

  第四章:類與物件

  • String類
  • Random類
  • Math類
  • 格式化輸出
  • 列舉型別

本節課從引入第二個類(String類)開始,講解了:1、類的基本知識;2、常用系統自帶類的種類,使用,包含的方法;3:如何自己定義自己的類,自己的類如何使用,怎麼實現自己的類。類的基本知識

:(類=屬性(變數)+方法(函式)),Java包裡自帶的主要常用類有:String(字元型變數),Scanner(資料讀入)、Random(隨機數)、Math(基本數學函式)等等,每個類有不同的方法,比如Math

類中包含(sin,cos,tan)等常見的函式,在引用時先申明Math型變數Math math = new Math();隨後,在使用時:math.tan()就可以實現tan方法的實現過程。Java的列舉方法:enum XXX{a,b,c···}其中

例項的物件屬性只能是private。

  第五章:OO設計

  • SOLID原則
  • 面向物件三要素
  • 虛擬碼
  • 類間關係
  • 介面類、抽象類的實現
  • 封裝、繼承、多型

本章引入了OO設計的相關知識,OO是指面向物件,OO(面向物件)的三要素是封裝、繼承、多型,封裝就是指包裝,將資訊隱藏的意思,具體是指利用抽象資料型別將資料和基於資料的操作封裝在一起

,繼承是指使用已存在的定義作為基礎進行新的資料加入等等,多型:只能是子類訪問父類擁有的方法和屬性。OO是基於物件的概念,以物件為中心、把類和繼承作為機制、用介面和多型來豐富。在設計程式

時要明確設計目的,然後進行虛擬碼的編寫,最後編寫程式程式碼,測試程式碼,測試無誤後,才能進行使用。而在編寫程式時往往會遇到一個類的編寫需要另一個類的方法,比如編寫自己類多資料輸入類時需要用

到Scanner的方法,這個時候就有兩種方法來實現:第一種靜態方法:Scanner.(a)每一次使用都需要呼叫一次Scanner類的方法;第二種:非靜態方法:Scanner scan = new Scanner(System.in)這樣後面

一切需要用到相關方法時只用scan.(XXX)就可以。SOLID原則指SRP(單一職責原則)、OCP(開放封閉原則)、LSP(Liskov原則)、ISP(介面分離原則)、DIP(依賴倒置原則)。

  第六章:線性表

  • 線性表基本概念
  • 線性表的儲存方式(順序,鏈序)
  • 鏈序、順序的基本方法實現
  • 程式實現

本章介紹了線性表的有關知識,首先線性表是指很多個特性相同的元素組合而成的序列,是最基礎的線性結構。根據儲存資料方式的不同可以分為:順序儲存結構、鏈式儲存結構。順序儲存結構是指用一段

連續的儲存地址單元依次儲存線性表的資料就像陣列一樣。順序儲存有三個必要屬性:儲存空間的起始位置、所需要的最大儲存量、當前長度,其中在任意時刻當前線性表長度應該小於或等於資料的最大容量

主要方法有資料的插入、查詢、刪除、判斷是否為空。鏈式儲存結構不同於順序結構,鏈式儲存結構是指將線性表元素用連結串列的方式進行儲存,基本原理是一個數據指向它的下一個資料。這就主要涉及到兩個

方面:指標和資料,這兩個方面通過節點來實現,將資料儲存在資料的方面,將指標放在指標方面,鏈式儲存結構同樣也有幾個必要屬性:頭節點、頭指標、最大儲存容量、資料。鏈式儲存結構同樣也有資料

的插入、查詢、刪除、判斷是否為空這四個基本方法。

 第六章:棧

  • 棧基本概念
  • 棧的儲存方式(順序棧、鏈棧)
  • 棧的基本方法實現原理
  • 程式實現

本章介紹了棧的相關知識,棧就是指盡在尾部進行資料的插入或者刪除特點是:後進先出;與線性表類似,同樣分為順序儲存結構(順序棧)和鏈式儲存結構(鏈棧),主要實現的方法有:棧的初始化、

判斷是否為空、取棧頂元素(peek)、棧頂的插入(push)、棧頂的刪除(pop)其中在棧頂刪除叫出棧、在棧頂插入叫入棧,鏈棧的操作操作是線性表操作的特例,操作很容易實現。順序鏈就是棧的順序

儲存結構是利用一組地址連續的儲存單元依次儲存自地至頂的元素。棧的優勢是,存取速度快,且棧之間的資料可以共享;缺點是缺乏靈活性,存取有嚴格的要求。

  第七章:查詢與排序

  • 查詢概念
  • 查詢方法
  • 排序基本知識
  • 排序基本方法

查詢與排序的學習標誌著學習正是進入資料結構的階段,查詢,即檢索,是指給定某個值,在表中確定一個關鍵字等於給定值,常用的方法有:1、線性查詢法;2、二分查詢法;3、分塊查詢法;4、雜湊

表查詢法。

  • 線性查詢法:順序查詢(順序+鏈序)適用於小型或沒有排序的線性表,主要實現方法是利用關鍵字和每個元素進行對比。
  • 二分查詢法:也稱為折半查詢法,首先將關鍵字(key)與中間的元素相比,若比中間元素小,則與該元素的左邊的中間值比較,同理較大與右邊的中間值對比,特點是時間複雜度低,效率高;但具有兩點限制性:必須是 排序好 的 順序儲存結構!
  • 分塊查詢法:在建立順序表的同時在建立一個索引(該塊的起始地址+該塊中最大或最小的元素);原理是先折半查詢線上性查詢;
  • 雜湊表查詢法:確定雜湊函式,得到每個關鍵字的雜湊地址,使雜湊地址儘可能的均勻分佈在雜湊空間上。

排序基本思想是“有序序列”逐步擴大的過程,包含了兩種基本操作:比較兩個關鍵字的大小,將關鍵字和被比較資料位置的交換。基本的排序方法有:插入排序、交換排序、選擇排序、基數排序、歸併排序

    • 插入排序:將n個待排序元素看成一個有序序列和無序序列,每次將無序序列中取一個元素與有序序列比較,並插入到指定位置。依據不同的查詢方法可以將插入排序分為直接插入、折半插入、2路--插入排序和希爾排序。
    • 交換排序:每次比較兩個資料,然後交換位置,代表有:氣泡排序,快速排序;氣泡排序就是將相鄰的兩個元素比較並交換,快速排序是基於氣泡排序後的改進方法,從兩端向中間進行比較,較大的元素一次就能交換到後面,小的記錄一次就能夠交換到前面。
    • 選擇排序:再待排序區段的記錄序列中選出關鍵字最大或最小的記錄並移動到指定位置。
    • 基數排序:不需要進行關鍵字的比較,藉助多關鍵字排序的思想來實現但關鍵字排序。
    • 歸併排序:含有n個記錄的序列看作n個有序的子序列,兩兩合併,得到n/2個長度為2或1的有序子序列,最後再兩兩合併,直到得到一個長度為n的有序序列為止。

  第七章:樹與二叉樹

  • 樹概念
  • 樹的基本操作
  • 樹的儲存結構
  • 二叉樹
  • 二叉樹性質
  • 二叉樹儲存結構

樹是指由n(n 0)個節點組成的有限集合。有一個特定的節點稱之為根節點;除根結點以外其他節點劃分為m(m 0)個互不相交的有限集合,每個集合又是一個樹,並稱之為根的字樹。樹的特點是一對多

每一個節點(除了頭節點外)都一個前驅節點。樹的基本操作有查詢、插入和刪除,從分析每個節點的前驅和後驅節點來查詢關鍵字相符資料,插入是指再經過查詢到具體位置後進行後驅節點的生成,刪除也是

再經過查詢到關鍵詞後將前驅節點的後驅節點指向下一節點。樹的儲存結構主要有:雙親表示法、孩子表示法(多重連結串列)。二叉樹是指節點最多為2的特殊有序樹。二叉樹具有1:在二叉樹的第i層最多有2^

(i-1)個節點;2:深度為k的二叉樹最多有2^(k)-1個節點;3:對任何一顆二叉樹,如果其葉節點個數為n0,深度為2的節點數為n2,則有:n0=n2+1;二叉樹的儲存結構也是順序儲存結構和鏈式儲存結構(二

插連結串列)

  第八章:圖

  • 圖的基本概念
  • 樹的基本操作
  • 樹的儲存結構及實現
  • 圖的遍歷
  • 圖中樹的問題
  • 最短路徑問題

一個圖是一個序偶<V,E>,其中V={v1,v2····}是優先非空集合Vn稱之為節點,V稱為節點集;圖可以用圖形描述,同樣也可以通過語言描述,圖的基本操作有分為對點的操作和對邊的操作,對點的操作主要有

查詢,取值,賦值,插入,刪除;對邊的操作主要有:插入,刪除,存取等。圖的儲存結構可以通過鄰接矩陣、邊集陣列、鄰接表、十字連結串列、鄰接多重表來實現,圖的遍歷根據抓取順序不同可以分為深

度優先遍歷和廣度優先遍歷深度是每層每層遍歷,廣度是所有子節點遍歷;圖中樹的基本操作有生成樹、最小生成樹、prime演算法、Kruskal演算法,最小生成樹就是包含所有節點的邊之和最短,prime演算法的核心

就是從某一結點出發,每次選擇相聯的最小的邊,再將那個點加入集合,Kruskal演算法就是按照權值大小將邊集結構排序,逐條檢驗。最短路徑問題就是指兩個指定點的最短距離,典型的解決方法就是迪傑斯特拉

演算法,演算法核心就是將最短邊依次收集,這樣形成的路徑一定是最短,然後將最短的路徑逐漸擴充套件,直到擴充套件至所有點。

二、作業總結

實驗一:Linux命令列和編寫簡單的Java程式

1、基於命令列進行簡單的Java程式編輯、編譯、執行和除錯

2、練習Linux基本命令;

3、學習Java程式的JDB除錯技能:https://www.cnblogs.com/rocedu/p/6371262.html

4、編寫簡單的Java程式。

部落格連結:https://www.cnblogs.com/zhangxiuqi/p/15316947.html

實驗二:編寫簡單的計算器

1.實驗內
(1) 編寫簡單的計算器,完成加減乘除模運算。
(2) 要求從鍵盤輸入兩個數,使用判定語句選擇一種操作,計算結果後輸出,然後使用判定和迴圈語句選擇繼續計算還是退出。
(3) 編寫測試程式碼,測試驗證。(https://www.cnblogs.com/rocedu/p/4472842.html)

部落格連結:https://www.cnblogs.com/zhangxiuqi/p/15334484.html

實驗三:面向物件程式設計

  • 初步掌握單元測試和TDD
  • 理解並掌握面向物件三要素:封裝、繼承、多型
  • 初步掌握UML建

部落格連結:https://www.cnblogs.com/zhangxiuqi/p/15399478.html

實驗四: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),一個人不能僅實現客戶端,必須實現一個客戶端和伺服器,否則兩個實驗均不得分!!!

(六)實驗報告

在規定時間前發表部落格,標題“學號 實驗四 《資料結構與面向物件程式設計》實驗報告”

部落格連結:https://www.cnblogs.com/zhangxiuqi/p/15456164.html

實驗五和六:線性結構及連結串列

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 (你的名字)來表示元素的總數。

部落格連結:https://www.cnblogs.com/zhangxiuqi/p/15522316.html

實驗七:查詢與排序

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程式對實現各種查詢與排序演算法進行測試提交執行結果截圖推送程式碼到碼雲(選做,額外加分)

部落格連結:https://www.cnblogs.com/zhangxiuqi/p/15553824.html

實驗八:樹

1.參考教材PP16.1,完成鏈樹LinkedBinaryTree的實現(getRight,contains,toString,preorder,postorder)
用JUnit或自己編寫驅動類對自己實現的LinkedBinaryTree進行測試,提交測試程式碼執行截圖,要全屏,包含自己的學號資訊
課下把程式碼推送到程式碼託管平臺

2.基於LinkedBinaryTree,實現基於(中序,先序)序列構造唯一一棵二㕚樹的功能,比如給出中序HDIBEMJNAFCKGL和後序ABDHIEJMNCFGKL,構造出附圖中的樹
用JUnit或自己編寫驅動類對自己實現的功能進行測試,提交測試程式碼執行截圖,要全屏,包含自己的學號資訊
課下把程式碼推送到程式碼託管平臺

3.自己設計並實現一顆決策樹
提交測試程式碼執行截圖,要全屏,包含自己的學號資訊
課下把程式碼推送到程式碼託管平臺

4.輸入中綴表示式,使用樹將中綴表示式轉換為字尾表示式,並輸出字尾表示式和計算結果(如果沒有用樹,正常評分。如果用到了樹,即使有小的問題,也酌情給滿分)
提交測試程式碼執行截圖,要全屏,包含自己的學號資訊

部落格連結:https://www.cnblogs.com/zhangxiuqi/p/15617114.html

實驗九:圖

(1) 初始化:根據螢幕提示(例如:輸入1為無向圖,輸入2為有向圖)初始化無向圖和有向圖(可用鄰接矩陣,也可用鄰接表),圖需要自己定義(頂點個數、邊個數,建議先在草稿紙上畫出圖,然後再輸入頂點和邊數)
(2) 圖的遍歷:完成有向圖和無向圖的遍歷(深度和廣度優先遍歷)
(3) 完成有向圖的拓撲排序,並輸出拓撲排序序列或者輸出該圖存在環
(4) 完成無向圖的最小生成樹(Prim演算法或Kruscal演算法均可),並輸出
(5) 完成有向圖的單源最短路徑求解(迪傑斯特拉演算法)

部落格連結:https://www.cnblogs.com/zhangxiuqi/p/15725695.html

程式碼託管連結

統計本學期的程式碼量。

課程收穫或不足

  課程收穫:通過本學期的程式設計與資料結構的學習,讓我對計算機語言方面有了很大認識的改變,雖然是將程式設計和資料結構合併為一門課,並且一學期內上完,但總體上感覺還是收穫頗豐,學到了

很多知識,首先,老師第前面的幾節課從底層方面帶領我們認識了程式設計的基本原理和實現,通過虛擬機器上使用Linux系統熟悉了底層實現方法,為我們以後工作中使用Linux系統做鋪墊。相對於上學期的

簡單程式設計,本學期的難點有兩個:1、新的語言JAVA的學習,相比於C語言,我覺得再語言實現,申明兩個方面有很大不同,Java更多涉及類的使用;2、本學期的資料結構方面的學習難度陡然增加,程式碼

量從十幾行突然上升至幾十行,到最後學到樹和圖的幾百行,還有就是相關概念的增加,可能本學期的兩個知識點就已經遠遠超過上學期所有知識點的總和;在這樣的學習環境下,也越發讓我不敢懈怠,在面臨

長程式碼的難題中依舊不依不撓,堅持寫完,如果錯了就一步一步檢查,隱隱約約中鍛鍊了我們不屈不撓,堅韌不拔的精神,課程內容很大,需要我們不僅上課要注意關注重點步驟的實現,基本原理的掌握;還需

要我們在課下進行自我總結,看能不能夠自己實現一下這個東西。同時,本課程再平時知識點檢測中才用全英文的題目,實在是讓人頭大,很多時候並不是做不來,而是理解不了,需要我們主動去提升我們的

翻譯能力,在每次遇到不熟悉的知識時也會主動去B站或者其他學習資源上查詢相關資料,遇到不懂的也會及時向老師或同學提問。自己感覺在動手能力,總結歸納,自我學習能力方面有很大的提升,同時也增

加了看待事物的廣度和深度,感謝老師的尊尊教誨,希望自己能夠在以後的生活中不斷進取。