時間:2023-05-30 10:17:43
開篇:寫作不僅是一種記錄,更是一種創造,它讓我們能夠捕捉那些稍縱即逝的靈感,將它們永久地定格在紙上。下面是小編精心整理的12篇數據結構課程設計,希望這些內容能成為您創作過程中的良師益友,陪伴您不斷探索和進步。
摘要:本文針對傳統數據結構課程設計教學過程中出現的問題,提出一種案例驅動的數據結構課程設計教學方式,以幫助學生理解和掌握分析問題、解決問題的方法,提高自主學習能力,鍛煉設計創新能力。實踐表明,此教學方式能夠彌補傳統教學的不足,開闊學生的思路,提高自主完成率,達到課程設計目的。
關鍵詞:課程設計;數據結構;案例驅動;教學改革
中圖分類號:G642
文獻標識碼:B
1引言
數據結構課程是計算機相關專業的專業基礎課程,屬于專業課程體系中的核心課程。該課程著眼于對基本數據結構進行闡述和分析、講解基本數據結構的應用并介紹典型的基本算法等三個方面,內容比較抽象枯燥,掌握起來相對困難。數據結構課程設計是一門獨立的實驗環節,是對數據結構課程教學理論的延伸和補充,是對理論知識的綜合應用,其目的是發揮學生的主動性,培養學生分析實際問題并加以解決的能力,鍛煉學生的設計創新能力。
傳統的數據結構課程設計教學輕講授,主要以對學生的單獨輔導為主,督促學生完成課程設計。這種方式存在后文所提及的一些問題,隨著互聯網資源的日益豐富,部分問題更加突出了。為了能讓學生通過課程設計更好的掌握數據結構的內容,我們設計了案例驅動的數據結構課程設計教學改革,實踐證明,該項教改能夠填補傳統教學過程的不足。
2傳統教學過程中暴露的問題
(1) 缺乏駕馭全局的能力。本科二年級學生計算機建模能力弱,沒有軟件工程的思想,因而缺乏駕馭全局的能力。軟件工程課程一般都開設在數據結構課程之后,在進行數據結構課程設計前,學生也基本沒有分析、編寫較大程序的經驗,這種情況造成了學生拿到問題后不知該從何下手和如何規劃好課程設計的整個過程。
(2) 生搬硬套基本數據結構。數據結構教材中都是最原始的數據結構,不進行擴展和修改基本上是不能直接用到課程設計中解決實際問題的,而采用多種數據結構解決問題并加以比較找尋最優方案對于學生來說就更為困難。
(3) 對高級程序語言掌握不到位。數據結構課程設計是需要用高級程序語言來編寫的,學生對該程序語言的掌握程度直接影響到課程設計的質量,常見的問題包括:變量定義不規范、函數功能劃分不合理、代碼可讀性較差、文件讀寫掌握不好、調試程序能力較弱等。
(4) 照搬、照抄他人課程設計的現象存在。由于完成課程設計的時間有限,有的學生在無法自主完成的情況下,通過網絡、書籍等方式來查找解題方法。本來通過查閱資料消化吸收他人的解題思路來求解自己的課程設計問題是毋庸置疑的正規途徑,然而一方面課程設計的題目每個學校每屆學生都相對比較固定,致使存在抄襲往屆學生程序的現象,另一方面互聯網的發展使得查找相似題目的課程設計源代碼并非難事。此外,市面上還存在著大量快餐式的課程設計書籍在售,這類書籍良莠不齊,多是搜集、羅列了若干課程設計題目,源碼、光盤附上,草草分析講解了事。許多學生也習慣了這種快餐式的學習,能做到獨立思考、舉一反三的越來越少。
3案例驅動的數據結構課程設計教學改革特點
案例驅動的數據結構課程設計教學改革是將案例教學法引入數據結構課程設計教學中,教師通過講解一個完整的案例分析解決過程,輔以多媒體的手段與學生交流、互動,達到培養學生分析并解決實際問題的能力,鍛煉學生的設計創新能力的目的,同時也彌補了目前數據結構課程設計教學重實踐、輕講授的不足,豐富該項課程設計的教學內容。該方法有以下特點:
(1) 提前熟悉軟件工程思想。案例的分析解決過程就是一個實踐軟件工程思想的過程,學生可以在講解的過程中體會軟件開發的完整流程,進而對自己的課程設計有全局性的考慮。
(2) 舉一反三,定制合適的數據結構。對于案例講解中所涉及到的數據結構,教師將進行細致的分析。采用不同數據結構解決同一問題,在性能和功能上會有所區別,學生可以在與教師的互動討論中提高對各種數據結構的認識,從而設計適合解決自己課程設計的數據結構,甚至能夠采取多種解法。
(3) 養成良好的編程習慣。優秀的代碼就像優美的文章一樣能使閱讀者心情舒暢,教師講解的案例都是代碼級別的,定義規范、流程清楚、可讀性強、具備參考價值,這樣就促使學生養成良好的編程習慣。教師以多媒體手段演示代碼的編制調試過程,使學生對編程環境更加熟悉,能夠靈活運用跟蹤、斷點等調試手段,開發過程事半功倍。
(4) 最大限度避免抄襲課程設計的現象。大多數學生事實上都希望能夠自主完成課程設計,只是因為不會做才導致抄襲往屆學生或是市售相關書籍源碼的現象存在。授之以魚不如授之以漁,通過對典型案例的講授,教師教給了學生解決課程設計的方法,學生找到了突破口,便愿意通過自己的努力完成任務,自己能制作“大餐”,也就不再求助于“快餐”了。
4典型數據結構課程設計案例分析
“活期儲蓄帳目管理”是常見的數據結構課程設計題目,下面以其講解過程為例簡單描述一下案例驅動的數據結構課程設計教學的過程。
此課程設計需要實現的功能一般是:(1)采用交互工作方式;(2)實現儲戶開戶;(3)實現儲戶銷戶;(4)向某賬戶存款;(5)從某賬戶取款;(6)排序顯示所有賬戶信息;(7)查詢某賬戶余額;(8)查詢某賬戶交易記錄;(9)所有賬戶及其交易信息存儲至文件,程序運行時從文件中讀入。該課程設計考察的知識點包括:選擇并構造數據結構;使用與特定數據結構相應的算法來實現具體功能;對文件讀寫結構化數據;對程序設計語言的靈活運用等。
首先應對題目進行大致的分析,該題目包括兩方面的信息。一方面是儲戶的信息,可設計為包含賬號、姓名和余額等字段;另一方面是交易記錄信息,可設計為包括賬號、存取時間、存取標志、金額等字段,兩方面信息通過賬號字段關聯起來。使用順序存儲結構、鏈式存儲結構或樹形結構都可以存儲這些信息,但其中各有利弊。順序存儲結構設計簡單,但容量固定,賬戶插入刪除需要進行記錄的移動,單個賬戶的交易記錄信息存儲不易連續導致列舉時需要對全部交易記錄進行完整遍歷,對已排序順序表查找某一記錄時可以采用特定算法(如二分法)提高效率,總體上來說實用性和整體效率相對較差。鏈式存儲結構設計略復雜,容量不設上限,賬戶插入刪除較方便,采用鏈式結構存儲的交易記錄形式上連續,列舉時很方便,但在查找某一記錄時需要遍歷整個鏈表效率較低,總體上來說實用性和整體效率中上。樹形存儲結構相對最復雜,容量也不設上限,插入、刪除算法也相對復雜,采用特殊樹形結構(如二叉排序樹)能夠提高查找記錄時的效率,交易記錄仍可采用鏈式結構存儲,總體上來說實用性和整體效率較好,現實中的數據庫管理系統(DBMS)多是用樹形結構來實現的。從實現難度上來說,順序存儲最簡單,鏈式存儲次之,樹形存儲最難。因此,對學生一般要求其用鏈式存儲來實現,對能力較強的學生可以鼓勵其用樹形存儲來實現,以鏈式存儲為例繼續討論。
賬戶信息和存取記錄之間是通過賬號來關聯的,在鏈式存儲結構中可以用指針來表示兩者的聯系,即每個賬戶節點(數據域可包含賬號、姓名和余額等字段)具有兩個指針域,一個指針指向下一個賬戶節點,另一個指針域指向該賬戶的存取記錄鏈表(存取記錄節點的數據域可包含存取時間、存取標志、金額等字段),如下圖所示。
從功能上分析,儲戶開戶、儲戶銷戶就是在賬戶鏈表中進行插入和刪除操作;對賬戶存、取款時,首先找到相應賬戶,然后添加一條存取記錄,同時修正該賬戶的余額;排序顯示所有賬戶信息,就是對賬戶記錄依據某一關鍵字進行排序并顯示排序結果;查詢某賬戶余額,就是遍歷賬戶鏈表,找到對應記錄并顯示出來;查詢某賬戶交易記錄,就是先找到該賬戶,然后遍歷顯示該賬戶對應的存取記錄鏈表。可以看出,對賬戶鏈表進行遍歷查詢在賬戶存取款、查詢余額和查詢存取記錄是都有用到,因此在設計時,可以考慮編寫查詢賬戶函數,以供其他功能模塊調用。
在文件存取方面,存取時都是以存儲節點為單位進行的,即一次性存取一個結構體。該課程設計有其特殊之處,有兩種類型的結構體需要存取,即賬戶信息和存取款記錄,這兩種結構體所占用的空間不盡相同,若是都保存在一個數據文件中則需要一定的技巧。以保存記錄到文件為例,可以采用存一個賬戶信息,再存一個整形數,該整形數的數值為此賬戶對應存取記錄節點的數量,然后再逐一保存每條存取記錄,存儲完畢后再用相同方法保存下一個賬戶的記錄。讀取文件過程則是存儲過程的逆過程,這樣可以保證存取時,賬戶信息和存取記錄一一對應,不至于混淆。
在確定了上述思路后,便可以著手編碼,值得注意的是數據結構的定義。由于采用了鏈式結構,許多同學便直接將鏈式結構的節點(包括指針域)直接存儲到文件中。事實上,這個指針域是沒有保存價值的,尤其在讀取時如果也將指針域讀出并賦值,將很有可能導致不可預知的錯誤。可以采取的方法是,先定義只包含數據域的數據結構體,再定義鏈表節點結構體將數據結構體封裝起來并加上指針域,在文件讀寫時只對數據結構體進行操作。給出該課程設計數據結構參考定義如下:
typedef struct log //存取記錄
{
char DateTime[25]; //存取時間
char W_D; //存取標志
float Amount; //存取金額
} log;
typedef struct node_log //存取記錄節點
{
log data; //存取記錄
struct node_log *next; //下一存取記錄節點指針
} node_log, *p_node_log;
typedef struct account //賬戶記錄
{
char ID[10]; //賬號
char Name[10]; //姓名
float Balance; //余額
} account;
typedef struct node_account //賬戶記錄節點
{
account data; //賬戶記錄
struct node_log *nlog; //存取記錄節點指針
struct node_account *next; //下一賬戶記錄節點指針
} node_account, *p_node_account;
其他功能模塊便可以參照數據結構教材上的相關算法設計實現。
5結果與結論
我們將來自3個不同專業(計算機、網絡工程、軟件工程)10個班級的57名同學分成了兩組,一組(試驗組)通過上述方法進行了課程設計教學,一組(對照組)仍采用傳統方法教學,課程設計題目相同。課程設計對比統計情況如下表,其中試驗組優良率達到44%,不合格率13%,對照組優良率21%,不合格率26%。同時,試驗組采用了多種方式來實現了課程設計,且雷同情況較少,對照組多數采用順序存儲方式實現,程序雷同情況較多。很明顯,試驗組的學生思路更加開闊,自主完成率更高。
時代在變遷,信息獲取更加便捷,部分學生的學習積極性在某種程度上也發生了蛻變,隨之的教學方式也應有所改變,教師應從正面加以引導。在以案例驅動的數據結構課程設計教學改革實踐中,教師通過對典型案例的細致分析,比較不同數據結構的優缺點,一方面使學生更加牢固的掌握了數據結構知識,另一方面讓學生找到入手之門,激發學習興趣,提高動手能力,更重要的是能讓學生掌握分析和解決問題的方法,自主完成課程設計,這對今后其他課程的學習也是有所裨益的。
參考文獻:
[1] 張培,肖天慶. 基于網絡環境下教學設計與課程開發的合作模式研究[J]. 電化教育研究,2007,(9):60-63.
[2] 吳宏偉,張殿龍,梅險. 高校網絡輔助教學的探索與實踐[J]. 計算機教育,2007,(7):18-21.
[3] 張敏霞. 程序設計語言課程教學方法改革的探索與實踐[J]. 中國高教研究,2004,(2):90.
關鍵詞:CDIO模式;教學改革;創新意識
CDIO是Conceiving,designing,implementingandoperating的縮寫,即“構思、設計、實現、運作”。2014-2015年度第一學期,我們對遼寧工業大學(以下簡稱我校)電信學院數據結構課程,以CDIO模式進行了數據結構課程設計教學模式的探索。數據結構課程是一門實踐性很強的專業核心課程,將CDIO教學模式在數據結構課程設計運用,就是培養學生創新能力、分析設計能力和團隊合作能力的重要途徑。培養學生充分考慮數據結構特性、響應速度、處理時間、存儲空間和單位時間的處理量技術參數,鼓勵學生自己去嘗試各種設計方案,找出最有效的解決辦法,著重培養學生專業能力、分析設計能力和合作能力。
一、傳統實踐教學存在的問題
實施教學改革前,傳統的數據結構的課程設計是一般性設計。課設布置題目是針對教學內容的小型練習題,讓學生獨立完成程序設計與實現。從學生的認知規律以及學生不同個體差異來看,把一些難懂的、晦澀的、抽象的東西原封不動地給出并采取傳統的教學模式進行教與學有幾點弊端:第一,學生在毫無知識背景的前提下,要完全理解這些抽象概念及抽象數據類型比較困難。第二,課設涉及到的知識點內容單一,不需要學生考慮創新思維方面的設計方案。只要將課堂講過的內容直接拿來用就可以,對于課設中各種技術參數的要求可以說沒有理解,導致設計解決方案不是最合適的。課程設計沒有達到預期收獲。第三,學生缺乏團隊合作過程,自己完成一個小型題目,在設計方案和算法設計過程中鍛煉的層次和涉及面都比較窄。沒有體現數據結構在處理大規模復雜問題時才能體現出的優勢,使學生沒有真正認識數據結構存在的意義。對以后學生參加實踐類課程活動有很大影響。
二、課程設計的改革措施
《數據結構》課程設計采用了CDIO教學模式,強調知識的綜合運用,鍛煉學生對復雜問題進行分析與求解的能力,在項目實施過程中始終圍繞“構思、設計、實現、運作”。它的指導思想是:以工程設計任務為導向,以培養學生創新能力、團隊合作能力為主要目標。通過利用綜合性課程設計,培養學生進行復雜程序設計這個主線,將學生在課堂上所學的比較抽象的理論知識具體化,提高了理論和實踐相結合的能力。具體做法如下:
(一)課程設計內容改革
第一,從課程設計選題上精心準備:需要介紹題目內容,介紹算法產生的背景。明確數據內在的必然聯系,分析數據的邏輯結構;確定解決問題所需要用到的算法及設計參數的要求,設計數據的存儲結構;解決該課設到底應該怎么做的問題。題目規模適宜,課程設計題目覆蓋的知識點應盡可能避免單一,設計內容要新,具有綜合性。第二,擴大知識面:要求學生從需求分析開始,通過查找大量的資料,充分理解設計技術參數的要求及實現方式,根據設計要求對空間復雜度、處理時間、時間復雜度和單位時間的處理量等技術參數,分析數據進行哪些操作,建立數據的存儲結構。第三,數據結構課程特點邏輯結構強,概念抽象,學生對于知識點的綜合運用能力差。在課設中明確知識點的前后序關系和知識點的歸屬,解決學生只見樹木不見森林的盲目性和隨機性。
(二)課程設計實施方法
我們對遼寧工業大學電子與信息學院數據結構課程,以CDIO模式進行了數據結構課程設計教學模式的探索,并且實施如下改革:第一,采用啟發式的設計思路,引導學生圍繞課程設計目標,通過查找與分析有關參考資料,培養和鼓勵學生的學習興趣,同時提高學生查閱資料的能力。第二,讓學生能夠按照軟件工程的思想進行軟件的分析、設計與實現,提高學生實踐動手能力和協作開發大型軟件項目的能力。第三,在項目實施中,進行探究式的學習,不應該只是“手把手”地教,要給學生留出發揮想象力和創造力的空間,激發學生創造的意識和能力。第四,努力使學生對規范性的軟件開發不僅僅是以實現相應的程序為目標,更重要的是培養學生今后從事軟件開發所需要的各種能力與素質,包括測試能力和文檔寫作的能力。因此,在課程設計實施中,我們考察學生程序編寫、測試以及實驗報告撰寫工作。
三、實踐情況及效果
CDIO模式在國際高等教育中已有共識,通過實踐,根據軟件工程專業本科教學的培養目標,解決了傳統教學方式存在的問題,提高了實踐能力,體會到數據結構課程設計實踐教學采用CDIO模式,突出了學生在理論教學與實踐教學過程中的主體地位,提高了教學的針對性和實效性。將CDIO教學模式引入到數據結構課程設計教學中,改變了該課程的教學理念,重理論,輕實踐;重課堂,輕課外。改變了教師單向的知識傳授與學生被動接受之間的教與學模式,實踐情況及效果表現在:(1)學生學習方式發生了轉變,從被動接受知識,到主動查閱資料,對于題目要求的設計技術參數有了進一步理解,使學生學會分析和研究計算機處理的數據結構的特點,分析數據的邏輯結構及設計存儲結構,設計算法的基本思想,提高了理論和實踐相結合的能力。對知識有比較全面深刻了解,實際解決問題的能力有了明顯的提升。(2)采用CDIO教學模式,對于課程設計題目精心安排,給學生留出發揮想象力和創造力的空間,提高了學生運用知識分析問題和解決問題的能力。培養學生的創新能力和創造性思維。(3)實踐中,培養學生充分考慮數據結構特性、響應速度、處理時間、存儲空間和單位時間的處理量技術參數,鼓勵學生自己去嘗試各種設計方案,找出最有效的解決辦法。著重培養學生專業能力、分析設計能力和合作能力。
參考文獻:
[1]張洪奎,等.國家級實驗教學示范中心建設的探索與實踐[J].高等理科教育,2009,83(1):22-26.
[2]方愷晴,等.信息技術實驗室教學示范中心的建設與改革[J].實驗室研究與探索,2009,28(4):93-95,100.
[3]陳春林,等.基于CDIO教育理念的工程學科教育改革與實踐[J].教育與現代化,2010(1):30-34.
【關鍵詞】數據結構;基本知識;課程實驗;方法;改革
中圖分類號:G423.07 文獻標志碼:A 文章編號:1673-8500(2014)01-0068-01
一、數據結構內涵
數據結構是指相互之間存在著一種或多種關系的數據元素的集合和該集合中數據元素之間的關系組成。目前,對數據結構研究已經成為世界上一些非數值量的信息結構及其處理方法,它被定為計算機科學與技術相關專的重要課程,同時也是應用數學、管理科學等很多專業的一門基礎課程。為了更好有成效的使用計算機、讓計算機的性能得到充分發揮,數據結構的有關知識的學習和掌握是非常必要的,大量的很難的算法存在于數據結構中,分解與抽象是它的核心技術,要想讓學生掌握這門核心技術,就要認真扎實的通過對課程內容的學習與實踐,構造性思維訓練的特征得到有效的體現,提高學生的操作能力和實際應用水平。
二、數據結構課程設計改革
通過課程設計來讓學生進一步掌握數據結構的整體框架和知識層次,課程設計的內容主要是根據三種邏輯結構(線性、樹型和圖型)把課程分成三部分貫穿下來,對每一部分又采用層次結構,即邏輯結構、存儲結構和在該存儲結構上的操作及相應的算法。結合講過的一個和幾個典型的算法給學生留一個實際問題,讓學生編程序上計算機去處理。如:講線性問題的插入和刪除這部分時,就留一作業題:把學生成績按學號錄入進計算機中,一涉及到實際問題就會用到許多的相關知識,需要查閱大量的書籍和網站。不過,得到的收獲也是可觀的。
三、數據結構教學手段和教學方法的改革
實現以教師主導下的以學生為主體的教學模式。在具體的教學手法方面,把學生為教學的主體,堅持實行任務驅動的教學手段,誘導學生主動學習,相互協助學習,共同進行探索與研究,這種教學方式學生很容易接受并受到好評,取得成效很顯著。研究算法的具體法則是給學生的算法實現的有關程序和算法實現的思路。每一節課上完后,對討論過的內容作出總結,對本節極容易出錯的狀況做好歸納,梳理出具體條款。學生對每一種數據結構的特點和實現都能夠牢牢地掌握。除此之外,做好與學生溝通協調工作,重視課后輔導。課下輔導除在課堂中以及學生上機進行輔導之外,還有一種辦法是和學生取得聯系,利用網上交談的手段,利用這種手段,掌握學生的思想動態、學習狀況,迅速回應學生在自主學習及課后學習時遇到的疑難問題。教師在數據結構教學手段上,要精心設計教學內容,對較困難的算法制作以及收集了大量FIASH演示動畫方面的材料。把抽象的概念和空間結構加以具體化、形象化,使所教的數據結構內容直觀、生動、提高了學生的學習的積極性,同時提高數據結構教學質量和學生的學習效果。
四、數據結構基本知識部分教學的改革
數據結構的基本知識是這門課程的重點,包括數據的邏輯結構,相應邏輯結構的存儲結構,以及在此存儲結構上的相關操作及算法等,這些內容必須要講,也很枯燥,教學時可以根據實際情況做一些調整。
教授學生理解數據結構這門課,同時也是提高學生的學習興趣的實踐過程。通過舉例分類、總結學生參與進來的辦法來幫助學生理解數據的邏輯結構和存儲結構等概念。首先從實際情況入手來引出邏輯結構的概念:學生都知道計算機能進行圖書管理,能和人對弈,可是學生要明白計算機之所以能干這些事是靠人工編的程序輸入到計算機中來支配計算機工作的,程序怎么編,不同的問題有不同的編程思路,那么實際中的問題基本上就是這么三類;線性問題、樹型問題和圖型問題。接著通過分析上面圖書管理問題,下棋問題,以及修路問題來讓學生明白什么是線性、樹型和圖型問題,接著給一定的時間讓學生每人想出一個線性、樹型和圖型關系的例子,在生動活潑的氣氛中把實際問題過渡到這門課中來,實際生活活躍了學生的課堂氣氛。反過來,學生也把數據結構的理論知識應用到了實際中去,最后總結到實際問題的線性、樹型和圖型的邏輯關系是人類對實際問題的邏輯思維。在數據結構這門課中把這種邏輯關系叫做邏輯結構。要讓計算機處理實際問題必須把從實際問題中抽象出來的數據和它們之間的邏輯結構存儲到計算機中,計算機才能夠對實際問題進行處理,那么怎么存儲呢?邏輯結構在計算機中的存儲方式在數據結構中就叫存儲結構。邏輯結構和存儲結構這兩個概念學生就順其自然地接受下來。
五、數據結構課程實驗部分教學的改革
進行實驗教學改革,加強實踐教學環節。讓學生學以致用是教師傳授知識的目的,因此明確教學目標,把培養學生的能力放到重要位置,重視數據結構實踐性環節。數據結構課程的讓學生上機實習,是對學生極有利全面綜合訓練,它與課堂上聽老師的講解、自主學習和獨立訓練是相輔相成的,也是教學中不可或缺的一個教學環節。因此為了幫助學生更好地學習本課程,理解和掌握算法設計所需的技術,制定了實驗大綱,實驗指導書,實驗手冊等設計了系統的有效的實驗項目,規范實驗報告,提高學生編程能力和專業技術水平。
在學生理解了數據結構的邏輯結構和存儲結構這兩個概念的基礎上,接著讓學生學習計算機對數據的操作和算法。算法一般都是用C語言來描述的,要想讓學生掌握好每個操作的算法,一定要學生自己編出完整的程序,直接上機訓練每個算法。在理論課上把每種邏輯機構聯系到的操作進行初步歸類后,接著講每種操作的算法。講算法時主要采用以下方式幫助學生理解和掌握:
關鍵詞:程序設計;教學改革;實踐能力
中圖分類號: G642文獻標識碼:A文章編號:1009-3044(2012)02-0366-02
Practice on the Teaching of the Programing Course
YUAN Hui-yong, YANG Si-qing, YI Ye-qing
(Department of Computer, Hunan Institute of Humanities, Science and Technology, Loudi 417000, China)
Abstract: This paper first analyses the problem in teaching of "C Language"," Data Structure" and "Algorithm Design and Analysis", and then propose a reform of teaching by improving teaching method, integrating teaching content and strengthening practice teaching. Results show that the reform of teaching can effectively stimulate students interest in learning, improve the efficiency of learning and the ability of programming.
Key words:programming; reform of teaching; ability of practice
1概述
目前C語言程序設計、數據結構、算法分析與設計是計算機及其相關專業中非常重要的專業課程。在以往教學中,這三門課程采用相對獨立、分開授課的方式,導致課程內容脫節與重復,教學效果差,學習完三門課程后卻不能編寫程序的大有人在。這三門課程都以培養學生解決實際問題的程序設計能力為共同目標,因此,如何將三門課程有機地結合起來,構建程序設計系列課程的新體系,整合教學內容,改進教學方法,切實提升學生的程序設計能力,成了當前計算機專業教學改革中亟待解決的問題。
2教學中存在的問題
在傳統的教學中,C語言程序設計、數據結構、算法分析與設計三門課程的分開授課,課程知識沒有整合,對課程知識中存在重疊的內容,只是做簡單的重復講解(如C語言和數據結構課程中都有數組這個教學內容),教學深度不夠。教學中注重講授基本理論,忽略了程序設計過程中涉及的方法和技術(如算法分析與設計課程通常是將已有的經典算法在數學模型和數據結構上給學生解釋),理論教學與實踐教學結合不夠緊密(如數據結構在講授了某種抽象的數據關系和在計算機中的表示與實現后,并沒有將這種結構用到解決實際問題中去),造成有些學生雖然具備了一定的理論基礎,但由于實踐教學薄弱,動手能力差。
3具體改革措施
我們改變了以往C語言程序設計、數據結構、算法分析與設計分開授課的模式,而是將這三門課程作為一個整體,以培養學生解決實際問題的程序設計能力為目標,從組織教學內容、改進教學方法、突出實踐教學等方面進行教學改革與實踐。
3.1整合教學內容
C語言程序設計是數據結構的前導課程之一,學生對它的掌握程度直接關系到數據結構課程的教學效果。算法分析與設計是計算機專業程序設計類的核心課程,在學習該課程之前,要求學生們掌握了基本的數據結構知識,能熟練運用一門或多門編程語言,并具備一定的編程經驗。
我校原來的C語言、數據結構和算法分析與設計三門課程是相對獨立、分開授課的,學習效果不理想。我們將這三門課程的知識進行整合,采用同一教師授課,做到了前導課、后續課的有機銜接,并重新制定了三門課程的教學計劃,以知識點為單元,將這三 門課程很好地結合起來。在C語言的教學中,以C語言為主線,適當穿插數據結構中的相關內容,使C語言與數據結構有機地結合在一起,如我們將C語言中的數組和數據結構中的直接插入排序、冒泡排序、簡單選擇排序、順序查找、折半查找方法放在一個知識單元中。在數據結構教學中,穿插了算法分析與設計的有關知識,如在講述哈夫曼樹和圖的最小生成樹時,穿插了講述了貪心算法,在講述圖的最短路徑時介紹了動態規劃算法。
我們不再把C語言當做一門語言來講解,加強了數據結構、算法設計、邏輯思維和編程方法的教學。數據結構課程不再只注重講授抽象的數據關系和存儲結構,而要求學生用C語言編程實現各種算法,并結合實際應用,在ACM/ICPC在線評測系統上完成相應的練習題目,學生不再感到枯燥無味,不僅較好地解決了數據結構教學中學生上機困難的問題,也提高了學生的程序設計能力。在算法分析與設計課程教學中,我們選擇一些難度適中、能結合實際問題和相關課程的知識來講解,使學生既能理解,又能拓展創新。
3.2改進教學方法
我校屬于應用型本科院校,其教育目標著重于培養具有實際工作能力的技術型和應用型人才。在C語言的教學中我們采用了“案例”教學方法,從日常生活中選擇能典型反映教學內容的案例,所選案例難度適中并能反映多個知識點。如選用了“學生的成績管理”,該案例覆蓋了C語言中的循環結構與數組,涉及數據結構中的排序與查找。在該案例中穿插介紹了數據結構課程中的直接插入排序、冒泡排序、簡單選擇排序和順序查找;通過介紹C++中的排序函數qsort()激發學生自覺地學習C++標準模版庫;并提出如何保存學生信息以避免重復輸入數據的問題,引導學生自學C語言中的文件操作,培養學生的再學習能力。在算法分析與設計課程的教學中,我們采用了“任務驅動”教學方法,將具體的算法設計策略融入到一些“任務”中,課堂教學以任務為主,引導學生利用算法設計策略探索解決方案,在課后的實踐環節,將結合實際應用且融入了知識點的任務放到ACM/ICPC在線評測系統上,讓學生在課后根據任務描述,自主探索問題解決方案,并提交程序代碼。
在教學過程中,對典型例題力求講透徹,并提出問題給學生思考。如斐波拉契數列,講解了分別使用變量交換的循環結構、使用數組的循環結構和遞歸三種編程方法,并比較了三種方法的優缺點,使學生深刻體會到了采用遞歸求解斐波拉契數列的低效,引導學生理解使用數組的高效是基于算法分析與設計課程中的動態規劃的思想,并且穿插介紹了數據結構課程中算法的時間復雜度與空間復雜度的度量;再提出大斐波拉契數列的求解問題,介紹使用數組進行高精度計算以及使用矩陣和二分法的求解方法,激發了學生的學習積極性。在例題的講解過程中,充分利用多媒體教學手段,加強了例題講解過程中的現場調試與分析,鼓勵學生對具體問題進行分析和研究,培養學生的邏輯分析和判斷能力,重視上機訓練,養成良好的編程習慣。
3.3加強實驗教學
這三門課程都是理論與實踐并重的課程,在教學中必須將理論教學與實踐教學緊密結合。我們從以下幾個方面來加強實驗教學:
1)重新編寫實驗指導書。按照教學內容的知識點,綜合可操作性、趣味性和適當的難度,編寫了適合教學要求的實驗指導書,既保證了實驗的可完成性,又增強了學生的興趣。
2)建立在線題庫。在ACM/ICPC在線評測系統上開設了C語言程序設計、數據結構、算法分析與設計的專題訓練,每個專欄按照教學知識點安排了不同難度的練習題,學生可以根據自身的能力,完成相應等級的題目,在探索與解決問題的過程中獲得學習成就感。
3)組織程序設計比賽。ACM/ICPC在線評測系統上安排了與教學知識點相關的競賽真題,鼓勵學生組隊、按照比賽規程進行模擬比賽。通過比賽,學生對教學知識點有了更深入的理解,不僅增強了學生的實踐動手能力,提高了學習興趣和積極性,也使學生提前了解ACM比賽的規則和比賽真題,訓練了學生的參與意識、競爭意識和團隊精神,為以后組織學生參加省程序設計比賽打下良好的基礎。
4)開設課程設計。課程設計的題目以典型的問題或實際的工程為主,如數據結構課程選用了“教務計劃編制問題”,讓學生運用圖論中的拓撲排序來求解這個實際問題。通過課程設計,培養了學生綜合運用所學知識進行分析和解決實際問題的能力,使學生不僅學到了解決問題的辦法,同時加深了理論的理解與掌握,做到了理論教學與實踐緊密結合。
3.4改革考核與評分標準
考試作為課程教學的一個重要環節,對學生的學習具有明顯的導向作用。這三門課程原來的考核分為平時成績和期末考試,這樣的考核方式很難考察學生的實踐能力,導致大部分學生只注重期末考試,而忽略學習過程,很難有效的提高學生的創新能力和實踐能力。我們認為這三門課程的考核應著重考核學生的程序設計能力,而不是死記硬背一些基礎知識。為此,我們引入了ACM/ ICPC在線評測系統及,對課程的考核進行了大膽改革,評分標準也作了修改,提高實驗考核成績在課程總評成績中的比重,以此來引導學生認真對待實驗和課程設計,切實提高學生的實踐動手能力。
4結束語
實踐證明,將C語言程序設計、數據結構、算法分析與設計這三門課程有機結合的教學改革,能夠很好地激發學生的學習興趣,學生在掌握基本理論和知識的同時,程序設計能力、數據結構和算法設計的應用能力也得到了很好的培養,我校學生在近二年的湖南省程序設計比賽中均取得了較好的成績。
參考文獻:
[1]譚浩強. C程序設計(第2版) [M].北京:清華大學出版社,2005.
關鍵詞:應用轉型;算法與數據結構;任務驅動;教學改革
中圖分類號:TP312 文獻標識碼:A
教育部于2013年,提出一項重大的改革,即計劃將大約600所地方性高等本科院校轉型為應用型本科院校,2014年被列入教育部當年工作要點[1]。在高等院校向應用型本科轉型的形勢下,高校教學面臨著新的機遇和挑戰。商洛學院作為陜西省首批應用轉型試點高校,實現畢業時與社會、企業零距離對接,完成高等學校為社會輸送有用人才的最終目標[2]。
算法與數據結構課程是計算機相關專業的專業基礎課程,是設計各種應用軟件的重要基礎,是我校電子信息科學與技術專業課程體系中的核心專業課程。本文主要針對當前教學過程的問題,進行探討研究,提出一種新的教學模式,達到教與學的有機結合[3]。
一、課程教學改革的必要性與緊迫性
算法與數據結構課程主要涵蓋數據結構的闡述分析、應用以及經典算法的應用,主體內容比較抽象,難以直觀描述,掌握相對困難。此外,電子信息科學與技術專業的學生計算機基礎知識薄弱,電子和計算機專業之間培養差異,導致電子信息科學與技術專業學生學習更加困難。隨著互聯網行業的迅猛發展,網絡教學資源的日漸豐富以及算法與數據結構課程地位的愈加重要,傳統教學模式中的問題日益突出[4]。
(一)數據結構課程自身特點
(1)高度抽象化,需要扎實的數理邏輯、圖論、高等數學、拓撲幾何、離散數學和數值分析等理論基礎;(2)內容涵蓋面廣泛豐富。(3)隱含的技術方法豐富,各部分問題解決方式種類多樣、沒有固定解法、靈活性強。
(二)應用轉型下發展算法與數據結構課程的教學目標
(1)重視算法與數據結構基礎理論知識學習,理解數據邏輯、數據存儲及數據運算等基本概念術語;(2)從實際問題出發,培養學生運用算法與數據結構的基本理論知識分析解決實際問題的能力;(3)重視學生實踐動手能力和工程項目思想的培養。
二、傳統教學過程中現存問題
根據長期從事算法與數據結構的教學過程,發現當前算法與數據結構教學中主要存在以下一些問題。
(一)難理解:本課程需要較高的邏輯思維和抽象思維能力,學生聯系實際比較困難這一問題始終縈繞在整個教學過程中。
(二)難把控:電子信息科學與技術專業本科二年級學生,其計算機基礎、建模能力、軟件工程的思想薄弱。
(三)難實現:體現在遇到問題不知如何數據結構類型;面對具體算法不清楚如何進行優化;書本上的程序不能直接運行,學生自主學習有一定困難[5]。
(四)難應用:數據結構相關實驗的課程設計主要采用高級程序語言(如C,C++)等來編寫,我校電科專業學生對該程序語言的掌握程度直接影響到數據結構課程的實際應用情況。
三、教學模式改革與探索
針對現有傳統教學中存在的問題,為了提高學生算法與數據結構應用能力,需完善并加強實踐教學內容。
(一)調整課程體系
當前教學是依據傳統的知識理論體系順序授課:然而當前應用轉型環境下這種模式已難以適應。根據學生學習認知一般規律及我校電子信息科學與技術專業自身特點,在傳統教學基礎上進一步優化課程培養體系,針對每一知識點配備相應實踐項目,將理論與實踐有機結合。
(二)優化教學手段
傳統課堂教學主要以教師粉筆板書講授為主,不能用動態直觀的方式講解抽象知識,難以激發學生學習熱情,無法達到課題教學目的。
1.將微課引入教學中
借助微課這一新興教學模式,將算法與數據結構課程重點、難點設計開發成網絡視頻資源,供學生課后自主學習。我們將算法與數據結構中每一個知識點的內容,制作成微教案、微視頻、微練習、微點評、微互動等傳至課程網絡中心。
2.將案例驅動引入教學中
案例驅動的算法與數據結構教學方法,是將教學案例引入到課程教學過程中。教師通過一個完整案例的分析解決,借助板書、多媒體等手段與學生互動,達到培養學生發現問題、分析問題、解決問題的能力。
3.加強課外創新實踐活動
算法與數據結構課程需要增加學生的課外創新實踐活動。具體通過以下方式開展:(1)組建算法和數據結構學習創新小組,定期舉行學習經驗研討交流活動,分享實際設計過程的困難、解決途徑和最新成果;(2)定期組織以算法為核心競賽活動,(3)鼓勵學生申報研究學習與科技創新性實驗項目,組織參加省市級或國家級各類學科競賽。
3.改革課程考核模式
傳統實驗課的課程,實驗動手部分只占10%,很多學生把重點放在報告書寫上,為適應應用轉型發展,加強學生實踐能力,課程考核提出以下改革方案:(1)平時(考勤+開卷隨堂測試+課堂表現),占學期總成績的10%;(2)課程上機實驗(源程序+實驗報告)30%;(3)期末卷面成績60%;(4)鼓鈦生到相關優秀企業進行培訓實習
四、結語
針對當前電子信息科學與技術專業算法與數據結構教學模式中培養目標及存在的主要問題,在轉向應用型本科院校新形勢下,為培養創新型、應用型人才,提高學生邏輯思維、編程運算等能力,本文主要從課程體系調整、教學手段優化、創新實踐教學加強、考核模式改革共4個方面都出發,以提高算法和數據結構應用能力為教學目標,結合工程項目與市場實際需求,指導并加強實踐教學。
參考文獻:
[1]陶影,張斌.數據結構實驗教學應重視算法設計與分析能力的培養[J].實驗室研究與探索,2008,12:119-122.
[2]張銘,趙海燕,王騰蛟,宋國杰,高軍.北京大學“數據結構與算法”教學設計[J].計算機教育,2008,20:5-11.
[3]唐劍梅,譚平.《數據結構與算法設計實訓》課程教學研究[J].軟件導刊,2016,01:193-194.
[4]李治軍,廖明宏,張巖.數據結構與算法課程設計教學模式的探討[J].計算機教育,2006,02:54-56.
關鍵詞:CDIO理念;數據結構教學模式;創新思考;實踐
中圖分類號:TP311.12-4 文獻標識碼:A 文章編號:1674-7712 (2014) 04-0000-01
數據結構課程是計算機相關專業核心的基礎課程,其主要是研究計算機領域中相關的基本問題。隨著計算機技術以及信息化技術的普及,各行各業對計算機軟件應用廣泛,所以數據結構課程在高校中已經不僅僅是計算機基礎課程,更是眾多理工科選修的熱門課程。然而由于其內容專業性強,不易理解,所以對數據結構教學帶來了諸多困難,所以加強教學創新,促進數據結構教學發展具有很大的意義。
一、CDIO理念概述
CDIO是目前國際上高等工程教育中先進的創新模式,這種模式的根本目的就是將個人、社會以及系統的制造原理和技術有機的結合起來,為工程教育提供一個合理的、通用的教學目標,促使這種理念能適用于工程教學學科中各個領域。
CDIO理念的形成靈感來至于對工程中系統以及產品生命周期,在培養學生對工程相關基礎知識以及理論方面特別關注,并為工程教育放到具體的工程實踐領域中,在教育過程中涉及到團隊合作以及創新設計等。這個教育理念下,通過個人或團隊參與、構思、設計等體驗,可以讓學生真正的融入到教學中去,并培養學生對系統構建的能力。
二、基于CDIO理念背景下數據結構教學模式創新的思考
數據結構課程作為計算機相關學科的基礎性學科,學習過程中既有抽象的基礎理論,還包括具體的計算實踐,只有將兩者有機的結合,才能真正的培養學生實踐的能力。對于計算機以及相關專業的學生來說,團隊合作的能力也是在教學過程中需要重點培養的技能之一,其必須從基礎學科抓起。這就需要在進行數據結構教學中積極探索創新新穎的教學方法,充分的調動學生學習的積極性,注重教學實踐與理論學習相結合的方法。基于CDIO理論給數據結構教學的啟示主要包括以下幾個方面:
第一,在進行數據結構基礎理論教學的過程中,還應該重視計算實踐教學相結合,這樣才能保證數據結構課程能取得更大的教學效果;第二,數據結構教學中,要運用多種教學方式相結合的模式,加強創新,增強課堂教學的趣味性,這樣才能激發學生參與教學活動的熱情;第三,在教學過程中,注重培養學生團隊合作的能力,在確保個人基礎知識掌握的基礎上,給予學生充分的時間進行團隊合作,發揮團體協作的作用;第四,計算機數據結構課程設計方面,可以說是一個學科內獨立的環節,也是對課堂教學的延伸與發展,必須加強教學方式的創新與改革,選擇適當的教學方式全面培養學生理論與實踐能力。
三、CDIO理念下數據結構教學模式創新的具體措施
根據上圖可知,在原有的數據結構理論教學基礎上,通過開展一系列的設計實驗活動。這樣可以發揮學生的主觀能動性,并使學生對課堂的理論知識進行了全面的鞏固,對培養學生的思考能力、動手能力以及創新能力都有極其重要的意義。這種模式下的數據結構教學具體措施為以下幾點:
傳統的數據結構理論教學,教師進行刻板的講授,學生被動的接受,這樣學生的學習積極性不高,導致教學效果欠佳。根據這一問題,需要在進行理論教學過程中,以問題為導向,充分的發揮學生討論、交流的模式優勢,增添教學課堂上的趣味性。在引入一個新的概念或理論前,用一個貼近生活的問題引入,這樣能引起學生的學習興趣,促使學生對知識點的掌握。如數據結構中隊列理論的學習過程中,可以提出企業客服問題、銀行排隊問題等用計算機怎樣解決?這樣就能引發學生進行思考,潛意識就將學生帶入教學環境中。
在教學過程中,要應該充分的利用教學實驗作為教學的輔助手段,并通過實踐教學進行鞏固。在數據結構教學中,驗證性實驗往往恩能夠起到很好的教學實驗,學生通過自己參與對理論驗證實驗,增加了其對理論知識點的了解,并進行了相應的實踐練習。如讓學生利用自己學到的相關理論知識進行樹與二叉樹實踐驗證,一般都是運用經典算法進行。
在數據結構教學中,很多理論都可以延伸出許許多多的知識點,所以要充分的培養學生舉一反三的能力,并通過大量的練習達到對技能熟練掌握的目的。這就要求教師在完成一個階段的理論教學后,給予學生足夠的時間進行對課堂所學知識進行總結,并獨立完勝課程設計。
四、結束語
數據結構教學是計算機以及計算機相關專業最基礎但又最核心的課程,并隨著計算機技術的普及向著其他學科領域發展。由于數據結構的內容專業性強、生澀難懂,傳統的教學方式往往達不到理想的教學效果。在CDIO理論背景下,給數據結構教學帶來了很好的啟示,并指導數據結構教學向著理論與實踐結合、實驗與教學結合、傳統與創新結合的方向發展,推動了數據結構教學的發展。
參考文獻:
[1]肖媚燕,徐東風,周云華.基于CDIO理念的數據結構教學模式創新與實踐[J].中國現代教育裝備,2012(05):89-90.
[2]歷威成.CDIO模式的教育理念以及實踐研究[J].四川師范大學碩士論文庫,2013(012):26-67.
[3]楊猛召,順澤元,劉文強. CDIO 理念在數據結構課程中的探索與實踐[J].計算機教育,2010(12):125-126.
關鍵詞:數據結構;教學改革;教學手段
“數據結構”是計算機科學中的一門綜合性專業基礎課,是信息科學的核心課程,是研究非數值計算的程序設計問題中計算機操作對象以及它們之間的關系和操作等的一門學科。主要是培養學生分析數據、組織數據的能力。我校的部分專業,如資信、電子以及管理等專業都開設了數據結構課程;部分沒有開設本課程的院系學生有時也主動旁聽數據結構課程。由于數據結構具有較強的理論性和實踐性,不同專業的學生特別是非計算機專業學生在教學過程中,無論是理論課程還是實踐過程確實存在一定的困難。筆者作為該課程的主講教師,結合自己在數據結構教學中的一些體會,談談對目前教改的認識。
1數據結構教學中存在的問題
1.1前導課程“欠債”較多
“數據結構”的前導基礎課程是“C語言程序設計”和“離散數學”。我校有多個院系開設C語言課程,不同院系所開設的“C語言程序設計”的教學內容和教學要求并不完全一致。許多非計算機專業的學生一般在學習本課程之前并未經過嚴格的程序設計基礎訓練,教師為了教學進度采取“填鴨”式的教學方式,導致學生對C語言理解不深,特別是指針、結構體、聯合體以及函數等知識點,而這些又傳遞影響到數據結構的教學。另外“離散數學”是學習“數據結構”的基礎課程之一,但是由于課時不足,目前我校非計算機專業均未開設這門課。
1.2教學與專業背景脫節
“數據結構”是一門理論性、抽象性很強的課程,教學中一定要將課程內容與學生專業背景相融合,讓學生結合專業知識加深對理論的理解,同時也讓學生真正體會到數據結構理論是為專業實踐服務的。但在目前的教學實踐中,教師只注重學生課堂理論知識的掌握,在面向不同的專業的學生時采用相同的教學案例,這使非計算機專業學生很難產生“共鳴”,教學效果自然達不到理想的目標。
1.3教學重點模糊
在目前的教學過程中,無論是計算機專業還是非計算機專業都沒有結合專業著重加強相應的知識點的教學。如我校的地球物理與信息工程學院就包括了測井、勘探、攝影測量與遙感等學科方向,而數據處理在測量工作中是最重要的一個環節。對測量數據處理往往需要解大型的方程組,這涉及到稀疏線性方程的壓縮存儲問題,可以采用三元組順序表和十字鏈表的方式。因此在測井專業的教學內容上,應該將稀疏矩陣作為一個重點內容,為后續專業知識的學習奠定一些基礎。
1.4教學內容取舍不當
目前我校數據結構的教學內容基本相同,沒有根據專業具體情況注意內容的取舍。計算機專業數據結構為56課時,并有16課時的課程設計;其他非計算機專業的數據結構課時為56課時,其中有8課時實驗課,但沒有數據結構課程設計。在這種的情況下,讓學生系統地掌握數據結構的基本內容,在教學內容的選擇上必須注意取舍,一些理論性太強,在專業內應用面不夠廣泛的內容就可以舍棄,如廣義表、動態存儲管理以及外部排序等內容。
2 “因專業施教”的教學過程研究
2.1加強以數據結構為核心的課程群建設
目前,國內高校在數據結構課程教學研究中的實驗教學方法、教學模式和教學內容優化等方面取得了一些實踐性成果,但在課程綜合體系建設方面仍然有一些不足[1]。非計算機專業教學時尤其要強調數據結構與其他相關課程的緊密銜接,并將離散數學、數據庫、操作系統、圖形學、圖像處理等課程的主要知識點分散、穿插、融入到數據結構的教學中,從而優化整個課程體系結構。
2.2面向不同專業學生的數據結構教學方法研究
教學是以學生為主體,教師為主導的過程。教學方法是否適當,是否適合教學對象,是影響教學效果的關鍵部分。現有的主要教學方法包括[2]:啟發式教學法、任務驅動教學法、案例教學法以及討論式教學法等。每種方法只適合應用于某些特定的情形,課題組根據不同的專業的教學內容和教學對象,采取了不同的教學方法。例如,計算機專業、電子專業的學生采用啟發教學方法,教學中注意講解知識點時要盡力去打破學生頭腦中的“平靜”,激發學生思維活動,引導學生提出問題、分析問題和解決問題,歸納總結出一般規律或概念[3]。這種方法注重培養學生的科學思維方式,激發學生學習的積極性和創新精神。根據多年的教學經驗,石油勘探專業適合于任務驅動教學法。勘探專業具有很強的專業背景,教師根據勘探專業教學大綱要求,精心設計地震數據處理實例任務,將教材中每個章節的重點、難點內容專業化、具體化、形象化、采用任務驅動法對數據結構課程展開教學。管理專業以及測井專業采用案例教學法。圍繞教師所提供的測井系統軟件案例,學生在教師的引導下,積極進行閱讀、思考、分析、討論和實踐,從而達到深刻理解問題的原理和本質,提高分析問題和解決問題的能力,養成探究性的學習態度的目的。我校案例教學具體實施地點在多媒體教室,學生每人配備一臺機器,能夠完成實時網絡教學任務。
2.3面向不同專業學生的數據結構教學內容改革
針對不同院系制訂合理的數據結構教學內容,評估教學內容的取舍方案,通過突出重點內容,充實數據結構的專業應用環節。例如,測井專業的教學內容除了稀疏矩陣的應用外,由于測井信息通道不斷增加,傳輸的數據量越來越大,必須對采集的數據在傳輸前后分別進行壓縮。哈夫曼編碼在測井數據的無損壓縮方面發揮著重要作用。另外,在勘探專業地質建模中,通常需要對大規模地震數據進行分析以發現地下潛在可能的油氣資源。地震數據的存儲,八叉樹是一種有效的方法。最短路徑在井間地震層析成像開發中發揮著重要作用。因此,在講解二叉樹的基礎內容時,有必要擴展一些八叉樹的知識;在講解圖的應用時要注意結合井間地震數據層析成像的實際例子。
2.4面向不同專業學生的數據結構實踐教學改革
實踐教學是課堂理論教學的延伸和補充。培養并提高學生的實踐能力是數據結構課程的基本目標。不同專業學生學習的側重點相同。例如,電子專業在學習計算機語言時側重硬件方面的應用,缺乏計算機程序設計基礎訓練,軟件工程的概念不強;管理專業、測井專業以及勘探專業學生具有較好的軟件編程基礎,但邏輯抽象能力特別是面向對象分析與設計能力欠缺。即便是同一專業的不同學生,他們的學習主動性和學習能力各不相同。如果采用“一刀切”式的尺度要求所有同學,往往起不到良好的教學效果。為了達到“因專業施教”的目的,在進行“數據結構”實踐教學時,課題組采用層次化設計思想,把實驗自下而上分為概念基礎層、應用基礎層、應用提高層和綜合層四個層次[4]。在進行試驗教學時,管理、電子專業同學以概念基礎層、應用基礎層實驗為主,適當增加綜合層設計題目,以提高學生軟件工程的意識。如測井專業學生以應用基礎層試驗為主,以測井工程中的具體問題為背景,強調理論與實踐的結合,使同學們體會到“數據結構”是一門抽象理論與實踐緊密聯系、非常有趣味的課程,從而激發同學們的學習興趣;勘探專業學生實踐教學圍繞理論課的綜合層設計任務展開,各任務之間要耦合緊密,形成循序漸進的梯度,組成一個“任務鏈”。將同學們分為3~4人一組,確定小組成員的角色與任務。在這個過程中教師應該提供必要的與勘探數據處理相關的學習資料、參考方法等,為學生完成任務提供資源支持,使學生透徹理解各種數據對象的特點,學會數據的組織方法和實現方法,選擇合適的數據結構,甚至改造基本的數據結構,并進一步培養學生良好的程序設計能力。
3結語
“數據結構”這門課程在計算機科學與技術中的地位舉足輕重,也是石油相關專業的一門必修課程。教師在教學過程中,應當積極探討,尋找有效的教學方法,充分調動學生的學習積極性,提高學生的學習興趣,才能使學生真正學好“數據結構”。在非計算機專業學時少以及前序課程不足等因素的限制下,完成數據結構課程的教學工作并取得滿意的教學效果,是一個具有挑戰性的課題。本文綜合實際教學經驗在教學方法和實驗方法上提出了一些方法和原則,從我校多年的數據結構教學實踐看,采取了這些措施和方法后,學生明顯感到數據結構好學多了,教學效果得到了顯著提高。
參考文獻:
[1] 張銘,許卓群,楊冬青,等. 數據結構課程的知識體系和教學實踐[J]. 計算機教育,2004(2):89-91.
[2] 蔡敏,鄭尚志,梁寶華.“數據結構”課程教學改革之我見[J]. 計算機教育,2009(4):50-51.
[3] 劉紅梅. 啟發式教學法在數據結構教學中的應用[J]. 電腦知識與技術,2009(3):661-662.
[4] 張玉華,周克蘭.“數據結構”分層次實驗教學的探索與實踐[J]. 計算機教育,2009(3):108-110.
Research on Teaching Reform of Data Structure According to Specialty
LIAN Yuanfeng, WANG Xin, LI Li
(Department of Computer Science and Technology, China University of Petroleum, Beijing 102249, China)
關鍵詞:數據結構;教學方法;任務驅動;實踐教學
中圖分類號:TP311.12-4
數據結構是計算機專業中介于數學、計算機硬件和計算機軟件三者之間的一門綜合性的專業基礎課。數據結構的內容不僅是程序設計進行總結和提高,而且是編譯原理、操作系統、數據庫系統等后續專業課提供基礎,具有承上啟下的重要作用。本文針對數據結構的課程特點和教學過程中存在的問題,探討教學實踐中如何針對產生的問題進行教學改革與實踐,以提高教學質量和學生學習效果。
1 數據結構教學中存在的問題與現狀
1.1 缺乏對數據結構認識。正確深刻地理解數據結構的涵義、作用以及數據結構課程內容體系是學習好數據結構的前提和基礎。但是,一般情況學生只是大概了解了數據結構的概念,在缺乏正確認識和深刻的理解的情況下,就開始直接學習課程內容了,認為具體的內容才是最重要的。對于為什么需要數據結構,課程中包括哪些內容,從哪些角度和方面對數據結構進行講解,原因是什么等等,都沒有認真研究和體會,導致數據結構的學習效果和教學效果都不甚理想。如果這些問題都理解了,就從整體上認識了數據結構,那么學生學習,教師教授都會有的放矢。
1.2 C語言知識儲備與數據結構的要求相脫節。數據結構涉及指針、結構體、類型定義、函數調用等相關知識,所以要求學生對這些內容的掌握程度比較高高。但是在C語言教學中,一方面,這些內容都是在課程的后半部分且學習起來難度較大,學生學習有畏難情緒,往往對這些內容掌握不牢;另一方面,教師在授課過程中,對不同專業區別度不大,很少特別為后續課程的需要專門對相關知識做重點講授,這樣就影響后續課程的學習。最終導致學生掌握的C語言知識不能滿足學習數據結構課程的要求。
1.3 缺乏獨立分析解決問題的能力。在課堂講課過程中,一般以教師講授課程內容為主導,在講解課程內容時,學生貌似都學會了,和老師的互動也非常積極,對老師提出的啟發式問題都能正確回答,認為課堂上老師所講的實例也都很簡單。但是,若在沒有老師的引領的情況下,讓學生單獨分析、解決一個例題,多數學生就很難掌握方向,不知從哪做起,缺乏獨立分析問題、解決問題的能力。
1.4 動手編程能力不強。相對于理論知識的學習,學生在上機實踐中遇到的問題更大。學生的程序設計基礎薄弱,缺乏足夠的系統訓練,對調試程序的方法不夠熟練,程序結構設置不合理,代碼編寫可讀性差。即使一些學生看懂了教材上的算法,將其轉換成能運行的C語言程序,也存在一定的難度。這些都對學生的學習效果都有較大的影響,甚至會削減學習的積極性,進而產生畏難和厭學情緒,產生惡性循環,有些學生干脆不學了。數據結構中教學中出現的這些問題,嚴重影響了數據結構課程的教與學,探討數據結構課程教學方法,勢在必行。
2 教學探討與實施
2.1 正確認識“數據結構”。認識數據結構課程不僅僅讓學生了解其在專業中的地位和重要性,更要理解數據結構課程本身的涵義和作用。所以在課程開始的時候開課之初,對課程緒論部分的講解不應吝嗇時間,要把這部門內容講清楚講透徹。數據結構是一門研究非數值計算機的程序設計問題中計算機的操作對象以及他們之間關系的操作等的學科。從這個定義中,我們從中抽取對象、關系、操作等關鍵詞,再以設計實現一個家族家譜這樣一個比較形象的例子進行講解,進而引出如何存儲表示數據對象及關系和能對這個家族的族譜做哪些操作,這樣就引入了邏輯結構和物理結構的知識以及對數據結構建立相應操作的問題。這樣學生就基本能建立數據對象、數據關系、基本操作三元組的概念,并能深刻理解邏輯結構與物理結構的概念和關系。從總體上認識、把握、建立數據結構的整體概念是學習好數據結構的基礎。
2.2 針對數據結構課程需要制定C語言課程教學大綱。因為不同專業學習C語言的要求不同,所以根據教學計劃制定科學合理的數據結構前導課程的教學大綱、考試大綱能有效解決前導課程儲備知識不足的情況。根據教學計劃安排有數據結構課程的專業,其C語言課程與其他專業的課程不同,是單獨列出的。其教學大綱、考試大綱等教學文件由講授C語言和數據結構的老師根據專業特點及后續課程的需要共同研究制定,并按學校的規定定期修訂。教學中只要按照制定好的教學大綱等相關文件規定執行,就能滿足數據結構課程的要求。這樣就從源頭上解決了C語言儲備知識不足的問題,避免了以往數據結構課程教師需要與C語言課程教師溝通重點講解哪些內容,但因只是個人行為而沒有學校相關文件規定的限制,所以不能達到較好的效果。通過制定專門的教學大綱,也無需要求數據結構與C語言課程采用“一師制”,避免了人員變動等其他因素帶來的不確定性影響。
2.3 構建整體教學內容體系。數據結構課程內容抽象涉及很多概念和技術,學生在學習的課程過程中總是感到知識沒有連貫性與整體性,難以對所學內容融會貫通,對課程的知識缺少一個整體的把握。所以建立整體的知識框架體系對數據結構的教學非常重要。數據結構課程的內容主要圍繞數據的邏輯結構、數據在計算機中存儲的物理結構以及對數據操作算法的實現及評價展開。數據的邏輯結構根據數據對象之間關系的不同特性,分為線性結構(一對一)、樹形結構(一對多)、圖結構(多對多);數據的物理存儲結構按照數據對象之間關系的表示方法分為順序存儲結構和非順序存儲結構。在教學中引入抽象數據類型(ADT)觀點介紹數據結構技術,采用算法時空分析來判斷算法的好壞。在講授每一個數據結構時,以抽象數據類型為主線,按照抽象數據類型的定義—抽象數據類型的設計—抽象數據類型的實現三個層次展開來討論,滲透并應用模塊化的思想,在此基礎上介紹數據結構的具體應用。在教學過程中教師會反復強調課程的篇章結構及其關系,數據結構課程的章、節、目,是課程的“骨架”,反應了課程內容的邏輯關系,以此加強學生對課程的內容體系的理解和掌握。
2.4 課堂上適當進行編程示范教學。教學過程中,我們發現,學生能聽懂老師所講授解題的算法思路,但就是不知道如何用編程語言或算法表達出來。為解決這一問題,在教學中會在課堂上對有代表性的算法進行現場編程演示。課堂上教師先帶著學生先把算法總體思想寫出來,接下來選擇合適的物理存儲結構利用C語言進行編程調試運行。這種方法可以讓學生掌握將解決問題的思路轉變成代碼的全過程,對學生編寫和調試程序起到很好的示范作用。在編程過程中,教師會邊寫代碼邊講解,引導學生積極獻計獻策一起來解決問題。由于現場編程比較耗費課時,對于比較長的程序,一般教師會在課前完成,留下解決問題的關鍵步驟在課堂與學生一起編程實現。通過這個過程學生能深刻理解緒論中算法的設計只取決于將要解決問題的數據對象之間的邏輯結構,而算法的實現則依賴于數據對象及其關系的存儲結構。同時學生也能認識到用類C語言表示的算法與用C語言編寫的程序有哪些不同。有了現場的變成演示,在上機實踐中,學生直接將教材上的算法照抄到計算機內運行的情況大大減少,理解了如何將抽象的數據結構理論應用到實際解決問題當中去。
2.5 任務驅動教學方法的應用。所謂“任務驅動”就是在學習信息技術的過程中,學生在教師的幫助下,緊緊圍繞一個共同的任務活動中心,在強烈的問題動機的驅動下,通過對學習資源的積極主動應用,進行自主探索和互動協作的學習,并在完成既定任務的同時,引導學生產生一種學習實踐活動。“任務驅動”是一種建立在建構主義教學理論基礎上的教學法。它要求任務的目標性和教學情境的創建。使學生帶著真實的任務在探索中學習。在這個過程中,學生還會不斷地獲得成就感,可以更大地激發他們的求知欲望,逐步形成一個感知心智活動的良性循環,從而培養出獨立探索、勇于開拓進取的自學能力。在教學中,我們應用了任務驅動的教學方法并加以改進,達到了較好的教學效果。我們的做法是根據不同的場景“任務”不僅僅是學生的,也是老師的,或者是由老師和學生共同完成的。比如在講解第二章線性表的時候,我們就會根據課程內容,設計完成一個共同的任務:一元多項式的相加。為了完成這個任務師生共同找解決的方法,當然任務的完成需要老師的按既定的方向循序漸進地引導,先講解兩個集合合并到一起的算法,再講解將兩個按值非遞減有序排列的線性表如何合并,一元多項式相加的問題稍加改進就解決了。在完成一些比較大任務的過程中,我們會將其分解成若干個小任務讓學生獨立完成。當然,在教學實踐中也不是所有的內容都可以通過任務驅動的方法實現,不能執行一刀切。授課教師應根據課程內容,學生的能力多方面考慮設計合適的任務。任務太大完不成,容易打消學生的積極性,任務太小不能起到應有的作用。
2.6 系統化實踐教學。為了滿足不同層次學生對實驗題目難度,提升學生對實踐教學的興趣;我們針對不同學生的特點,制定分層次實踐教學的方法。按照實驗的難易程度分為驗證性實驗、設計性實驗、綜合性實驗三個層次。驗證性實驗根據數據結構基礎內容設計,難度較低。目的是讓學生掌握基本數據結構的特點和基本概念,同時掌握基本算法及應用。在上機指導中授課教師將驗證性實驗作為主要的考核內容,只有對基本算法的完全掌握,才能靈活應用。設計性實驗是在驗證性實驗的基礎上增加難度和深度。根據特定的數據結構有針性設計題目,必須使用某種數據結構解決。授課教師會和學生一起分析問題,引導學生如何解決,如何設計數據結構,采用什么樣的算法,但是具體的數據結構及算法編程實現需要學生獨立完成。綜合性實驗一般要求綜合使用多種數據結構解決一個難度較大的現實問題;主要訓練學生綜合運用知識的能力、協作能力和創新能力。由于問題難度較大,我們采取將綜合性實驗安排在課程設計階段。
教學實踐證明,這種重點進行驗證性實驗,適當補充設計性實驗,通過課程設計完成綜合性實驗的分層次的實踐教學體系,符合學生的認知規律和特點,在實踐教學中也取得了較好的教學效果。
3 總結
數據結構課程在計算機專業的課程體系中具有非常重要的作用。本文通過對數據結構課程教學中存在的問題及現狀進行深刻剖析,結合教學經驗有針對性地提出了相應的解決方法,從問題的源頭上避免了這些問題的發生。教學實踐表明,通過在教學中采用以上教學方法,提高了數據結構的教學質量,并取得了良好的教學效果。
參考文獻:
[1]嚴蔚敏,吳偉民.數據結構(C語言版)[M].清華大學出版社,1997.
[2]余建國,劉雙紅.基于任務驅動的協同教學模式在程序設計類課程中的研究與實踐[J].科技信息,2009,27:104,83.
[3]陳紅琳.《數據結構》課程建設的探討與實踐[J].現代計算機,2012,10:45-47.
論文摘要:在建構式教育理論的指導下,以就業需求為目標,針對數據結構教學中教與學目標不明、學習信心和動力不足、編程基礎薄弱等問題,提出建構式的數據結構教學方法,在實際教學中取得較好的教學效果,這些措施也可作為其他計算機專業課程教學的參考。
近年來,在產業界急需大量軟件開發人員的情況下,普通本科院校計算機專業學生的就業率持續走低。網絡、報紙等媒體對計算機本科教育現狀多有批評,甚至出現了大學不如培訓公司的極端觀點,嚴重影響了學生對專業課程的學習興趣、動力和信心。數據結構是計算機專業的核心基礎課程,上承程序設計語言、離散數學,下啟操作系統、編譯原理等課程,其重要性不言而喻。一方面,數據結構學科具有難度大、抽象層次高、概念繁雜等特點,學生很難掌握,更不要說將抽象理論與就業實踐需求相結合。另一方面,國內主流數據結構教材和相應的傳統教學模式側重于培養學生的計算機學科基礎理論素養,而將如何通過組織數據結構教學活動積極推動就業的問題留給了任課教師[1]。這造成了學生學習數據結構的目標不明、信心和動力不足。筆者面向就業需要明確了數據結構的兩大主要教學目標,并在實際教學過程中實踐建構式教育理論,嘗試解決學生對專業認識不清、學習興趣不足、編程基礎薄弱等問題。一些做法得到了學生的認可和配合,成功地激發了學生的學習主動性、在一定程度上培育了學生的創新精神。
1面向就業需求的數據結構教學目標
教育要服務于社會生產需求。數據結構教學也必須緊扣這一根本目標。本節從滿足就業需要的角度闡明了數據結構教學的兩個主要目標:
1) 培養超越具體程序設計語言技巧的編程技術。
現階段是一個傳統的生產生活方式迅速向電子化、信息化轉變的時期。人們需要開發和維護更多、規模更大的計算機系統來滿足生產和生活的需要[2]。這就決定了具有熟練編程技術的程序員在很長時期內都將受到產業界的青睞。大學對學生編程技術的培養始于程序設計語言的教學,如c語言,java語言等。但是現今編程語言繁多,各種新概念層出不窮,常常出現學生無所適從或者質疑某門語言課程已經過時無用的現象。甚至很多教師也在爭論講授何種編程語言。筆者看來掌握編程技術(而不僅僅是語言),回歸編程的本質問題更加重要,無謂地追趕時髦不可取。作為編程語言課程的后續,數據結構教學的重要目標就是幫助學生理解編程的本質、鍛煉編程技術以及學習提高編程技術的方法。
2) 培養圍繞復用的軟件開發方式。
隨著軟件規模的日益增大,軟件開發模式逐漸從“從無到有”的模式過渡到“從有到有”的模式,即復用現有的豐富的軟件資產,開發新的應用系統。事實上,復用的思想已經被廣泛的用于軟件開發實踐之中,從各種各樣的程序庫、軟件開發包、軟件構件、web服務等各種可復用資產已經簡化了軟件開發的難度、提高了軟件開發的效率也極大地改變了軟件開發的模式。數據結構學科本身就是對軟件復用思想的一種實踐,它通過總結大量軟件系統中反復出現的數據結構(如表、樹、圖、集合等),定義和實現處理這些數據結構的基本操作,最終達到能夠在不同項目開發中反復應用的目的。這些基本數據結構和算法已經被實現為可復用的產品隨著程序設計語言,如c++ stl、c# collections, java collections等,并得到了廣泛的使用。因此,數據結構教學的另一個重要目標就是引導學生習慣圍繞復用的軟件開發方式,能夠使用和定制已有的數據結構和算法庫。
其他傳統的數據結構教學目標,如培養學生面向實際問題進行算法設計和分析的能力,培養學生計算機學科的基本理論素養和思維方式等也非常重要。但普通本科院校學生對理論內容的接受能力以及將理論和現實就業需求相聯系的能力相對較弱且教學時間有限[3],筆者認為重點突破本節給出的兩個更具體、更可達的教學目標,并在實現這種具體教學目標的過程中潛移默化地培育學生的計算思維和理論素質,將會取得更佳的效果。
2建構式數據結構教學
教學理論研究以及教學實踐反饋均表明,學生主動學習的效果遠較被動地接受老師灌輸的效果好的多。因此,為實現上述教學目標,在建構式教育理論的指導下,筆者探索并采用了一系列建構式教學措施,激發學生的主動性和興趣,取得了較好效果。
建構主義認為,學習并非學習者對教師所授知識的被動接受,而是學習者以自身已有知識和經驗為基礎的主動建構過程[4]。知識不僅是通過教師傳授而得到,更是學習者在一定的情境中,利用必要的學習資料,通過同化新知識、順化自身知識結構的方式而獲得。建構主義提倡在教師指導下的、以學習者為中心的學習,也就是說,既強調學習者的認知主體作用,又不忽視教師的指導作用,教師是意義建構的幫助者、促進者,而不僅僅是知識的傳授者與灌輸者。學生是信息加工的主體、是意義的主動建構者,而不僅僅是外部刺激的被動接受者和被灌輸的對象。下面從理論教學和實踐教學兩個方面介紹我們采用的一些教學措施。
2.1理論教學措施
課堂教學是數據結構教學活動的主要部分,充分利用課堂教學時間,激發學生學習數據結構的興趣和信心,幫助學生建立學習數據結構的環節非常重要。我們采用了如下措施:
1) 組織小型討論。
好的開始是成功的一半,好的課堂教學須在上課之初就抓住學生的注意力,讓學生帶著輕松、愉快的心情聽課。我的做法是在課堂的前5分鐘,提出一個學生感興趣的話題,組織若干個有3~5位同學參與的小型討論。到一個學期結束時,每位同學都有至少一次的發言機會。討論的主題可以靈活設置,如時事、技術、社會熱點等。有時,課堂中間學生比較疲憊、注意力下降的時候,也可以穿插一點討論,改善課堂環境。大多數學生非常喜歡這種討論活動,積極參與其中,成為課堂的一部分,從被動上課轉變為喜歡上課。
2) 重建理論知識所針對的問題。
國內的經典數據結構教材側重嚴謹的理論,較少討論各種概念、算法出現的背景以及探討的問題是否仍然具有現實價值。而回答這些問題能夠幫助學生重建理論知識所針對的問題原型,重現解決方案的提出、發展乃至最終成熟的整個過程,更有助于培養學生解決實際問題的能力,養成批判性、創新性思考的習慣。眾所周知,關于樹的存儲方法很多,有雙親表示法,孩子表示法和二叉鏈表表示法[5],其中以樹的二叉鏈表表示法使用最廣,但其他存儲方法也有其適合的應用。例如,在利用樹表示各個集合,求集合中的等價類時,雙親表示法更為合適。每一個集合都用樹的雙親表示法存儲時,并設樹的根結點的值為集合名,集合中的每個成員都對應一個結點,這樣很容易找到一個元素所屬的子集(順著雙親指針找樹的根結點)。
3) 組織“我來講”活動。
數據結構涉及很多抽象的概念和算法,初學者很難理解。而教師則對理論內容比較精熟,常常傾向于從理論的角度逐步遞進、展開講解,這就增加了學生的學習難度。教師和學生在教學語言上的鴻溝是影響教學效果的一個重要障礙。教師當然可將抽象的理論概念與生活中更形象的概念進行類比,幫助學生理解,也可以將復雜的算法過程用多媒體動畫模擬出來,直觀地展示給學生,幫助學生掌握。但一方面,根據建構主義理論,教師和學生的知識背景不同,由教師設計概念類比語境和算法模擬動畫實際上仍然是基于教師的知識結構對知識點進行的同化和順化,而不是對學生知識體系的直接建構。另一方面,教師的經驗和智慧有其局限性,未必總能夠找到最適合的類比語境和動畫模擬。為此,筆者采用了充分發揮學生智慧的方法,組織“我來講”活動,要求學生通過設計算法的動畫模擬,創建概念的類比語境等方式進行學習,并隨機選擇學生走上講臺對抽象理論概念和復雜算法進行說明。這樣不但能夠調動學生思考問題,還能幫助那些無法完成自我知識體系建構的同學從學生的視角去理解同一個問題。例如,對于n維數組是元素為n-1維數組構成的線性表這一遞歸的類型定義,可采用符號推理的方式,培養學生的理論素養,而同時可鼓勵學生根據自己的理解將抽象理論具體化,建立幫助理解和記憶的現實語境。
2.2實踐教學措施
數據結構是幫助具有基本編程語言基礎的學生錘煉編程技術的關鍵課程。它揭示了程序設計的基本面,即如何處理相互之間存在一種或多種數據關系的數據元素所構成的集合、如何設計算法并分析算法的優劣。若沒有相應的配套實驗指導學生如何將理論應用于實際問題,只是泛泛而談、紙上談兵,學生容易迷失在數據結構的一連串復雜概念和算法之中,而不知道學習數據結構的意義何在。為實現教學目標,筆者鎖定實驗內容設置和實驗考核等兩個關鍵環節,實踐了如下措施,取得了較好效果。
2.2.1實驗內容設置
實驗內容設置是進行實踐教學的最重要部分。從覆蓋知識點的角度看,實驗內容須面向數據結構教學目標,即實驗內容須能夠鍛煉學生的編程技巧,如算法設計、調試、測試以及調優等能力,還能夠讓學生體會到圍繞復用開展軟件開發的威力以及思路。從覆蓋教育對象的角度來看,實驗內容須面向大多數同學并充分考慮優秀同學,即實驗內容須劃分不同的層次,讓大多數學生能夠很容易入手,并讓有能力、有余力的學生能夠不斷地深入,直至形成綜合型課程設計。
基于以上考慮,并借鑒同行經驗,筆者開展三個層次的實驗教學活動,一是要求所有學生都完成的實驗內容,要求學生采用不同的數據結構實現同一個問題并進行對比分析,例如,分別使用靜態數組和動態分配的連續內存區實現順序表,使用整型、字符型數組或者鏈表實現長整數的乘法,使用帶頭結點或不帶頭結點的循環鏈表模擬約瑟夫環等;二是組織程序設計競賽,讓部分學有余力的同學能夠在算法設計、程序實現和調試、優化等方面得到鍛煉和提高;三是設計綜合型課程設計鍛煉學生解決問題的綜合能力,并通過適當分組,培養學生團隊協作精神和能力,鍛煉學生解決問題的綜合能力的目標,最終達到以點帶面全面提高學生能力的目的。
2.2.2實驗考核手段
考核手段在教學環節中至關重要。考核手段是學生學習和鍛煉自身能力的風向標。為保證每位同學都能積極完成實驗并有所收獲,避免抄襲和敷衍的現象,筆者采取了綜合型的考核手段。其一,提交實驗成果,即程序及其運行結果;其二,記錄實驗過程、分析實驗結果以及總結實驗得失的實驗報告,對實驗報告進行選優講評,培養學生撰寫科學實驗報告的能力;其三,每位同學必須面向教師講解自己編寫的程序,包括主要思路和細節性語法,優秀的同學可走上講臺宣講自己的實驗方案和程序設計技巧。這就基本杜絕了學生相互之間抄襲程序和實驗報告的現象,使得學生真正能夠思考問題,并盡力動手完成實驗。綜合上述三種手段的綜合型考核方法既能夠達到督促大部分同學完成實驗、鍛煉動手能力目的,又能夠達到培養優秀同學的目的。特別地,優秀同學宣講活動能夠使學生觀摩到如何從學生的視角從無到有的解決問題的過程,這能夠培養學生解決實際問題的信心并激發其學習積極性。
3應用中遇到的問題
建構式教學模式在應用和推廣過程中遇到的主要問題來自三個方面。其一,目前學生的課業負擔較重,習慣于被動“填鴨”而不習慣于主動“求索”,這是推動和開展建構式教學模式的主要障礙。其二,建構式教學活動,需要師生的密切交流,但現有師資不足難以滿足實際需求。一個可能的解決方法是綜合多門課程和多個老師,建構整體的知識框架和學習體系,避免課程教學中的重復勞動,提高師資的利用率。另一個可能的解決方法是利用互聯網技術,建立在線教學園地。其三,建構式教學模式仍然處于探索階段,各學科缺乏建構式教學素材。從筆者在實踐教學的體驗來看,應盡量從學生的學習背景和能力成長規律出發而不僅僅是從學科背景出發,為學生建構知識體系設計更平滑的路線。
4結語
筆者提出將“培養超越具體程序設計語言技巧的編程技術”和“培養圍繞復用的軟件開發方式”作為普通本科院校的數據結構教學目標,在建構式教育理論的指導下,設計并實踐了一系列建構式教學措施,分析了應用建構式教學模式所遇到的一些問題。
未來將開展兩個方面的工作。一是通過問卷調查、統計分析等手段定量地分析建構式教學方法的實際效果;二是創造和積累建構式教學素材,如研究數據結構課程設計過程中不同類型學生的知識建構路線,挖掘并推廣其中優秀的知識建構方法。
參考文獻:
[1] 教育部高等學校計算機科學與技術教學指導委員會. 高等學校計算機科學與技術專業發展戰略研究報告暨專業規范(試行)[m]. 北京:高等教育出版社,2006:8-101.
[2] 蔡敏,鄭尚志,梁寶華.“數據結構”課程教學改革之我見[j]. 計算機教育,2009(4):50-51.
[3] 揭安全,李云清,楊慶紅,等. 項目教學模式指導的“數據結構與算法”教學改革[j]. 計算機教育,2008(22):21-23.
摘要:本文提出了以解決實際問題為目的的立體教學模式,探討了計算機應用課程的教學模式,研究了激勵學生提高應用能力的方法,研究了與教學模式相配套的教材編寫模式。
關鍵詞:教學模式;計算機應用;主體化;網絡化
中圖分類號:G642
文獻標識碼:B
為了快速提高學生通過計算機解決實際問題的能力,我們提出以解決實際問題為目的的立體教學模式,教學從要解決的實際問題入手,讓學生知道本課程要解決的問題,然后將這個問題進行分解,最后圍繞解決每個子問題,將要講的理論和實踐知識展開。這樣所講內容由解決實際問題連接到一起,構成一個立體結構,所有子問題解決后,則應用問題也隨之解決。這樣一門課完成后,學生不僅學會理論知識,更重要的是學會如何解決實驗問題。
本課題的研究劃分了以下三個層次:應用課程的教學模式;研究激勵學生提高應用能力的方法;研究與教學模式相配套的教材編寫模式。
1 應用教學模式的探索
這一層次就是探索以“解決實際問題為目標的立體化”教學模式,按照新的計算機應用課程教學模式思想組織教學試驗。這就要求老師在講課開始時對本課程的應用作闡述并布置課程設計題目,鼓勵學生帶著問題學習,通過不斷的探索性學習,逐漸完成課程設計。在期中左右開始規劃,期末交設計程序及文檔。為此,我們專門印制了《實驗報告》、《課程設計》、教學任務書等手冊。每門課要求至少完成五個實驗報告、一份課程設計。要求每位專業教師上課前制定教學任務書并上報系教學委員會審批,教學任務書含學生學習后達到的能力要求、教學進度、實驗報告、課程設計項目、作業次數、參考資料、網站建設計劃等,并作為教學檢查的依據,納入教師期末酬金量化。
2 專業計劃的目標控制體系建設
專業教學計劃以培養應用性人才為目標,制定了目標控制體系的新教學方案,任課教師教學任務、學生的學習目標更加明確化。原來教學計劃的原則是最終控制,結果難以達到目標。
體例:(1) **專業總目標;(2) 就業范圍;(3) 第一學年目標;基本技能;基本語言;基礎知識;(4) 第一學期:達到目標;安排課程;考研主干課;按如此模式編制教學計劃,將學生學習最終能力目標分解到每個學期,通過過程控制來達到總目標,使教學計劃更科學、更有可操作性。
3 延伸課堂教學,積極探索立體化、網絡化的教學模式
啟動系級精品課程建設,并予以獎勵。要求各專業課基本實現課件上網、作業上傳、輔導答疑等功能,并鼓勵老師積極申報精品課程。分兩個階段,第一階段:2006年3月開始以“數據結構”、“C語言”、“網頁制作”、“操作系統”、“計算機電路基礎”五門專業課為前導制定了課程建設研發團隊,并積極申報院級精品課程。第二階段:2007年1月起所有專業課開始系級精品課程網站建設,取得較好的效果。
2005年“Delphi程序設計”被評為院級精品課程。2006年“數據結構”、“計算機電路基礎”被評為院級優質課程。2007年有“數據結構”、“計算機網絡實訓”、“網頁制作技術”、“計算機組裝與維護”、“C語言程序設計”、“計算機組成原理”共六門課積極申報院級精品課程。其中“數據結構”被評為院級精品課程,“網頁制作技術”被評為院級優質課程。
4進行考試方式的改革探索
加強電子試題庫建設,改革應用性課程考試方式。向教務處申請對Flash、Photoshop、網頁設計及五筆字型應用等四門技能型課程由原來的期末筆試改為學生自主式全自動網上測試,并要求計算機科學系所有學生(含已經筆試合格的學生)畢業前必須通過該測試。該申請被教務處批準,2006~2007學年度第一學期對網頁設計及五筆字型兩門課試點,受到學生歡迎,效果較好。針對考試中的問題,投入了更多的精力,考試系統進一步改進,2007~2008學年第一學期有計算機應用等五門課程進行了機考,擴大了考試科目,進一步擴充了題庫,提高了防作弊能力。
5學生學習競賽的組織與發動
為了切實提高學生的動手能力,積極組織學生參加各種競賽,特成立了計算機科學系競賽組,系主任任組長,我任副組長,下設五個競賽小組。2005~2007年,除組織計算機科學系網頁設計大賽、計算機應用技能大賽、五筆字型大賽、Flash設計大賽、圖像處理大賽等,積極參加棗莊學院組織的各類賽事外,共組織學生參加省/國家競賽5次,項目如下:ACM/ICPC程序設計競賽、全國數學建模、齊魯大學生軟件設計大賽、正保教育杯第三屆全國ITAT教育工程職業技能大賽、山東省電子產品設計大賽。在這些競賽中學生均取得較好成績,極大地鼓舞、帶動了學生的學習熱情。如下表所示:
6計算機應用課程教材編寫模式的探索
按照以解決實際問題為目標教學模式,探索了計算機應用課程教材的編寫,提出應用課程教材編寫改革的方向為“立體結構知識層次分布式教材模式”。以解決實際問題為目標的立體化教學設計教材章節,教材第一章提出能力要求,并給出總體實現案例設計,每一章設有能力達標要求并圍繞整本教材的案例組織教學內容,教學方式不再呈現傳統從一個知識點到另一個點的線性結構的教學模式。基于新教改思想,我們正按照此模式編寫計算機網絡實訓、數據結構等教材。
7 結束語
關鍵詞:指針;C語言;實驗;數據結構
中圖分類號:G642 文獻標志碼:A 文章編號:1674-9324(2014)04-0110-03
一、引言
《數據結構》作為實踐性很強的計算機專業的基礎課,教學中必然離不開實踐。針對《數據結構》的課程設計實踐不僅可以幫助學生鞏固和加深對課程內容的理解,更重要的是可以進一步鍛煉程序設計的技能[1]。C語言是數據結構實驗中重要的程序設計語言,指針是C語言中一個非常重要的概念。在C語言中,指針的應用非常靈活,對于程序設計初學者來說比較難掌握,更談不上靈活合理的應用。《數據結構》中(注:文中的討論圍繞嚴蔚敏老師的《數據結構》C語言版教材[2]),為了實現數據的存儲結構,指針在線性表、樹和圖的存儲中都有重要的應用,可以說,數據結構的實驗繞不開指針的應用,如果學生掌握不好指針,是無法進行數據結構實驗學習的。
教學中注意到,學生的主要問題是對指針的本質缺乏清晰的理解,知其然不知其所以然,導致在應用時只會依葫蘆畫瓢,不會靈活應用。針對學生理解和應用中的難點問題,剖析了指針的本質,以此為基礎,討論了指針的使用、指針和數組及指向函數的指針幾個問題,希望能夠加深學生對指針的理解,并在數據結構的實驗中靈活應用。
二、指針
1.變量和數據類型。變量和數據類型是C語言中的基本概念,是否能理解它們的本質,對后續指針概念的理解非常重要。但是,由于它們是最基本的東西,教師和學生都認為很好理解,不是很重視。因此,學生對它們的理解往往流于表面,產生模糊的認識,如:變量是會變化的量;對變量名和變量的關系,變量和數據類型的關系等認識不清。
對變量的理解應該強調變量最本質的意義:內存中的一塊存儲空間,即所謂變量就是一塊存儲空間,如圖1所示。
圍繞對變量本質的理解應該強調幾點:①一塊空間(變量)具有兩個特征,一是這塊空間在內存中的起始地址(計算機內部16進制地址表示不便,本文中用3位10進制數示意),表示這塊空間的開始,二是從起始地址開始的空間大小,這兩個特征一起確定了一個變量;②作為內存的一塊存儲空間,自然可以存儲不同的值,會變化;③變量的聲明是提出分配存儲空間的要求,沒有分配空間,當然不能存值,不能使用;④為了在程序中方便使用變量,變量可以取一個名字,即變量名。
變量都有數據類型,從存儲空間分配的角度看,數據類型的本質是對分配空間大小的約定。要給一個變量分配存儲空間,涉及兩個東西:分在那,分多大。分在那由當前內存情況確定,而分多大則由變量所屬的數據類型確定,如int型就分4個字節大小。
2.指針的概念。指針是C語言中的派生數據類型,如int *p,聲明了一個由整型派生的指針變量p,如圖2所示。學生在為什么要用指針、指針變量和原類型之間是什么關系等問題上往往產生混淆,不能夠清晰理解。
對指針概念的理解應該強調幾點:①指針變量也是變量,聲明了指針變量后同樣需要給該變量分配一塊存儲空間,只是該空間存儲的內容有點特殊,是一個地址。②獲取數據存儲空間的基本方式有兩種,一是在程序的數據說明部分進行聲明,這樣,程序執行時存儲空間已經預先分配,并建立了變量名和存儲空間之間的映射,可稱為靜態分配。二是在程序執行的過程中,通過申請(如malloc函數)獲得存儲空間,可稱為動態分配,這樣的空間無法給予變量名,存取這樣空間的唯一辦法只能通過該空間的地址,即指向該地址的指針來存取。如圖2中圈1所示,malloc函數申請了一塊大小為4個字節的空間,空間起始地址是300,為了在后續程序中使用這塊存儲空間,該地址賦值給指向整型的指針p,p中存儲的內容變為300。③應該強調,作為派生類型,指針變量也是有數據類型的,其數據類型是指針變量所指向的存儲空間大小的約定。如圖2中定義的p是一個指向整型的指針,強調這一點有助于學生對指針應用的理解。例如,表達式中,出現在指針變量前的*稱為指針運算符,如賦值語句*p=21,其意義是給p中地址所指向的存儲空間賦值,圖2中,p中存有地址300,確定了被賦值空間的起始地址,而p的類型-整型,確定了這塊空間的大小,即*p確定了一塊從300開始,長度為4的存儲空間。變量的本質是一塊存儲空間,那么反過來說,一塊確定的存儲空間就是一個變量,*p確定了一塊存儲空間,它等價于變量,給*p賦值等價于給整型變量賦值。
三、指針的應用
1.指針和數組。C語言中,數組名代表數組的起始地址,是一個常數,可以看做一個指針。《數據結構》中,線性表的順序映像存儲結構是通過動態申請的數組實現的,設線性表為a1,a2,…,an(n=20),數據元素類型為整型,其存儲結構的定義如下所示:
#define L_SIZE 20
typedef struct{
int *elem;
int length;?搖?搖?搖 /*已存數據的個數*/
int listsize; ?搖 ?搖 /*數組容量的大小*/
}Sqlist;
上述代碼主要定義了結構體數據類型Sqlist,該結構體類型中包含3個域:elem,length和listsize,其中elem是一個整型的指針變量,用來指向申請存儲空間的起始地址。類型定義后可以聲明該類型的變量,如Sqlist L;線性表的存儲空間(數組)需要申請,如圖3所示。
malloc函數申請了一塊大小為80個字節的存儲空間,該空間的起始地址假設為100,函數返回后,地址100被賦值給整型的指針變量L.elem,即指針變量L.elem中存有地址100。
學生對靜態數組的使用相對熟練些,但往往不習慣動態申請數組的使用,下面以線性表的遍歷為例來說明一下其使用方式。動態申請數組中遍歷的實現有兩種常用方式:一是把指針當做數組名來使用。數組名是地址,可以看做指針,反之,指針同樣能夠看做是數組名。遍歷的代碼可以寫為:
for(i=0;i
這里要注意理解中括號[ ]的意義,中括號本質上是運算符,它的意義是執行操作L.elem+i(這里要關注指針的類型,即不同類型的指針加i,計算結果是不同的),找到存儲ai+1這個整型數據的4個字節空間的起始地址,隨后根據指針的類型(確定大小),存取這4個字節的存儲空間。
二是通過指針來進行遍歷。遍歷的代碼可以寫為:
for(p=L.elem;p
整型指針p首先被賦值L.elem,圖3中是100,這時p指向數組中第0號單元的起始地址,通過指針運算符*p存取從100開始的4個字節空間,即數組中第0號單元。隨后,通過p的自加運算,指針p后移4個字節(p是整型指針),依次對數組中所有元素進行遍歷。從結果上來看,代碼(1)和代碼(2)是完全等價的。
2.鏈表。線性表的非順序映像存儲結構是鏈表實現的。定義鏈表結點(結構體),動態申請結點存儲空間,線性表每個數據元素存儲在一個結點中,通過指針描述數據元數之間的關系,其結點的定義如下所示:
typedef struct LNode{
?搖int data;
?搖struct LNode *next;
} LNode,*LinkList;
上述代碼主要定義了結構體數據類型LNode 和指向結構體的指針類型LinkList,該結構體類型中包含2個域:存儲數據元素的域data和指針域next,next用來指向本結點數據元數在邏輯結構中的后繼,鏈表如圖4所示。
仍以線性表的遍歷為例來說明其使用方式,利用指針p來進行遍歷,代碼可以寫為:
p=head->next;
while (p) {
對數據元素p->data進行處理;?搖?搖?搖(3)
p=p->next;}
p被賦值p=head->next,指向首元結點,隨后通過循環中p=p->next語句,p依次指向后繼結點,直到鏈表結束。這里要注意對->操作符的理解,當指針p指向一個結構體存儲空間時,如果需要存取結構體中的某個域,可以使用“p->域名”的方式,如p->data就是存取該結構體中的data域;另有一種等價的方式“*p.域名”,如*p.data,*p確定一塊結構體空間(結構體變量),用“.”操作符存取結構體變量的某個域。
3.指向函數的指針。函數載人內存時,必定占有一塊存儲空間,可以定義指向函數的指針,通過指針來調用函數,例如:
int (*p)( );?搖?搖?搖/* 定義了一個函數指針,其所指函數的返回值為整型*/
p=fun;?搖?搖?搖?搖?搖?搖?搖/*設int fun(int, int);*/
(*p)(a,b)?圳fun(a,b)
首先定義了一個指向函數的指針p,隨后p被賦值函數名,即讓p指向函數fun,p指向fun后,可以通過指向函數的指針調用函數,其效果和通過函數名調用是等價的。應該注意到,這樣用法毫無價值,能通過函數名調用,何必還要間接用指針調用。因此,指向函數的指針一般用作函數的形式參數,例如:
Status Sub(int e);
Status Add(int e);?搖?搖?搖/*返回值為Status的兩個函數*/
void Preorder(BiTree T,status(*visit)(int e)){ ?搖/*遍歷二叉樹的函數*/
……….
(*visit)(a);?搖?搖/*通過指向函數的指針調用函數*/
………
}
Preorder(T,Sub);
Preorder(T,Add);
假設有數據元素為整型的二叉樹T,Preorder是實現二叉樹的先序遍歷的函數。上述代碼中,首先給出了兩個函數返回值為Status的函數原型,設Sub是對整數進行減處理的函數,Add是進行加處理的函數。那么,Preorder(T,Sub)調用時,函數名Sub作為實參傳遞給形參visit(指向函數的指針),則在遍歷過程中(*visit)(a)所調用的函數是Sub;同理,Preorder(T,Add)調用時,(*visit)(a)所調用的函數是Add。這里應該強調,為什么要這么做?從上例中看,對二叉樹的遍歷過程是一樣的,通過兩次調用中visit所指的函數不同,對二叉樹T中數據元素的處理不同,一次是減,一次是加。指向函數的指針帶來的好處是,如果對數據元素的處理有新的變化,如增加乘的處理,僅需要編寫乘的函數Mul,隨后調用Preorder(T,Mul)就可實現對二叉樹中數據元素的乘處理,不需要改變Preorder函數。這樣的程序結構非常有利于提高程序的可維護性。
四、小結
作為實踐性很強的計算機專業核心課程,《數據結構》課程的實驗環節非常重要,指針的靈活應用是課程實驗中的難點。學生對指針了理解往往流于表面,只會模仿性應用,不能深入理解和靈活應用。文中,我們結合實際的教學經驗,總結了指針中的幾個學生不容易掌握的問題,并分析討論了教學中的要點。通過多年的教學實踐,對學生《數據結構》課程的學習和提高編程能力是有幫助的。
參考文獻:
[1]陳越,何欽銘,馮雁.“數據結構”綜合性課程設計教學探索與實踐[J].計算機教育,2008,(8):54-55.
[2]嚴蔚敏.數據結構(C語言版)[M].北京:清華大學出版社,2009.
1JDK中的數據結構
數據結構是數據元素之間的關系。從概念和實現兩個角度,可將數據結構分為數據的邏輯結構和數據的存儲結構。按照數據元素之間前驅和后繼關系來分,數據的邏輯結構可分為以下4種:集合(Set)、線性表(List)、樹(Tree)和圖(Graph)[2]。數據的存儲結構主要包括數據元素本身的存儲以及數據元素之間關系表示。數據元素之間的關系在計算機中主要有兩種不同的表示方法:順序映像和非順序映像,并由此得到兩種不同的存儲結構:順序存儲結構和鏈式存儲結構。JavaJDK為常用的數據結構定義了一些接口(Interface)和實現(Implementation)。這些接口、實現類以及常用的排序、查找等算法統稱為JavaCollections框架(JavaCollectionsFramework)。Collections框架的設計目的是要滿足如下目標:高性能、一致性、擴展性和輕松編程。Java程序員在具體應用時,不必考慮數據結構和算法實現細節,只需要用這些類創建出來一些對象,然后直接應用即可[3]。Java中把一組對象稱為Collection,也就是說,Collection是對象的容器。Java對Collection中的對象沒有任何前驅、后繼以及重復性的約束,只是約束了對象類型E。Collection接口定義了其上的3類操作:針對單個元素的基本操作、迭代器和Collection對象之間的批量操作。基本操作包括增加、刪除、判斷是否包含某個元素、判斷是否為空、容器中當前元素的個數、清空等。批量操作包括:合并兩個Collection容器、從一個容器中移走一些元素、保留兩個容器中相同的元素、判斷一個容器中的元素是否完全包含在另外一個容器中等。接口Collection<E>的子接口有Set<E>和List<E>。集合(Set)在Collection的基礎之上增加了“不允許重復元素”的約束;而List則在Collection基礎之上增加了“元素之間具有前驅、后繼關系”的約束:除了第一個元素外,所有元素具有唯一的前驅;除了最后一個元素外,所有元素具有唯一后繼。如果僅關心數據元素是否出現,而不關心數據元素之間的次序,則應使用Set<E>。Java為集合接口提供了兩個基本的實現:HashSet<E>和Tree<Set>。HashSet<E>是Set<E>接口的典型實現,大多使用集合的場合就是使用這個實現類。HashSet實現類按哈希算法來存儲集合中的元素,因此具有很好的查找性能。HashSet不能記憶元素之間的順序,包括插入順序。其子類LinkedHashSet<E>也是根據元素hashCode值來決定元素存儲位置,但它同時使用鏈表維護元素的次序,這樣使得能夠記憶插入順序。由于LinkedHashSet需要維護元素的插入順序,所以性能略低于HashSet,但遍歷集合里的全部元素性能較好。實現類TreeSet<E>可以確保集合元素處于排序狀態,TreeSet并不是根據元素的插入順序進行排序,而是根據元素的實際值來進行排序的。TreeSet采用紅黑樹的數據結構對元素進行排序,并要求添加進TreeSet中的對象必須實現CompareTo<E>接口。List<E>接口作為Collection<E>接口的子接口,可以使用Collection接口中的全部方法。但是List接口中定義了元素位置和元素范圍的概念,使得List可以根據元素位置索引(index)來插入、替換、刪除集合元素以及查找指定對象的位置。ArrayList<E>實現類基于數組實現了List接口,其內部封裝了一個動態再分配的數組。每個ArrayList對象都有一個capacity屬性,這個屬性表示它們所封裝的數組的長度,當添加元素超過長度時,capacity會自動增長,其默認值為10。LinkedList<E>內部以鏈表來保存集合中的元素,因此隨機訪問容器時的性能較差,但在插入、刪除元素時性能較好。Queue<E>接口用于定義隊列這種數據結構,隊列是“先進先出”的容器,通常不允許隨機訪問其中的元素。Java中的隊列接口Queue<E>沒有繼承List接口,而是直接繼承了Collection接口。如果使用具有固定容量的隊列,則應使用offer()來加入元素,使用poll()來獲取并移出元素,因為add()和remove()方法在因容量原因失敗時拋出異常。如果只是訪問隊首而不移出該元素,使用element()或者peek()方法。LinkedList<E>類實現了Queue<E>接口,因此我們可以把LinkedList當成Queue來用。PriorityQueue是一個比較標準的隊列實現類,它并不是按加入隊列的順序,而是按隊列元素的大小來記憶隊列元素的順序。因此當調用peek方法或者poll方法來取出隊列中的元素時,并不是取出最先進入隊列的元素,而是取出隊列中最小的元素。Stack<E>實現了List<E>接口,提供了push和pop操作限制線性表中元素的插入和刪除只能在線性表的同一端進行。JDK1.6引入的ArrayDequ<E>實現類被優先推薦作為棧使用。ArrayDeque<E>實現了Deque<E>接口。Deque<E>接口定義了雙端隊列,雙端隊列中的元素可以從兩端彈出,其限定插入和刪除操作在表的兩端進行。JavaJDK中沒有直接提供樹和圖的接口和實現類,但是可以通過研究TreeMap的源代碼學習操作樹的一般編寫模式。綜上,數據結構與Java面向對象程序設計兩門課程內容的銜接見表1。
2面向數據結構銜接的Java課程實施方案
Java面向對象程序設計為1學期的課程。總課時為講授54學時、實驗32學時。其中,與數據結構知識點緊密相關的JavaCollections框架部分為講授6學時、實驗4學時。在講授環節,按照表1列出的順序進行。在實驗環節完成與授課內容相關的驗證性實驗。在課程設計實踐環節,要求學生使用Java設計常見算法,然后閱讀JDK提供的源代碼進行對照。具體方案如圖1所示。比如,在java.util.Collections類中提供了數據結構中學生已經學過的常見算法,如二分查找、計算元素頻數、查找最大/最小元素、反轉線性表、按照指定距離旋轉線性表、隨機排列線性表、交換指定位置上的兩個元素以及排序等。注意,在Java6中Collections.sort()使用的是MergeSort;而在Java7中,內部實現換成了TimSort。要求學生按照這些API文檔說明,首先按照數據結構課程中的知識設計自己的算法實現,然后與API源代碼進行比較。由于學生使用C語言版的數據結構教材,所以在面向Collection編程之前,作為過渡,先讓學生面向數組編程。哈希表是一種重要的數據結構,也是實現集合的基本途徑之一。通過研究HashSet的源代碼,可以讓學生理解為什么每個對象都要有hashcode()方法,以及哈希表的編碼特點。由于HashSet的實現是基于HashMap的,所以研究HashSet就要研究HashMap。Map是一種典型的名值對類型,它提供一種Key-Value對應保存的數據結構。客戶程序通過Key值來訪問對應的Value,這個接口并沒有繼承Collection這接口;而其他的類或者接口,不管是List、Set、Stack等都繼承或實現了Collection。TreeMap和HashMap算是Java集合類里面比較有難度的數據結構。HashMap元素存取的時間復雜度一般是O(1),而TreeMap內部對元素的操作復雜度為O(logn)。TreeMap記憶了順序,TreeSet內部的實現使用了TreeMap。
3結語
數據結構與程序類課程的關系問題愈來愈引起關注[4-6],我們提出面向數據結構知識體系的Java課程教學與數據結構課程的銜接方案。這個教學方案已經在河北師范大學本科計算機專業實施三屆,取得了較好的效果,學生對算法的理解加深了,解決問題的自信心增強了,也建立了工程意識。
作者:董東 單位:河北師范大學 數學與信息科學學院