1. 程式人生 > 實用技巧 >20192316 2020-2021-1 《資料結構與面向物件程式設計》課程總結

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

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

課程內容總結

第一章 簡要內容

本章為緒論,主要介紹

  • Java程式設計語言
  • 程式編譯執行的步驟
  • 理解問題求解的一般方法
  • 軟體開發的一般過程
  • 面向物件技術相關概念

1.1 Java程式設計語言

  • Java平臺:Java SE、Java EE、Java ME
  • 類定義: public class XXX{};
  • main方法的定義是固定的
public static void main(String [] args){}
註釋
//單行註釋

/*
多
行
注
釋
*/
識別符號和保留字
  • 常見的識別符號有:class、public、static、void、main、String、args、System、out、println......我們命名的在程式中使用的識別符號可以由任意字母、數字、下劃線和美元符號組成,但不能以數字開頭。
  • 常見的保留字有:package、this、do、if、throw、boolean、double、protected、else、import......
空白

空白包括空格、製表符和換行符。所有的Java程式都用空白作為程式中使用的字和符號的分隔符。

1.2 程式開發

程式設計語言
  • 機器語言:取決於CPU
  • 組合語言:機器語言的助記符
  • 高階語言:可移植
  • 第四代語言
編輯器/編譯程式和解釋程式

開發環境

我們主要使用IDE,附上婁老師的Intellj IDEA 簡易教程

錯誤

三類錯誤

  • 編譯時錯誤:語法錯誤
  • 執行時錯誤:異常處理
  • 邏輯錯誤:可通過除錯來定位錯誤

1.3 問題求解

  1. 理解問題
  2. 設計方案
  3. 考慮方案的選擇並優化方案
  4. 實現方案
  5. 測試方案並修改存在的問題

1.4 軟體開發行為

四個基本的開發行為:

  • 建立需求:做什麼?
  • 生成設計:如何做?
  • 實現設計:設計到程式碼
  • 測試:做對沒?

三種程式碼

  • 虛擬碼
  • 產品程式碼
  • 測試程式碼

1.5 面向物件程式設計

重要術語:

  • 物件
  • 屬性
  • 方法
  • 面向物件三要素:封裝,繼承,多型

繼承可以複用,用繼承實現多型;封裝是繼承的基礎;繼承是多型的基礎。

第二章 簡要內容

2.1 字串

print及print方法
  • Systom.out物件表示輸出裝置或是檔案,預設時指的是螢幕。
  • println方法將送給它的資訊輸出後,將游標換到下一行的行首。
  • print方法類似於println,但輸出之後不會換到下一行。
字串連線

字串連結運算子是加號(+)。

轉義字元
  • \b:回退鍵
  • \t:製表符
  • \n;換行
  • \r:回車
  • \ ":雙引號
  • \ ':單引號
  • \ \:反斜槓

2.2 變數和賦值

  • 變數:變數名和變數值
  • 賦值:=
  • 常量:final,其值不能改變

2.3 基本資料型別

  • 8 種基本型別(byte,short,int,long,float,double,boolean,char)
    • 6種數字型別(byte,short,int,long,float,double)
    • 4種整數型別(byte,short,int,long),
    • char佔兩個位元組
    • boolean只有true和false

2.4 表示式

算術運算

+、-、*、/、%

關係運算

、>、>=、<、<=、==、!=

邏輯運算

&&、||、!

運算子優先順序

從左到右的結合律,具有相同優先順序的算術運算子從左到右依次計算。表示式中的優先順序可以通過圓括號來改變。

自增,自減

i++、i--、++i、--i

2.5 資料轉換

  • 基本型別之間的轉換:加寬轉換與縮窄轉換,縮窄轉換對比加寬轉換,很可能會丟失資訊。
  • 賦值轉換
  • 提升
  • 強制型別轉換

2.6 讀輸入資料

標準輸入System.in
標準輸出System.out.println

第三章 簡要內容

3.1 建立物件

  • new:返回指向新建物件的引用
  • 別名:引用儲存的記憶體地址

3.2 String 類

String類中有許多有用的方法,比如:

  • String (String str)
  • char charAt (int index)
  • int compareTo (String str)

3.3 包

Java標準類庫中的類按包來組織。每個類都屬於一個具體的包。

3.4 Random類

偽隨機數生成器執行復雜的計算產生隨機數

3.5 Math類

Math類中的方法都是static的可以用Math.XXX()來呼叫。

3.6 格式化輸出

  • NumberFormat:有兩個方法getCurencyInstance和getPercentInstance返回用於格式化數值的物件。getCurencyInstance返回貨幣格式物件,getPercentInstance返回百分比格式物件。
  • DecimalFormat:按慣例使用new運算子來例項化物件。
  • print,println,printf方法。

3.7 列舉型別

  • 列出這個型別的變數的所有可能取值。
  • 常用enum。

3.8 包裝類

  • 包裝類是一種特殊的基本型別,能夠按物件的方式處理基本型別。
  • 自動包裝與拆包。

第四章 簡要內容

4.1 布林表示式

控制流:順序(儲存程式)
、分支(條件語句,特殊情況、
迴圈(自動化)

4.2 if語句

  • if
  • if...else
  • if...else if ... esle

4.3 資料比較

浮點數的比較:計算兩個差值的絕對值,在與公差進行比較。
字元比較:Unicode順序,大小寫字母,數字要聯絡ASCII表中的編碼。
對角比較:equals。

4.4 switch語句

swith(){
case :
case :
default:
}

4.5 while語句

break可以跳出多重迴圈。continue語句也類似,但是要再次計算迴圈條件,如果仍未真,則再次執行迴圈體。

4.6 迭代器

迭代器是一個物件,可以使用它的一些方法每次處理集合中的一個元素。也就是說,迭代器可以按需一項項地處理每一個元素。

4.7 do 語句

do ... while

4.8 for 語句

for( ; ; ),與while等價

第五章 簡要內容

5.1 再談類和物件

類:屬性(變數/常量)+方法(函式)。
類是物件的抽象\藍圖,而物件是類的具體例項。

5.2 類的剖析

UML類圖:實現、關聯、聚合、組合、繼承。

5.3 封裝

public、private

5.4 方法的剖析

  • return:返回值
  • 區域性資料:作用域只在其宣告所在的方法內。

5.5 靜態類成員

  • 靜態變數(static):有時也稱類變數,它由類的所有例項共享,在一個物件中修改靜態變數的值,就等於修改了其他所有物件中該靜態變數的值。
  • 靜態方法:不需要為了呼叫方法而例項化類的一個物件,只能訪問靜態變數或區域性變數。

5.6 類關係

  • 依賴
  • 聚合
  • UML中的表示
  • this

5.7 方法設計

  • 方法的分解
  • 引數傳遞:傳值、傳引用

5.8 方法過載

  • 引數型別與數量
  • 不管返回值

5.9 測試

  • 評審
  • 缺陷測試:發現錯誤,質量保證
  • 單元測試:模組測試,確保方法的正確性
  • 整合測試:系統大元件的正確性
  • 系統測試:與需求保持一致性
  • 測試驅動開發,在編寫方法前先編寫測試用例,從而為正在開發的系統提供功能。

5.10 除錯

需要熟悉開發環境中的除錯方法,找出程式中的錯誤。

第六章 簡要內容

GUI元素

  • 在Java中建立一個GUI程式至少需要三類物件:元件、事件、竊(防和諧)聽(防和諧)器。
  • 四要素:元件、容器、佈局、事件

第七章 簡要內容

7.1 陣列元素

Java中陣列索引從0開始。

7.2 陣列的宣告及使用

  • Java陣列是物件,要用new例項化,new指定大小,之後陣列大小不能改變。如:
int [] arr = new int[2316];

int arr [] = new int[2316];
  • Java中訪陣列元素不能越界,用陣列的length屬性控制
  • 第一次宣告陣列可以使用初值表代替new例項化陣列

7.3 物件陣列

物件陣列的例項化,只是分配了儲存引用的空間,每個元素中儲存的物件還必須分別例項化。

7.4 命令列引數

args[0]的值是類名,
args是字串陣列。

7.5 變長引數表

變長引數必須是方法的最後一個引數。

7.6 二維陣列

int[][] arr = new int[M][N];

第八章 簡要內容

8.1 建立子類

  • extends繼承,繼承的作用之一是程式碼複用,Java只支援單繼承
  • super與this:常用於呼叫構造方法

8.2 方法的重寫

  • 過載與重寫的區別:
    一、定bai義上的區別:

1、過載是指不同的函式使用相同的函式名,但是函式的引數個數或型別不同。呼叫的時候根據函式的引數來區別不同的函式。

2、覆蓋(也叫重寫)是指在派生類中重新對基類中的虛擬函式(注意是虛擬函式)重新實現。即函式名和引數都一樣,只是函式的實現體不一樣。

二、規則上的不同:

1、過載的規則:

①必須具有不同的引數列表。

②可以有不同的訪問修飾符。

③可以丟擲不同的異常。

2、重寫方法的規則:

①引數列表必須完全與被重寫的方法相同,否則不能稱其為重寫而是過載。

②返bai的型別必須一直與被重寫的方法的返du型別相同,否則不能稱其為重寫而是過載。

③訪問修飾符的限制一定要大於被重寫方法的訪問修飾符。

④重寫方法一定不能丟擲新的檢查異常或者比被重寫方法申明更加寬泛的檢查型異常。

三、類的關係上的區別:

重寫是子類和父類之間的關係,是垂直關係;過載是同一個類中方法之間的關係,是水平關係。

子類中的方法與父類一樣是重寫,可以用@Override從語法上保證

8.3 類層次

  • 類層次中公共特性放父類中
  • Object類是所有類的父類
    圖圖圖
  • abstract 與抽象類:抽象類表達抽象概念,不能用new例項化
  • 抽象類的子類:實現父類的抽象方法變成具體類,不實現父類抽象方法仍要用abstract修飾

8.4 可見性

圖圖圖圖圖

8.5 設計繼承

final 禁止繼承

第九章 簡要內容

9.1 後繫結

  • 多型引用在不同的時候可以指向不同型別的物件
  • 多型引用執行時才將方法呼叫與它的定義繫結在一起

9.2 通過繼承實現多型

  • 引用變數可以指向宣告繼承於它的任意類的任何物件

9.3 介面

  • interface,implements 等價於class,extends
  • 介面是一組抽象方法,與抽象類一樣不能被例項化
  • 介面層次:介面可以繼承介面;類可以實現介面,但不能繼承介面。
  • Comparable介面:compareTo()
  • Iterator介面:hasNext()、nextZ()

9.4 通過介面實現多型

  • 和class一樣,介面可以用來宣告物件引用變數
  • 介面引用可以指向實現這個介面的任意類的作何物件
  • 方法的引數可以是多型的

第十章 簡要內容

10.1 異常處理

  • 錯誤和異常代表不常見的或不正確處理的物件
  • 錯誤(Error)不用捕獲
  • 處理異常:在異常發生的地方處理;在程式的其他地方處理

10.2 不捕獲異常

  • 程式中出現異常不捕獲異常,程式會崩潰
  • 呼叫棧跟蹤:第一行給出原因,異常型別;棧的第一行給出產生異常的程式碼(這個般就是產生異常的原因)

10.3 try-catch 語句

  • Java中把正常流程放try塊中,錯誤(異常)處理放catch塊中
  • 每個catch 子句處理try塊中可能丟擲的一種特定型別的異常
  • 注意多個catch一定把父類放後面處理
  • finally:總會執行,用於資源管理

10.4 異常傳播

  • 如果沒有在異常發生處捕獲及處理,異常會被傳播給呼叫的方法
  • catch or throw?:throws:自己無法處理,用在方法宣告;
    throw:方法中丟擲Checked Exception,方法宣告中必須有throws。

10.5 異常類的層次

  • Error及其子類寫程式不用處理
  • Java異常處理是要處理Exception類及其子類:
    • RuntimeException及其子類也不用處理(Unchecked Exception),是免檢異常;
    • 產生RuntimeException的問題在呼叫程式碼
  • Multi-catch:類之間不能有繼承關係
  • 自定義異常

10.6 I/O異常

  • 幾乎所有的IO API都可能丟擲異常
  • 異常:除0、陣列越界、找不到類、找不到方法……
  • 流:位元組流、字元流
  • 標準流:System.in、System.out、System.err

第十一章 簡要內容

11.1 遞迴思想

可以用數學思維理解遞迴,鍛鍊遞迴思想。

11.2 遞迴程式設計

程式呼叫自身的程式設計技巧稱為遞迴。需要注意與迭代的區分。

11.3 使用遞迴

在編碼過程中使用遞迴演算法可以極大程度地減少程式碼數量。

第十二章 簡要內容

12.1 演算法效率

計算機系統中最重要的資源之一是CPU時間,完成具體任務的演算法效率是決定程式執行速度的一個主要因素。

12.2 增長函式和大O符號

圖圖圖圖圖

12.3 比較增長函式

圖圖圖圖圖

第十三章 簡要內容

13.1 查詢

  • 線性查詢:可以設定哨兵提高查詢效率。
  • 二分查詢:從中間開始,要求表是有序的,每次比較後可以減少查詢池中的一半元素。

13.2 排序

  • 選擇排序:分別將每個值放在排好序的最終位置,從而完成一組值的排序。
  • 插入排序:將一個具體的值插入到表中已有序的子系列中,從而完成一組值的排序。
  • 氣泡排序:重複地比較表中的相鄰元素,如果它們不符合要求則交換他們。
  • 快速排序:根據一個任意選定的劃分元素來對錶進行劃分,然後再遞迴地對劃分元素兩邊的欄位進行排序,從而完成對錶的排序。
  • 歸併排序:遞迴地對分表,知道每個子表只含有一個元素時為止,然後再將子表按序合併,從而完成對錶的排序。

13.3 分析查詢和排序演算法

  • 考慮當問題大小增大時演算法的漸進複雜度。
  • 考慮每個演算法的最優情形和最差情形。

第十四章 簡要內容

14.1 集合的介紹

  • 集合是收集並組織其他物件的物件,它定義了訪問及管理成為集合元素的其他物件的而一種具體方式。
  • 集合中元素之間的組織方式通常由它們加入集合的次序和元素之間的某些固有的關係決定。

14.2 棧集合

  • 後進先出
  • push將元素新增到棧頂
  • pop刪除棧頂元素
  • peek檢視棧頂元素
  • isEmpty判斷棧是否為空
  • size判斷棧中元素的個數

14.3 繼承、多型和泛型

主要是對泛型的學習,參考泛型就這麼簡單

14.4 棧的ADT

棧介面定義為Stack,是對泛型T進行操作的。

14.5 使用棧:計算字尾表示式

計算機容易識別字尾表示式。
可用棧操作,1.從左到右掃描表示式,2.運算元入棧,3.遇到操作符則pop兩個數計算後再push。

14.6 異常

字尾表示式計算中潛在的異常情況:

  1. 入棧時如果棧滿
  2. 出棧時如果棧空
  3. 掃描完表示式時棧中的值多於1個

14.7 使用陣列實現棧

參考用陣列實現一個棧結構

14.8 ArrayStack類

定義ArrayStack類來表示基於陣列實現的、可儲存泛型T物件的棧集合。

14.9 將引用作為鏈

  • 與有固定大小的陣列不一樣,連結串列沒有容量上限。
  • 連結串列被看成是一個動態結構,它的大小總隨著所儲存的元素個數在變大或變小。

14.10 管理連結串列

  • 訪問元素
  • 插入結點
  • 刪除結點
  • 哨兵結點

14.11 沒有鏈的元素

  • 定義一個獨立的結點類,用來將元素連在一起。
  • 雙向連結串列。

14.12 使用鏈實現棧

連結串列實現棧

  1. 插入/刪除都在棧頂
  2. Top指向棧頂元素
  3. 陣列可以隨機存取,隨時取得某個數,但是連結串列必須從頭開始
  4. 需要遍歷連結串列while(head != null){操作};

參考使用連結串列實現棧k

14.13 使用java.util.Stack 類實現棧

參考java.util.Stack(棧)的簡單使用

14.14 包

第十五章 簡要內容

15.1 佇列ADT

佇列是一個線性集合,它在一端新增元素,在另一端刪除元素————先進先出。

介面中一般有以下功能:

  • enqueue:將元素插入到隊尾。
  • dequeue:從隊頭刪除元素。
  • first:檢測隊頭的元素。
  • isEmpty:判定佇列是否為空。
  • size:斷定佇列中的元素個數。

15.2 使用佇列:編碼K值

Caesar密碼是一個簡單的加法密碼,它將資訊中的每個字元按字典序移動k位。

15.3 使用佇列:模擬票務櫃檯

考慮在劇院排隊買票的場景,一般情況下,售票員越多,隊伍移動得越快,但是經理不想僱用多餘的職員,應該如何更合理地安排工作。

  • 提出假設
  • 模擬實現

15.4 實現佇列:使用連結串列

使用LinearNode物件的連結串列實現佇列,所不同的是必須在連結串列的兩段進行操作。所以,除了有一個指向連結串列第一個元素的引用(front),還必須使用第二個引用(rear)指向表的最後一個元素。此外還用一個整型變數count記錄佇列中的元素個數。

15.5 實現佇列:使用陣列

為了完善此方法,要使用一個迴圈陣列來實現佇列,定義類Circular-ArrayQueue。將陣列當做一個環來使用,第一個下標接在最後一個下標的後面。

第十六章 簡要內容

16.1 樹

數(tree)由一組節點(node)和一組邊(edge)構成。

  • 子節點
  • 兄弟結點
  • 滿二叉樹
  • 完全二叉樹

16.2 樹的遍歷

  • 先序遍歷
  • 中序遍歷
  • 後序遍歷
  • 層序遍歷

16.3 樹的實現策略

因為樹是非線性結構,需要給予陣列來實現。

16.4 二叉樹的實現

一大波程式碼,在實驗八中已進行實際操作。

16.5 決策樹

簡單的決策樹可用一棵二叉樹來表示。診斷時,從根節點的問題開始,根據答案選擇適當的路徑直至到達葉結點。

第十七章 簡要內容

17.1 二叉查詢樹

查詢類:

  • getRoot()返回根節點
  • getParent()返回父結點
  • getChildCount返回孩子結點數
  • getFirstChild()返回第一個孩子結點
  • getNextChild()返回下一個兄弟結點
  • isEmpty()判定樹是否為空樹
  • depth()求樹的深度
  • traverse()遍歷樹

插入類:

  • tree()建構函式,初始化置空數
  • assign()給當前結點賦值
  • insert()插入操作,可以是結點或子樹

刪除類:

  • makeEmpty()將樹清空
  • Delete()刪除操作,可以是節點或子樹

17.2 二叉查詢樹的實現

參考二叉查詢樹(三)之 Java的實現

17.3 平衡二叉查詢樹

參考二叉查詢樹,平衡二叉樹

第十八章 簡要內容

18.1 堆

堆是一棵完全二叉樹

  • addElement(),向堆中新增一個新元素。
  • removeMin(),刪除最小值,並重構堆。
  • removeMax(),刪除最大值,並重構堆。
  • findMin(),尋找最小值。

18.2 堆的實現

參考堆的原理和實現
資料結構------堆(二、堆的實現)

18.3 堆排序

可以使用陣列形式,用順序結構儲存最為合適。

  • 最小堆(小頂堆)
  • 最大堆(大頂堆)

18.4 優先佇列

  • 具有更高優先順序的項排在前面
  • 具有相同優先順序的項按先進先出的規則排列。

第十九章 簡要內容

19.1 無向圖

圖中表示邊的頂點對是無序的圖是無向圖,意味著兩點間的連線是雙向的。

19.2 有向圖

圖中的邊是頂點的有序對的圖為有向圖,意味著有向圖的邊是有方向的邊。

19.3 帶權圖

圖中每條邊都對應一個權值的圖成為帶權圖,有時也稱為網路。

19.4 常用的圖演算法

  • 廣度優先遍歷
  • 深度優先遍歷
  • 無向圖的最小生成樹(Prim演算法或Kruscal演算法)
  • 有向圖的拓撲排序
  • 有向圖的最短路徑求解(迪傑斯特拉演算法)

19.5 圖的實現策略

鄰接表

  • 鄰接矩陣

第二十章 簡要內容

20.1 雜湊方法

20.2 雜湊函式

20.3 解決衝突

20.4 從雜湊表中刪除元素

20.5 Java Collection API中的雜湊表

第二十一章 簡要內容

21.1 資料庫介紹

21.2 建立與資料庫的連結

21.3 建立並修改資料庫表

21.4 查詢資料庫

21.5 插入/檢視及更新資料

21.6 刪除資料和資料庫表

(按順序)總結所做過的作業

作業1:安裝虛擬機器

安裝成功虛擬的Linux系統

作業2:《資料結構與面向物件程式設計》第一週作業

  • 對專業的認識和期望
  • 虛擬機器安裝
  • Linux命令的學習
  • 實驗樓Linux命令實踐學習

作業3:編寫簡單的類

  1. 編寫一個類(書、人、動物、汽車、球員、遊課程、戲角色等),定義類的屬性和方法。
  2. 編寫測試類(暫用包含main方法的類),new一個上面類的物件並初始化,然後呼叫類的屬性和方法。
  3. 編譯執行通過

作業4:類繼承作業

編寫一個類,要求實現繼承,可以以遊戲、書籍、球員、複數等為例。

  1. 必須包含至少1個抽象方法。
  2. 必須測試,測試引數來自命令列引數。
  3. 簡單測試一下Object類的方法。
  4. 要求能夠實現兩個物件的比較(Comparable介面)

作業5:複數計算器

實現複數類(加減乘除運算和比較大小)

要求使用Comparable介面、要求自定義介面、要求使用繼承。

作業6:棧實踐

用陣列實現自己的棧,ArrayStackADT,需要包含棧的常規操作,並測試。
需要包含push、pop、peek、size、isEmpty等操作。

作業7:二分查詢(折半查詢)實踐

給Searching類新增二分查詢演算法的遞迴實現方法。建立驅動程式來演示這個實現機制。

  1. 程式設計實現遞迴
  2. 建立一個測試類,測試遞迴實現的二分查詢是否正確。

作業8:二叉樹的建立和層序遍歷法實踐

  1. 給定一個序列AB#CD###E#F##建立一顆樹,根據“二叉樹的生成”演算法構造這顆樹。(3分)
  2. 使用層序遍歷方法完成遍歷並測試(3分)。

作業9:哈夫曼編碼實踐

設有字符集:S={a,b,c,d,e,f,g,h,i,j,k,l,m,n.o.p.q,r,s,t,u,v,w,x,y,z}。
給定一個包含26個英文字母的檔案,統計每個字元出現的概率,根據計算的概率構造一顆哈夫曼樹。
並完成對英文檔案的編碼和解碼。
要求:

  1. 準備一個包含26個英文字母的英文檔案(可以不包含標點符號等),統計各個字元的概率
  2. 構造哈夫曼樹
  3. 對英文檔案進行編碼,輸出一個編碼後的檔案
  4. 對編碼檔案進行解碼,輸出一個解碼後的檔案
  5. 撰寫部落格記錄實驗的設計和實現過程,並將原始碼傳到碼雲
  6. 把實驗結果截圖上傳到雲班課

實踐1:使用VIM編輯器編寫Java程式

  1. 任務1:使用VIM編輯器編寫Java程式。要求輸入2個Int型別的數值m和n,當m不為0時,計算(m!)+(m的n次方),並輸出。當m為0時提示重新輸入。
  2. 任務2:使用VIM編輯器編寫Java程式。要求輸入1個Int型別的數值n。當m>0時,輸出一個m行的三角形(醜或漂亮的三角形都行)。當m小於等於0時提示重新輸入。
    要求程式能夠執行成功,否則後面均不得分。

實踐2:查詢及ASL作業

給定關鍵字序列19 14 23 1 68 20 84 27 55 11 10 79,試分別用順序查詢、折半查詢、二叉排序樹查詢、雜湊查詢(用線性探查法和鏈地址法)來實現查詢。試畫出它們的對應儲存形式(順序查詢的順序表,二分查詢的判定樹,二叉排序樹查詢的二叉排序樹,兩種雜湊查詢的散列表),並求出每一種查詢的成功平均查詢長度。其中,雜湊函式H(k)=k%11。

實踐3:排序

使用選擇和插入排序法,寫出第3次排序的結果:3 1 9 3 6 2 10

實踐4:樹-計算題

  1. 有1023個結點的完全二叉樹,其高度是多少?葉結點數是多少?
  2. 高度為h的完全二叉樹至少有多少個結點?至多有多少個結點?
  3. 已知一棵度為m的樹中有n1個度為1的結點,n2個度為2的結點,…,nm個度為m的結點,問該樹中有多少個葉結點?

實踐5:哈夫曼編碼測試

哈夫曼編碼測試,畫出哈夫曼樹,寫出各個葉子節點的編碼。

實踐6:地圖染色問題

給圖染色,具體演算法如下:

  1. 將圖的結點按照度數遞減的次序排列.
  2. 用第一種顏色對第一個結點著色,並按照結點排列的次序對與前面著色點不鄰接的每一點著以相同顏色.
  3. 用第二種顏色對尚未著色的點重複步驟2,直到所有點著色完為止.

實踐7:最小生成樹測試

  1. 畫出Prim演算法的最小生成樹的生成過程
  2. 畫出Kruscal演算法的最小生成樹的生成過程
  3. 計算最小權值

實踐8:Dijkstra(迪傑斯特拉)演算法測試

使用Dijkstra(迪傑斯特拉)演算法計算單源(V1出發)最短路徑。

(按順序)實驗報告連結彙總

實驗一 linux命令列和編寫簡單java程式

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

實驗二 編寫簡單的計算器

簡單計算器,完成加減乘除模的運算。

實驗三 面向物件程式設計

  1. 下載安裝並使用IDEA
  2. 初步掌握單元測試和TDD
  3. 理解並掌握面向物件三要素:封裝、繼承、多型
  4. 初步掌握UML建模

實驗四 Java Socket程式設計與密碼學

  1. Java Socket程式設計
  2. Java和密碼學
  3. 編寫有理數/複數計算器
  4. 遠端有理數計算器
  5. 遠端複數計算器

實驗五 Android程式設計

  1. Android Stuidio的安裝測試
  2. Activity測試
  3. UI測試
  4. 佈局測試
  5. 事件處理測試

實驗六 線性結構之連結串列

  1. 通過鍵盤輸入一些整數,建立一個連結串列
  2. 實現節點插入、刪除、輸出操作
  3. 使用氣泡排序法或者選擇排序法根據數值大小對連結串列進行排序
  4. 在android上實現以上操作

實驗七 查詢與排序

  1. 定義一個Searching和Sorting類,並在類中實現linearSearch,SelectionSort方法,最後完成測試
  2. 重構你的程式碼
  3. 參考http://www.cnblogs.com/maybe2030/p/4715035.html ,學習各種查詢演算法並在Searching中補充查詢演算法並測試
  4. 補充實現課上講過的排序方法:希爾排序,堆排序,二叉樹排序等
  5. 編寫Android程式對實現各種查詢與排序演算法進行測試

實驗八

  1. 參考教材PP16.1,完成鏈樹LinkedBinaryTree的實現(getRight,contains,toString,preorder,postorder)
  2. 基於LinkedBinaryTree,實現基於(中序,先序)序列構造唯一一棵二㕚樹的功能,比如給出中序HDIBEMJNAFCKGL和後序ABDHIEJMNCFGKL,構造出附圖中的樹
  3. 自己設計並實現一顆決策樹
  4. 輸入中綴表示式,使用樹將中綴表示式轉換為字尾表示式,並輸出字尾表示式和計算結果

實驗九

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

程式碼託管連結:

  • 給出statistic.sh的執行結果,說明本學期的程式碼量目標達到沒有?

因為我有兩個庫,因此總程式碼量大概為8300行,加上linux裡的程式碼大概有9000行,但並沒有達到本學期10000行的程式碼量(一定是因為我的程式碼寫得比較精簡的原因,值得表揚)。

  • 加點程式碼,改點程式碼是理解的最好方式,參考程式設計的智慧,談談你的心得

程式設計的智慧體現在解決實際問題的方面,我在平時的練習中有參考別人的程式碼,再結合上課所學知識編寫出自己的程式碼,在這個過程中能夠比較高效地提高程式設計能力。

  • 積極主動敲程式碼做到沒?教材實踐上有什麼經驗教訓?

基本上做到了。
教材實踐中的經驗教訓:教材的程式碼不一定符合我們當前的實際程式設計情況。比如,教材中多次出現ArrayIterator類,然而,在idea上進行實際操作時,我們的ArrayIterator類是一定要一個引數才能例項化一個物件,因此需要使用ArrayList代替。

課程收穫與不足

  • 自己的收穫(投入,效率,效果等)
  1. 我在本門課程上的時間投入佔比在所有科目中應該是最大的,但是如此大程度的投入並不會讓我感到厭煩,在這個過程中我收穫了更嚴謹的思維、更強大的邏輯能力、更充足的耐心。
  2. 我經常在除錯中浪費大量時間,因此在效率方面還有待提高。
  3. 效果還是比較顯著的,對資料結構有了初步的理解,對面向物件的程式設計也有所涉獵了。
  • 自己需要改進的地方
  1. 我個人比較不喜歡看書,學習的過程比較依靠網上的部落格、視訊以及老師的ppt,有些脫離教材。
  2. 沒有完全吸收本學期的所學,對部分內容缺乏理解,只是生搬硬套。
  • 結對學習是不是真正貫徹了?寫一下你提供的幫助或接受了什麼幫助,並對老師提供參考建議
  1. 我在實驗四中貫徹了結對學習。
  2. 我提供的幫助:參考程式碼,以及客戶端和伺服器相連線的方法。
  3. 我接受的幫助:對加密解密演算法的理解。
  4. 參考建議:結對學習比較難長時間保持,而且有時會出現一人比較積極一人比較懈怠,但最終兩人卻取得同樣分數的情況。因此我覺得需要加強對結對雙方的考核,加一些分數激勵。

問卷調查

  • 你平均每週投入到本課程有效學習時間有多少?

20小時左右吧?任務較輕鬆時可能10小時左右,但是任務繁重時月亮不睡我不睡,電腦沒電我再睡。

  • 每週的學習效率有提高嗎?你是怎麼衡量的?

應該是有些許的提高。衡量辦法主要是:在無數次的bug中逐漸錘鍊了更強的自學能力,自己上網找尋解決問題的方法。

  • 藍墨雲班課的使用對你的學習有促進嗎?有什麼建議和意見嗎?

有促進作用,在雲班課上可以明確看到自己的任務完成到哪個程度了,與其他同學的差距如何。

建議:更新並精簡一下雲班課的資源,讓雲班課的資源和上課所需的內容更加契合。

  • 你覺得這門課老師應該繼續做哪一件事情?

繼續保持翻轉課堂教學方式。

  • 你覺得這門課老師應該停止做哪一件事情?

停止讓助教單純按照部落格文字描述給分的評判標準,因為一開始並沒有明說部落格的評分標準,而且部落格並不能體現一個人的真實水平,水分很大。

其他任意發揮

很喜歡老師的教學方法和教學風格(〃'▽'〃),java的故事暫時告一段落,咱們python再續前緣。

碼雲連結1

碼雲連結2