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