呂加國
摘要:針對“數據結構”教學中存在的諸多問題,本文在對主流教學模式進行分析的基礎上,提出一種綜合性教學模式,并依據該教學模式的思想和原則,提出了相應的實施措施。教學實踐表明,該模式對于培養學生的邏輯思維和數據抽象能力,尤其是算法的分析和設計能力有著較好的教學效果。
關鍵詞:數據結構;教學模式;算法分析與設計
中圖分類號:G642文獻標識碼:B文章編號:1672-5913(2009)04-0082-04
引言
“數據結構”是計算機專業的一門專業基礎課。該課程的重點是講解數據的各種邏輯結構、物理結構及其之上各種操作的算法實現。該課程不僅要培養學生在軟件設計方面嚴密的邏輯思維和數據抽象能力,更要培養學生在軟件設計領域科學的思維方式。因此成為計算機專業研究生入學考試和軟件設計師認證等考試的首選課程。
“數據結構”涉及的知識點眾多,而且其邏輯性和抽象性都很強,再加上課時有限,學生普遍感到難學。很多同學反映,理解基本概念不難,基本操作的實現也都聽得懂,可是一到解決具體問題時就覺到困難重重。對于有一定難度的算法設計題,更是感到無從下手。因此,如何學好、怎樣教好“數據結構”成為廣大師生普遍關注的問題。
造成這一現象的原因是多方面的,現在總結如下:
(1)學生難以對所學內容融會貫通,對課程的知識缺少一個整體的把握。
(2)學生由于C語言基礎不扎實,對結構、指針、參數傳遞等掌握不好,在做作業或實驗時如果題目要求與教材內容相差較大,無法入手,導致信心受到打擊、畏難情緒增加。此后,為應付作業,出現抄襲別人作業,或直接上網搜索現成程序的情況。
(3)雖然教師自己對教材內容很熟悉,能夠將各知識點講得很透徹,但往往考慮不到學生的實際學習狀況和接受能力,出現學生越學越難,理論與實踐越脫節,越學越不想學的情況。另外,由于采用傳統的“傳授式”教學方法,在授課過程中往往是就概念而概念、就結構而結構進行講解,自己感覺講解很透徹,但沒有將針對具體情況分析問題、解決問題的一般思路和方法教給學生。
因此,我們在“數據結構”的教學中應該改變傳統的教學模式,提倡以學生為主體的新型教學理念,讓學生在學習過程中不僅能獲得知識,更應該學會學習知識的方法,讓學生自己獨立思考和探究學習,建構、發展和完善自己的知識體系,實現從知識到能力和方法的轉化。
1“數據結構”中主流教學模式分析
教學模式是教學基礎理論的具體化,也是教學具體經驗的總結和概括。目前,國內外較有影響的現代教學模式主要有:掌握學習模式、發現學習模式、程序教學模式、范例教學模式和最優化教學模式。國內,人們在“數據結構”課程教學過程中,或多或少吸取了上述教學模式的基本思想,并逐步形成了幾種較有代表性的教學模式和方法。主要有:基于可視化的“數據結構”教學模式、注重源程序的“數據結構”教學模式和“數據結構”案例教學模式等。這些模式各有側重,對于提高教學質量和教學效果都能起到一定的積極作用。但是我們也應該看到上述模式都在不同程度上存在一定的局限性。如注重源程序的教學模式,可能會帶來課堂教學中冗長的程序而沖淡了對關鍵結構和算法的理解,基于案例教學模式有可能淡化對基本結構和概念的介紹等。本人根據多年從事“數據結構”教學實踐,借鑒已有教學模式的優點,提出一種綜合性教學模式。
2綜合性教學模式的基本思想和原則
“數據結構”課程的特點是邏輯性強,概念多且比較抽象。另外,算法的設計和分析是數據結構的靈魂,算法的好壞直接關系到軟件的性能,因而該課程實踐性也很強,學生難以掌握。開設“數據結構”課程的目的之一是要提高學生的軟件開發與設計能力,但傳統的教學思想與主流的軟件設計思想脫節,而且傳統的教學方法在有限的課時內很難讓學生吃透抽象的概念和算法,更不要說將其運用到程序設計實踐中了。因此,需要充分利用先進的教學手段、網絡資源、開放式的教學與訓練,形成全方位、立體化的教學模式,突破空間、時間的限制,達到提高教學質量,開發學生潛能的目的。
2.1綜合性教學模式的基本思想
在理論教學和實驗教學中吸取“源程序教學模式”和“案例教學模式”的思想。另外,對傳統教學中的理論教學、實驗教學借助網絡平臺進行拓展,形成教師一學生互動、學生—學生討論的立體教學模式。
2.2綜合性教學模式的基本原則
綜合性教學模式應遵循如下原則:①必須以課堂教學為主,課外網上討論輔導為輔的原則;②驗證性實驗與綜合性課程設計相結合的原則;③課件演示適度的原則;④理論考核與程序設計能力考核并重的原則。
3綜合性教學模式的實施
3.1夯實基礎,查缺補漏
學生在學習“數據結構”時,如果其前導課(如C語言)掌握不好,學習起來將非常困難。在程序設計方面,學生只熟悉一些基本的常用語句如分支、循環等,一旦遇到指針、結構體就糊涂了。此外,由于所選“數據結構”教材采用類C語言實現算法,它忽略了C語言的細節部分。學生剛開始接觸程序設計語言,對計算機語言的許多約定理解得不是很透徹,雖然有算法思路,但編寫程序卻無從下手,不能熟練地用C語言描述出來。
針對以上問題,我們采取如下方式解決:①在教學中,我們系帶“C語言程序設計”和“數據結構”的老師在一個教研組,在章節備課時采取集各形式。這樣對于“C語言程序設計”的教學情況非常了解,在“數據結構”的教學中可以采取相應的“查缺補漏”措施。②在學期伊始,給學生預先布置先修課程“C語言”的復習任務,并在以后上課、上機時作為對照,這將有助于本課程的消化吸收。③開課之初,在“C語言”中未作重點介紹而在“數據結構”中反復使用的程序代碼重點講解,如函數和函數參數、形參中值參和引用參數、指針的使用。通過對C語言的復習,可逐步提高學生閱讀與理解算法的能力,使學生初步建立起較好的程序設計思想。
3.2把握知識體系結構,融會貫通
在“數據結構”教學中,應該從課程要求的大局出發,為學生搭建課程的整體框架。采用縱橫對比的方法,由淺入深把握課程的教學要求。筆者認為不論是縱觀“數據結構”教材,還是細化“數據結構”的第一章節,都可看出邏輯結構、存儲結構和算法三條主線貫穿始終。在上第一節課時,筆者往往是在講清數據結構的概念之前,先談一下數據結構的研究對象,然后讓學生打開教材的目錄,這樣學生就會非常容易將每一章節的內容歸納在這三部分中,讓學生充分感受“數據結構”課程結構的完整性。并且在以后各章節的學習中,將這三條主線作為每一章節的教學框架,然后對每一部分詳細展開。這樣學生在復習時就能非常容易把握這門課的知識體系,使各個知識點了然
于胸。
3.3變更理論課教學模式,激發學生的求知欲和能動性
傳統的教學方法是先提出概念,然后解釋并舉例說明。這種教學方式學生只是被動地接受教師講授的知識,這種方法不僅不能提高學生的分析觀察能力,也易使學生缺乏對理論學習的興趣。
3.3.1以具體問題作引導,激發學生的求知欲
在理論教學中,應按照學生的認知規律,遵循先簡單后復雜,先具體然后抽象的原則,以具體的問題,通過觀察、分析、理解、總結進行教學,讓學生自己在直觀上先觀察、分析具體問題,領悟所涉及的相關概念,然后再歸納總結。比如,在學習線性表時,可以先給出一組數據,如23,56,12,78,9,100。然后引導學生發分析數據間的邏輯關系。比如,誰是第1個數,誰是最后1個數,某個數的前邊的數是誰,這樣,通過簡單引導,讓學生通過觀察,就可以歸納出線性結構的特性。然后引導學生思考對這一組數據可以進行哪些操作?然后再思考一下這些操作在計算機中如何實現?這就引導學生思考這一邏輯結構在計算機中的存儲,這就是存儲結構。然后再思考在存儲結構中如何實現這些操作。而這正是數據結構所包含的三部分內容。而這正是以學生為中心的教學法,從提出具體的問題、觀察具體的事實開始,引導學生逐步逼近概念和理論,讓學生意識到這是他們自己經過觀察、分析而理解了概念,激發學習的主動性和創新精神,形成對知識的科學態度和對問題進行分析的興趣。
3.3.2以問題為中心,啟發學生的思維,激發學生的學習能動性
在教學中教師要善于提出問題、啟發學生自主地發現問題,分析問題和解決問題。問題是學習的引導者,沒有問題,學習就不會深入。讓學生帶著問題去學習,在解決問題的過程中發現結論、總結規律,這樣學生就更容易掌握所學知識。例如,要求學生分別采用遞歸與非遞歸(遞推)算法編程求Fibonacci數列前50項,并在計算機上實現,最后比較兩種算法的差異。通過編程調試比較發現:兩個程序的長度差不多,遞歸程序容易理解,比較直觀;而遞推程序難于理解,甚至初學編程的人很容易搞錯。然而遞歸程序則要比非遞歸慢。通過仔細研究、定量分析發現,遞歸程序需要使用堆棧,遞歸調用時的壓棧與彈棧需要時間/空間開銷,當這種遞歸調用次數較多時開銷變得很可觀。這種以問題為中心的互動式教學,改變了傳統教學中以教師為主宰,學生被動接受知識的狀況,教與學互相結合、互相滲透,教學工作就成為教師與學生共同參與的過程,使學生能對知識掌握得更加透徹,從被動學習轉化為主動學習,培養分析問題和解決問題的能力。
3.4綜合運用各種教學手段,提高教學效果
3.4.1授課語言形象化,激發學生的興趣
數據結構所涉及的邏輯結構、存儲結構和以類c語言描述的算法非常抽象,按傳統方式進行授課學生不易理解和接受。在教學中,我們在對所授內容吃透后,在授課過程中多用一些白話代替枯燥的專業術語,同時,在講解重點難點時經常穿插一些與所講內容有關的幽默風趣的故事,實踐證明,不但有益于學生掌握知識,而且激發了學生學習該課程的濃厚興趣。
3.4.2理論教學適度“數學化”,培養學生分析問題和解決問題的能力
“數據結構”中的某些算法和公式的教學中,一定要注意揭示算法和公式的來龍去脈。在公式教學過程中應做到適度“數學化”,即應重視營造問題的情境,重視算法或公式的推導過程,而不應將結果直接展現出來。算法或公式的推導過程往往是邏輯思維的構建過程,通過算法推導,一方面鞏固了基本概念,另一方面也是向學生示范分析推理和轉化知識的過程。通過這樣的教學,學生能夠在潛移默化中構建一個良好的知識結構,形成良好的科學素養,提高了學生獨立分析問題和解決問題的能力,為以后的工作打好基礎。
3.4.3適度使用多媒體教學
對于算法,盡量用動畫進行演示,這同樣有助于學生對問題的理解,加深學生的印象。然而,對于多媒體等先進的教學手段使用也要適度。多媒體技術在使教學擁有了生動的畫面、動聽的音樂等強大的教學功能的同時,也由于存在一些不足,如畫面富于變化而可能導致教學內容不清晰,重點不突出。同時學生也幾乎不可能記筆記,不利于課后的復習。在教學中我們采取一些措施來彌補多媒體教學帶來的不足:
(1)將備課筆記經過整理后作為課堂講授的文字材料及時下發給學生使學生能擺脫上課時狂抄筆記而無法認真聽講的弊端。
(2)上課前將本堂課所講內容大綱或某些重點內容提要寫在黑板上,將黑板書寫和屏幕投影結合起來,以避免由于計算機畫面富于變化而帶來的講授內容線條不清晰的弊端。使課堂教學質量及同學的滿意率均有了明顯的提高。
3.4.4采用多種手段降低學習難度
自信心是激發學生創新能力的積極情感和重要前提。為培養學生克服困難的自信心,筆者針對各種數據結構設計了不同的框架程序,讓學生在實驗過程中逐步完善,添加新功能,最終形成一個大的系統。例如針對線性表,筆者設計了線性表功能框架文本界面,然后根據教學進度,讓學生在上機實驗時讓學生逐步將一些單獨的小功能,如線性表的創建、插入、刪除、合并等功能添加進去。通過這種不斷添加小功能,最終形成一個大的系統的實驗方法,使學生具有一定的成就感,自信心不斷增強。
3.5強化實驗教學,提高學生的實踐能力
“數據結構”的實踐性很強,實驗是教學過程中的一個重要環節。這對驗證算法的正確性、鞏固所學的理論知識方面起著重要作用。在實驗教學中教師應注意以下幾點:
首先,教師應重視實驗教學并加強實驗輔導。對于教材中只有類C偽碼描述的算法,應補充可操作的實例。
其次,要糾正學生不正確的實驗方法。實驗不是簡單地錄入、調試運行就萬事大吉,而應理清源代碼的數據結構、以函數為模塊來閱讀程序、從主函數來把握程序流程,并結合流程圖掌握算法思想。實踐是個動態過程,需要學生積極動手,在編程中通過調試解決問題,并對發現的問題進行總結歸類,才能真正融會貫通。
再次,設計不同形式、不同難度的實驗題目供學生選做。因材施教,使不同層次的學生,從不同形式的訓練中均有所受益。實驗既要對基本算法進行驗證,又需進行相對復雜的應用設計,針對學生編程能力的差異,實驗主要可采用以下三種形式:
(1)閱讀程序、程序填空,每個實驗題目都給出相應的c程序模板,在模板中填寫關鍵語句或子程序即可上機通過,如給出程序框架要求填寫關鍵算法,給出類似函數要求獨立編寫程序,給出主程序要求編寫子程序,以及給出算法要求編寫程序等。
(2)調試運行例程、改寫程序。每個實驗都給出例程源代碼及算法思路,學生調試運行通過后,再按題目要求改寫程序,如:給出鄰接表存儲的圖的深度優先遍歷例程,要求編寫鄰接表存儲的圖的廣度優先遍歷算法,或鄰接矩陣存儲的圖的深度優先和廣度優先遍歷算法等。
(3)綜合性的課程設計小項目。學生以小組為單位設計一些小型的實用程序,如停車場管理、哈夫曼編碼/譯碼器、通訊錄管理等綜合應用題目。利用項目驅動的方式,既是對課堂實例的擴充,又能提高學生解決實際問題的能力,養成良好的編碼習慣,逐步培養學生軟件工程的思想。但這種訓練不宜安排太多,一般一個學期組織1次—2次,安排在學期中間、或稍后即可。
3.6以精品課程建設為契機,拓展“數據結構”教學的時間和空間
在教學過程中,我們的教學團隊緊緊抓住精品課程建設的契機,花大力氣進行“數據結構”的精品課程建設工作。通過精品課程建設,我們把許多教學材料,如課件、電子教案、實驗大綱、例題、習題等發布到網絡上。另外,由于“數據結構”課程自身的特點和課堂理論教學和實驗教學的局限性,學生很難在課堂上完全理解與掌握,因此,課外的自學和訓練、討論必不可少。為此,我們對精品課程網站進一步完善,開通了專門的論壇,開辟了教師、學生討論區,學習心得、經驗交流區、網上自測室等,并且定期安排任課教師進行網上答疑。為了增強學習的針對性,我們在網上放了許多考研、軟考和一些其他認證考試的與“數據結構”有關的題目。在對精品課程網站進行不斷建設和完善的同時,我們還通過各種方法,引導學生充分利用這一網上教學平臺,使廣大同學確實在網站中受益。
4結束語
傳統教學模式的缺陷和“數據結構”課程自身的特點,給的教學工作帶來很多問題。筆者結合自己多年的教學實踐,在吸取現代教學理論的基礎上,提出一種綜合性的教學模式,并將其應用到教學實踐中。實踐證明,我系的學生在考研、專升本等考試中“數據結構”都取得很好的成績。