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