余艷 劉燕麗
摘要:分析影響數據結構課程教學效果諸多因素,提出改善教學效果的方法。
關鍵詞:數據結構;教學方法;課堂教學;實踐教學
數據結構是信息類相關專業本科生必修的專業基礎課,以武漢科技大學為例,信息與計算科學系、計算機科學系、電信系、自動化系和信息管理系等均開設有該課程。數據結構旨在幫助學生用計算機解決非數值計算問題,為所處理的數據選擇正確的邏輯結構、建立高效的存儲結構并實現有效的算法。同時,該課程的學習過程也是學生進行復雜程序設計的訓練過程。該課程既涉及硬件存儲又涉及軟件算法,對學生抽象思維及編程能力要求較高,不少學生在學習過程中感到困難較大,影響了學習信心和學習興趣,致使教學效果難以達到預期目標。筆者從學生的知識基礎、課堂教學和實踐教學各方面分析影響數據結構教學效果的諸多因素,并給出提升教學效果的一系列方法。
1.課前準備掃清障礙
目前廣泛使用的數據結構教材是嚴蔚敏編著的《數據結構》(C語言版),為了更清晰地表達算法主體,教材中所有函數的實現采用的是類c語言,并借用了c++中引用調用的參數傳遞方式。該教材對引用的講解只有一句話:“引用參數以&打頭,除可提供輸入值外,還將返回操作結果。”對于沒有任何C++學習經驗的學生來說,這一句講解對于他們正確理解引用的用法遠遠不夠。對于只有c語言基礎的學生,只知道參數的單向傳值,而且函數返回操作結果靠的是函數的返回值,書中對引用的簡短描述和他們已有的知識是相違背的。然而,引用符號貫穿教材始末,這直接影響到學生對書中所有算法的理解及實現;引用符號在整本教材所有基本操作對應的函數頭中時而出現時而消失,更讓初學數據結構的學生感到困難和迷惑,這成為學生學習數據結構的一大障礙。
對于初學數據結構的學生來講,引用到底是什么?何種情況下需要使用引用?怎么使用引用?C語言編譯環境下引用可以調試通過嗎?這一系列問題都應在講授本課程的初始階段給予詳解,并需要設計相應的上機練習幫助學生熟練掌握引用的用法。學生只有在課程初始階段搞清了引用的含義和用法,在后續章節的學習中才能夠輕松理解各類基本操作。根據筆者的教學經驗,可以采取兩步走的策略引導學生正確認識引用。在講解過程中給出簡單易于理解的例子,并略去引用的內部實現機制,更深入的知識可以在C++課程中學習,具體方法如下。
第一步,幫助學生理解引用的本質是變量的別名,可按以下方法,引用一個整型變量。
inti;//聲明一個整型變量i
int&ri=i;//聲明引用ri,ri成為i的別名
ri=10;//作用等同于i=10
i=5;//作用等同于ri=5
另外,學生第一次見到引用符號時,馬上會想到C語言學習時遇到的取地址符“&”,它們的符號相同,如何進行區分呢?在此需要告訴學生區分引用和取地址符的重要法則:引用只在聲明語句中使用,并總跟在類型名的后面。
第二步,引導學生認識到引用通常用于傳遞參數。把引用作為形參,則成為實參的別名,函數體對形參的操作直接作用于實參。根據教學經驗來看,在討論引用參數時給出幾種不同形式的用于數據交換功能的函數,有著較好的教學效果,便于引導學生體會、總結引用參數的應用場合,從而順暢理解書中的各種算法。可按以下方法舉例:
例1,無法實現數據交換功能:
void swapl(int x,int y){
intt:
t=x:
x=y;
y=t;
}
例2,可以實現數據交換功能,但指針增加了程序的復雜性:
void swap2(int*x,int*y){
int t:
t=*x:
*x=*y;
*y=t;
}
例3,可以實現數據交換功能,且程序可讀性更好:
void swap3(int&x,int&y)f
intt:
t=X:
x=y;
y=t;
}
通過上述例子的講解,不僅可以幫助學生理解引用參數的作用,而且可以使學生認識到使用引用參數的意義。教材中所有使用引用參數的函數都可以轉化為指針傳遞的形式,但使用引用參數可以使算法的可讀性更好。在數據結構教學的初始階段,補充強化學生所欠缺的知識,可以幫助學生掃清學習數據結構的障礙并建立起學習信心。
2.課堂教學注重引導
2.1引導學生參與問題思考
數據結構教材對知識的講解嚴謹簡潔,但是對知識的表達過于生硬,缺少對問題背景、存儲結構及基本操作實現方法設計思想的討論,致使部分學生在數據結構的學習過程中習慣于記憶各種存儲結構的表示方法或算法流程,卻未能理解各種存儲結構、基本操作實現方法構造的內在原因。這些學生往往可以獲得比較高的考試分數,卻沒有真正掌握數據結構的靈魂,更談不上在未來學習工作中靈活運用數據結構知識。因此在數據結構課堂教學中應特別強調對各類問題求解方法的思考,讓他們真正參與到知識理解與消化的過程中,使其學到數據結構的思想精髓,而不是浮于課程內容表面。
例如在講授線索二叉樹這一節內容時,學生往往習慣于去記憶線索二叉樹結點存儲結構的表示方法,同時只關注怎么按題目要求畫出線索二叉樹的邏輯結構或存儲結構,卻忽視設計線索二叉樹這種結構的原因,以及在何種場合需要使用線索二叉樹。在講授該節內容時,應花一定的時間帶領學生思考并參與到線索二叉樹結構設計的問題中來。首先引導學生思考“使用遞歸策略遍歷二叉樹會帶來什么問題”,在討論該問題的同時加強學生對遞歸算法特點的認識:容易實現,但執行效率低。為了提高遍歷二叉樹的效率,會考慮采用非遞歸算法,因此需要引導學生逐步思考以下問題:
“非遞歸算法在遍歷過程中需要知道二叉樹中各結點在遍歷序列中前驅后繼的信息,為達到這個目的我們應該怎么辦?”
“為二叉樹每個結點加上兩個指示前驅后繼的指針域好不好?”
“對于,1個結點的二叉樹有多少空鏈域?”
“我們如何利用這些空鏈域?”
在引導學生思考上述問題的過程中,一步一步引出二叉線索樹的結構設計。按照這樣的思路展開講解,不僅使學生知道什么是線索二叉樹,更讓他們知道為什么要設計這樣一種結構,以及在解決具體問題時,何種情況下會傾向于選擇線索二叉樹來提升系統的時間效率。
為使學生知其然并知其所以然,在數據結構課堂教學環節中,應防止枯燥的單向傳授;設計問題情境引導學生,使其在學習過程中養成思考的習慣,并深刻體會到任何存儲結構、算法并非憑空而來,而是根據解決問題的需要精心設計。
2.2引導學生把握知識架構
有些學生在該課程的學習過程中,容易忽視對知識的貫穿與聯系,在頭腦中難以形成整體的認識,從而更進一步增加學習的難度。在數據結構教學過程中應引導學生把握學習的主動權,各個章節都遵循著抽象數據類型—存儲結構一基本操作的實現一應用數據結構解決具體問題這樣一條線索展開知識的講解,并強化學生對該知識體系的認識,從而降低學習的難度。
2.3激發學生學習興趣
數據結構課程教材的講解偏重各種數據的邏輯結構、存儲結構及操作的實現算法,卻很少給出各種數據結構的應用案例,致使學生無法想象所學知識的真實應用場景,使得學習過程枯燥無聊。因此,需要在教學過程中演示一些學生能夠理解的應用案例。諸如在講解“棧”時,可以給學生演示具有優先級的計算器程序,并和Windows系統自帶的計算機程序進行比較,使學生直觀認識到“棧”在實際開發中的作用;在講解“樹”時,可以給學生演示三維人體運動播放器程序,其中人體骨骼就是用“樹”給予存儲表示,播放器的實現靠的是每一幀對人體樹進行遍歷來計算其各個關節點在圖像中的位置信息,從而使學生直觀認識到“樹”在軟件開發中的作用。這些演示程序,既可以加深學生對數據結構的認識,又可以提升學生的學習興趣和主動性。
3.實踐教學由淺入深
數據結構是一門理論與實踐并重的課程。該課程的教學要求之一是訓練學生進行復雜程序設計的技能,其重要程度不亞于知識傳授。在學習數據結構之前,學生只有一學期C語言程序設計的學習經驗,此時學生的編程經驗還很薄弱,部分學生甚至對結構體類型的定義、函數體的定義和函數調用方法都不熟練。而數據結構教材對各種存儲結構都以結構體類型的定義給予實現,各種存儲結構之上的基本操作都以函數的形式給予實現,書中沒有學生在學習C語言時熟悉的主函數,這使得學生在初學數據結構時感到陌生和無所適從。因此,實踐環節的具體內容需要精心設計,對于各章節的內容應采用進階的方法給予訓練。
對于各章內容的實踐訓練,第一階段要求學生編程實現各種存儲結構的演示系統,通過人機交互式命令,測試驗證所設計的存儲結構及各種基本操作。該訓練一方面可以加深學生對教材中各種存儲結構及基本操作的理解,另一方面可以幫助學生鞏固c語言程序設計的知識。
第二階段引導學生利用演示系統已實現的數據結構解決某個具體應用問題。例如,在“棧”這一章,可以先要求學生根據教材提供的算法設計并實現具有運算優先級的能處理10以下整數的計算器。然后再要求學生為程序增加詞法分析功能,使其可以處理10以上的整數。最后進一步完善程序,使其能夠處理帶小數點的數據。該訓練一方面能夠提升學生實現復雜算法的能力;另一方面,由于程序實現涉及多個問題,因此可以引導學生學會組織大規模程序結構。最后,在程序功能逐步完善的過程中,使學生認識代碼重用及程序的可擴展性在實際開發中的重要性,并能夠基于以上兩點設計出正確的程序結構。
按照上述由淺入深的方法設計配套上機練習進行實踐教學,有利于學生建立起編程的信心,并體會到征服困難與不斷進步的成就感;使他們在牢固掌握書中所提供的各種算法的基礎上,對各種數據結構的意義產生更深刻的認識;另一方面,也有利于逐步培養學生大規模程序設計的能力,使其程序開發能力上升到一個新的臺階。
4.結語
數據結構是一門重要的專業基礎課,學生對該課程的掌握程度直接影響其后續課程的學習效果及未來從事軟件開發工作的能力。筆者提出的在教學各環節有效提升教學效果的方法,僅供同行參考。
參考文獻:
[1]嚴蔚敏,吳偉民,數據結構(C語言版)[M],北京:清華大學出版社,1997.
[2]周海巖,陳宏明,殷路,“數據結構”課程教學的思考[J],教育理論與實踐,2010,30(6):62.
(編輯:郭田珍)