余 艷,劉燕麗,李琳娜
(武漢科技大學 理學院,湖北 武漢 430065)
數據結構是信息類相關專業本科生必修的專業基礎課,該課程探討了各種經典數據結構的邏輯特性、在計算機中的存儲表示方法以及相關算法的實現,為后續課程提供了理論基礎和技術支持。學生對該課程的掌握程度直接影響著其后續課程的學習效果及未來從事軟件開發的工作能力。數據結構是理論與實踐并重的課程。實踐教學是課堂理論教學的有效延伸,有助于學生進一步理解和鞏固課堂所學概念和方法,同時也是學生進行復雜程序設計和培養良好程序設計習慣的訓練過程[1-2]。本文歸納了在實踐教學環節中常遇到的問題,針對這些問題,從實踐教學內容設置入手探討了提升實踐教學質量的方法。
(1)C語言基礎薄弱。我院信息與計算科學系數據結構課程開設在第3學期,在學習該課之前,學生只有1學期C語言程序設計的學習經驗,編程經驗還很不足。根據多年的教學經驗來看,學生在數據結構剛開課時上機實踐疑點較多的問題集中在:預定義常量和預定義類型的作用與用法、函數返回執行狀態的作用與用法、函數定義和調用的方法、使用類型定義(typedef)描述存儲結構的方法、指針及動態內存分配與釋放的原理與方法。這些知識的教學通常安排在C語言課程的最后階段,而這些知識的重要性容易被學生忽視,不少學生在C語言課程中只知教條地去遵守其語法規則應付考試,并未真正搞懂這些知識的使用場合與內在原理,致使其在后續課程數據結構的學習中對新知識的理解消化與實踐應用受到阻礙。
(2)從類C語言描述的算法到C語言程序的轉化感到吃力。目前數據結構授課廣泛采用的是嚴蔚敏主編的《數據結構》教材,該教材使用類C語言描述算法,并借用了C++中引用調用的參數傳遞方式。學生在做實驗時,需要將書中算法轉化為C語言程序,但時常對引用調用的參數傳遞方式理解不夠清楚,導致將相關算法向C程序轉化感到困難和棘手。
(3)大問題無從下手,不懂組織程序、復用代碼。學生在前導課程C語言程序的學習中,側重基本語法和細節的學習,所涉及的程序規模小、算法簡單,更有學生僅以通過計算機二級為目標,造成學生對大規模程序的模塊化思想理解不到位,對組織程序文件、復用代碼的實踐方法也不熟悉。這使得學生在數據結構實踐中解決編程問題時,仍習慣性地設法在一個主函數中解決所有問題,或者籠統地將所有自定義函數和主函數放在一個文件中,代碼復用時則只知道采用復制粘貼的方法。
(4)依賴性強,信心不足,程序編寫和調試方法不當。不少學生在上機實驗時缺乏獨立解決問題的勇氣,遇到任何問題都急于向教師求助。有些學生因為程序編譯報錯尋求教師幫助,而這些問題學生完全可以結合編譯環境給出的錯誤提示給予判斷解決;有些學生一味追求程序結果,無論程序規模大小急于敲完程序所有代碼再調試,當運行程序時發現錯誤成百上千,結果被嚇得手足無措,不知如何是好;有些學生程序編譯通過但程序結果輸出不對,便理直氣壯地認為自己無法找到錯誤所在,理所當然應把問題推給教師。
(5)興趣不足。隨著電子技術的迅猛發展,計算機已進入人們的日常生活,不再高不可攀,學生從小就開始接觸計算機,對計算機豐富多彩的操作界面和五花八門的應用功能已經習以為常。面對數據結構復雜的算法、刻板的代碼、黑屏白字的程序結果,學生常覺得枯燥無趣,缺乏成就感,致使學習缺乏主動性與創造性。
(6)實踐考評依賴實驗報告。在過去的實踐教學環節,考評成績主要依賴學生提交的實驗報告。部分學生在上機實驗中依靠抄襲他人的實驗報告來應付考評,致使其惰性越來越強,甚至出現上機實驗時無作為或曠課的現象。僅僅依靠實驗報告評定學生實踐成績容易掩蓋其真實的學習情況,對積極投入實踐的學生來講也不公平,體現不出他們的辛勤付出,甚至會挫傷其學習的積極性。
實踐教學內容的合理設置和精心安排有利于學生建立起編程的信心,并體會到征服困難與不斷進步的成就感,使他們在牢固掌握書中所提供的各種算法的基礎上,對各種數據結構的意義產生更深刻的認識,同時也有利于逐步培養學生大規模程序設計的能力,使其程序開發能力上升到一個新的臺階[3]。針對學生在實踐環節出現的上述問題,武漢科技大學信息與計算科學系對實踐教學內容設置進行了深入的探討,最終將實踐教學內容劃分為基礎型實驗、驗證型實驗和設計型實驗,其實驗難度和知識綜合程度呈遞增狀態。其中基礎型實驗安排在授課頭兩周,驗證型和設計型實驗按照課程進度進行安排。由于數據結構課程知識點本身就很多,為保證學生在有效的實驗課時內能夠得到全面鍛煉,不遺漏重要知識點,所開實驗都設為必做內容。其他學校與我們的實驗內容設置相似的有[4-8],但只做了教學原則和目的的闡述,并未給出實驗內容的具體設置。
基礎型實驗主要用于幫助學生理解C++中的引用調用,復習鞏固C語言知識和查漏補缺,并集中訓練函數、指針、結構體、自定義類型、動態內存分配與釋放這些學生掌握薄弱,但數據結構學習過程中經常用到的知識點,避免學生在學習數據結構過程中出現看不懂教材算法、寫不出程序代碼的現象?;A型實驗好比熱身運動,能夠為數據結構的理論和實踐教學做好準備工作,減少學生在課堂學習和后期實驗中的技術障礙,提升學生的編程速度。實踐證明,基礎型實驗的扎實訓練可以解決實踐環節曾經存在的問題1和2。
驗證型實驗主要用于加強學生對各種數據結構實現方法的理解,要求學生參考課本提供的算法,編程實現各種數據結構的演示系統。演示系統的設計要求是:
(1)以指定的存儲結構表示某種數據結構,并實現該數據結構常用的各種基本操作,如初始化、銷毀、插入、刪除等;
(2)在主程序中以人機對話的方式執行各種基本操作,進而驗證其實現方法的正確性。
驗證型實驗在以往的教學中常常被忽視,理由是認為其內容已在課堂講授,學生對于數據結構基本操作實現算法的理解也沒有太大問題,或是認為驗證型實驗枯燥重復、沒有聯系實際應用問題,對學生靈活使用數據結構知識沒有幫助,且會抹殺學生的學習興趣、降低學習的積極性。但學生在驗證型實驗的過程中常常能發現自己在知識或技術上的漏洞,驗證型實驗鍛煉不足的學生直接去做設計型實驗往往會難以下手、困難重重,且驗證型實驗的成功運行能夠給學生帶來滿足感,為其進一步完成更復雜實驗樹立信心。
數據結構應集中精力講解“各種結構本身的構造與實現”,驗證型實驗理應成為數據結構實踐教學的關鍵[9]。因此,我系一直重視驗證型實驗內容的安排,力求使學生通過該實驗加深對教材中各種存儲結構及基本操作的理解、洞曉數據結構實現的技術細節、提升C語言編程的熟練度;驗證型實驗也成為學生大規模程序訓練的立足點,是更復雜實驗有效實現的基礎,其代碼可以在后期實驗中復用,減少學生在后期實驗中的工作量,使學生將精力集中在應用問題更高抽象級別的求解算法上。實踐證明,驗證型實驗的強化訓練可以有效解決實踐環節曾經存在的問題3和4。
驗證型實驗內容安排如表1所示。例如,驗證型實驗1要求學生以順序存儲結構表示線性表,驗證型實驗2要求以鏈式存儲結構表示線性表,使學生在程序編寫的過程中進一步體會到同一種抽象的數據結構在計算機中的多種存儲表示方法,而不同的存儲方法決定了其基本操作實現方法的不同,在具體應用時應結合問題特點選擇合適的存儲結構。又如驗證型實驗3要求學生實現棧演示系統,程序中所實現的棧類型則可以在設計型實驗3中復用;再如驗證型實驗7——二叉樹演示系統,不僅要求學生實現教材上已有的二叉樹創建和遍歷算法,而且要求學生利用遞歸實現教材上沒有的二叉樹高度計算、葉子節點統計等功能,使學生對遞歸算法的使用場合和求解思路加深印象,在實驗過程中真正掌握遞歸這一強有力的工具,為后續章節,尤其是圖中更復雜的遞歸算法的正確理解奠定基礎。

表1 驗證型實驗內容安排
驗證型實驗雖然可以強化學生對各種數據結構本身構造的理解,但難以讓學生體會到數據結構存在的意義。設計型實驗用于訓練學生能夠針對具體應用問題選擇合適的存儲結構并設計合理算法進行求解,恰好可以彌補驗證型實驗的不足。但設計型實驗的內容設置存在一定的難度,既要與實際應用相關聯,又要避免引入太多背景問題,其難度必須在學生可以接受的范圍內。
例如二叉樹和樹是數據結構的一個教學重點,但眾多的教材和參考書卻鮮有二叉樹的典型應用問題或實驗,這也成為學生長久以來困惑的一個問題:到底什么應用中會用到二叉樹。其實三維人體運動播放器就是一個二叉樹的典型應用問題,該程序使用樹結構表示人體骨架結構,讀入光學設備捕捉的人體運動數據,將樹轉化為二叉樹利用遍歷算法計算每一幀中人體各關節的三維位置,并在三維場景的正確位置畫出關節就可以實現人體三維運動的播放。但由于該問題涉及計算機圖形學、Windows程序設計等知識,超出學生當前的知識范圍,所以只能作為例子演示,不適合拿給學生做實驗。盡管數據結構無論是在工業界軟件產品的開發中還是計算機領域的科學研究實驗中都必不可少,但從具體應用實例中截取一個學生可以真正實現的問題還是有難度的。
因此設計型實驗的選題設置一方面可以引入計算機領域內的熱點研究問題,當然這需要授課教師集思廣益,同時要注意在實驗中進行知識背景深入淺出的介紹和問題廣度及難度的控制;另一方面也可以借鑒一些經典問題,例如利用循環鏈表求解約瑟夫環問題[1]、利用棧分析算符優先關系實現算術表達式的求解等。設計型實驗內容安排如表2所示。實踐證明,設計型實驗的設置可以有效解決實踐環節曾經存在的問題4和5。

表2 設計型實驗內容安排

表2 (續)
目前我系數據結構教學理論學時為60,實驗學時為18。由于學時安排的限制,學生很難在實驗課堂內完成所有實驗,選擇性地完成實驗又會造成某些知識點的遺漏。由于學生能力的差異,每個學生完成同一個實驗所需要的時間也不盡相同。因此實踐教學采取課外、課內相結合的方式,鼓勵學生在實驗課外自由靈活地完成實驗,實驗課內則著重問題交流、實驗檢查和督促。其中,基礎型實驗和驗證型實驗以課后作業的形式根據授課進度布置給學生,同時減少紙質作業量,從而加大學生在課外動手實踐的機會。每個設計型實驗則在對應的驗證型實驗完成后開設。設計型實驗開課前由教師將實驗任務書發給學生,同時要求學生在實驗課前做好相關準備工作,包括任務書的閱讀、相關資料的查閱、總體設計、詳細設計和用戶界面設計,再在實驗課上完成編碼和調試的工作,并在課后完善實驗報告。為方便學生上機實踐,系機房在課余時間向學生開放。實驗室開放式管理借鑒文獻[10],用于增加學生上機的自由度。
實際上各高校的考核重心主要偏向理論教學,對實踐教學沒有有效的監管和考核措施,使學生并未從思想上引起對實踐的重視,從而無法有效鍛煉和提高動手能力[11]。因此,合理可行的實踐考評方法值得研究。
目前對實踐的考評包括程序演示、回答問題、程序改進和實驗報告4個環節。程序演示環節由學生向教師演示自己的程序,教師檢查學生程序是否達到預期要求;回答問題環節教師向學生提出程序設計和實現的相關問題,學生口頭回答;程序改進環節教師根據學生的程序運行效果向學生提出改進措施,學生在實驗課上完成對程序的改進。其中回答問題和程序改進2個環節必不可少,便于教師及時發現試圖抄襲他人代碼蒙混過關的學生,這些學生往往對教師所提問題理解不清、對改進程序手足無措。當然這2個環節對教師的要求也比較高,需要教師能夠根據實際情況隨機應變提出合適的問題及程序改進要求,并需要及時記錄學生在各個檢查環節中的表現情況,這在一定程度上也增加了教師的工作量。由于學生人數眾多,為保證能夠及時考評到每一位學生的每一次實驗,實驗指導教師的數量也需要得到保證。
數據結構實踐教學內容改革以來,發現學生對上機實驗更加重視,在實踐過程中隨著經驗的積累不再懼怕編程,曾經的反感和抵觸情緒不復存在,實驗時與教師的交流過程中也能夠提出更加深入的問題,對數據結構課程的學習更加輕松自信。通過對數據結構實踐教學的探索,深刻感受到合理的實踐教學內容設置能夠加深學生對數據結構理論知識的理解,幫助學生建立自信和增強學習興趣,同時有效積累編程技術、增強動手能力和知識應用的能力。
(
)
[1]嚴蔚敏,吳偉民.數據結構:C語言版[M].北京:清華大學出版社,1997.
[2]周海巖,陳宏明,殷路.《數據結構》課程教學的思考[J].教育理論與實踐,2010,30(6):62-63.
[3]余艷,劉燕麗.數據結構教學方法探討[J].計算機教育,2013(9):56-58.
[4]徐種,王立波,江娟.提高數據結構課程設計教學質量的探討與實踐[J].計算機教育,2011(9):71-74.
[5]李月軍,李娟,李英玉.融入ACM/ICPC競賽內容的數據結構教學改革與實踐探討[J].內蒙古師范大學學報,2012,25(3):137-140.
[6]李曉鴻,駱嘉偉,季潔.“數據結構與算法分析”研究型實踐教學的探索[J].實驗室研究與探索,2012,31(1):121-125.
[7]盧冰.高校計算機專業“數據結構”課程教學改革的探索與實踐[J].成人教育,2011(9):110-111.
[8]陳寶平.《數據結構》課程教學改革的思考與探討[J].現代計算機,2011(2):57-59.
[9]鄒恒明.分而治之為上策:數據結構課程的反思與變革[J].中國大學教學,2011(6):53-56.
[10]陶影,張斌.數據結構實驗教學應重視算法設計與分析能力的培養[J].實驗室研究與探索,2008,27(12):119-122.
[11]李登,陳志剛.基于智豬博弈的數據結構課程理論與實踐教學研究[J].湖南師范大學教育科學學報,2012,11(4):96-98.