陳青青
(莆田學院 信息工程學院,福建 莆田 351100)
數(shù)據(jù)結構與算法課程是計算機學科的專業(yè)基礎必修課程,屬于專業(yè)課程體系中的核心課程,在教學體系中起著舉足輕重的作用。它所討論的知識體系和方法技術,無論對于下一步學習其他相關計算機課程,或是將來從事信息行業(yè)開發(fā)工作,都是重要且必備的基礎之一。
該門課程的教學目標是學會分析研究計算機加工的數(shù)據(jù)結構的特性,以便為應用涉及的數(shù)據(jù)選擇適當?shù)倪壿嫿Y構、存儲結構及其相應的算法,并初步掌握算法的時間分析和空間分析的技術[1]。另一方面,本課程的學習過程也是復雜程序設計的訓練過程,要求學生編寫的程序結構清楚和正確易讀,符合軟件工程的規(guī)范。
該門課程的特點是知識點多,理論性強,內容比較抽象枯燥,掌握起來相對困難。在傳統(tǒng)的教學過程中,存在以下問題。
(1)數(shù)據(jù)結構課程需要學生熟悉不同數(shù)據(jù)結構的特性,從而在分析解決具體的問題時,為所要處理的數(shù)據(jù)選擇合適的邏輯結構、存儲結構;而教師往往按照教材授課,在講解不同數(shù)據(jù)結構時,選用不同的案例進行教學,相互之間沒有關聯(lián)與對比,學生無法理解不同數(shù)據(jù)結構在解決同一問題時的不同點及優(yōu)缺點,對如何根據(jù)實際問題選擇恰當?shù)臄?shù)據(jù)結構了解得并不深刻。
(2)本門課程的實踐教學環(huán)節(jié)對學生的程序設計能力具有較高的要求。在莆田學院,C 語言程序設計的課程在大一下學期開設,而數(shù)據(jù)結構與算法課程在大二下學期開設。經過了一年的時間,大部分學生對高級程序設計語言的相關知識點比較陌生,再加上大一下學期學習時掌握不到位,直接影響了代碼的編寫質量[2]。常見的問題包括變量定義不規(guī)范,指針、結構體和函數(shù)相關應用弱,代碼可讀性差,程序調試能力弱等,同時,傳統(tǒng)教學過程偏重于數(shù)據(jù)結構理論,沒有對代碼編寫進行強調和規(guī)范。
(3)數(shù)據(jù)結構課程實踐部分的考核,目前是以學生提交上來的實驗報告和代碼作為考評依據(jù),但是由于課程的復雜度與難度較大的特點,學生不愿意主動思考,提交上來的實驗報告和代碼往往千篇一律,抄襲現(xiàn)象嚴重,從而影響考評的效果,偏離考評的真正目的。
學生通過設計系統(tǒng)雛形,再利用所學章節(jié)知識分步完善系統(tǒng)的方式掌握各知識點,可以解決目前教學過程中各章節(jié)的案例設計相互之間沒有聯(lián)系的問題。
案例的選擇是教學改革中的核心環(huán)節(jié)之一,通過選擇適當?shù)陌f知識的教學案例,并經過案例分析引出即將學習的新知識,以此驅動數(shù)據(jù)結構課程不同章節(jié)的學習,可以提高學生的學習興趣,幫助學生進一步理解不同數(shù)據(jù)結構的選擇和取用,從而達到教學目的。
計算機學科的學生在應用數(shù)據(jù)結構知識解決實際問題時,經常接觸數(shù)據(jù)列表的建立、查找、插入、刪除等操作,這也是將來在開發(fā)編寫完整的系統(tǒng)代碼時,不可避免將接觸和實現(xiàn)的部分。在線性表這一章節(jié),選用“學生基本信息系統(tǒng)”案例,貼近學生的日常生活,學生也更易理解系統(tǒng)的邏輯條理。通過分步教學,學生使用順序表結構和鏈表結構兩種物理存儲方式進行實現(xiàn),從而進一步掌握兩種方式的區(qū)別。
1)利用順序存儲結構實現(xiàn)。
學生基本信息系統(tǒng)是一個小型的處理學生基本信息的程序,主要用于實現(xiàn)學生信息的錄入、刪除、查找等功能。在講解順序結構前,即以任務驅動的方式[3],將該題目下達于學生,讓學生進行分組討論,討論如何建立合適的數(shù)據(jù)元素類型,如何在此基礎上實現(xiàn)插入、刪除、查找等操作。學生首先利用已經學過的C 語言相關知識進行討論和實踐,之后教師在了解學生討論結果的基礎上,提出數(shù)據(jù)結構中“結點”的概念作為數(shù)據(jù)元素類型的建立,并通過回顧復習學生學過的關于數(shù)組的相關知識,提出“結點”以順序結構存儲的知識點,進一步讓學生討論并動手編寫對各“結點”進行插入、刪除、查找的代碼,并進行調試分析。
2)討論順序存儲結構優(yōu)缺點。
在實現(xiàn)上述系統(tǒng)的基礎上,與學生通過分析討論,對在原有數(shù)據(jù)集合中插入或刪除學生數(shù)據(jù)所需的時間和空間復雜度進行分析,發(fā)現(xiàn)在插入或刪除某條學生數(shù)據(jù)時,需要移動大量其他學生數(shù)據(jù),以達到“線性表”結構的要求,這種方法耗費的時間多,操作也繁瑣。
3)提出以鏈式存儲結構實現(xiàn)。
基于順序存儲結構的缺點,提出鏈式存儲結構的知識點,每個學生數(shù)據(jù)“結點”之間以指針相關聯(lián),特別針對“指針”進行著重強調,讓學生了解對于新“結點”的插入或刪除,僅需改變相關聯(lián)“結點”的指針即可,從而引出基于鏈表的結構建立、查找、插入、刪除等操作偽代碼,并讓學生通過上機實踐的方式實現(xiàn)。
通過以上3 個步驟,學生首先通過回顧復習,利用原有的C 語言知識編寫系統(tǒng)雛形,之后分別以“結點”+順序結構、“結點”+鏈式結構兩種方式加以完善,通過“案例驅動型”實踐模式,即同一案例、同一系統(tǒng)利用不同存儲結構的實現(xiàn)與實踐過程,加深關于順序存儲和鏈式存儲的了解,理解二者的優(yōu)缺點與區(qū)別,從而達到教學目的。
對于其他章節(jié)的實踐案例,實踐內容安排見表1。
表1 各章節(jié)實踐案例設計
經過以上實踐環(huán)節(jié),學生可以利用不同章節(jié)的知識,分步驟對所開發(fā)的系統(tǒng)進行逐步完善,既能掌握課程的相關知識,又能了解如何建立系統(tǒng)并逐步添加新功能,對于后期完成綜合型案例具有較大的幫助。
這個環(huán)節(jié)的教學是在整個數(shù)據(jù)結構的課堂教學結束之后,即課程設計環(huán)節(jié)部分完成[4]。在該環(huán)節(jié)的實踐中,學生可以自行組織4~5 人組成一個團隊,在教師提供的幾個實驗項目中,自行挑選一個項目,對任務進行分解與分配,合作完成。
以圖書管理系統(tǒng)為例,可將系統(tǒng)功能分解為初始數(shù)據(jù)的建立、圖書的插入、圖書的查找、圖書的排序、圖書的編輯與刪除等多個模塊,每個團隊成員選擇其中一個模塊完成,同時進行小組討論,設計統(tǒng)一的數(shù)據(jù)接口,以實現(xiàn)不同模塊的相互調用和組合,最后,小組成員一起對模塊組合后的系統(tǒng)進行調試分析,發(fā)現(xiàn)不足并改進。這不僅能進一步加強學生的分析問題與實踐編程能力,還能鍛煉學生的團隊合作能力。實驗項目選題匯總見表2。
表2 綜合型實驗選題匯總
學生在學習數(shù)據(jù)結構與算法這門課程時,往往只經過一個學期的C 語言學習,編程基礎較薄弱,代碼編寫不規(guī)范,模塊分析與邏輯設計還不嚴謹;而在該門課程的案例實現(xiàn)時,往往需要編寫幾個模塊的函數(shù)代碼,代碼量較大,相比以往僅僅是一兩個函數(shù)相互調用的C 語言學習,復雜度更高,整體與模塊分析比例更大,同時,還要以新“結點”的方式實現(xiàn),學生往往難以上手,并容易產生畏難情緒,學習積極性不高。
基于以上原因,以線性表為例,在學生上機實踐“學生基本信息系統(tǒng)”環(huán)節(jié),采用以下步驟與方法。
1)先以數(shù)組方式實現(xiàn)基本數(shù)據(jù)類型的數(shù)據(jù)操作。
先讓學生以原有的C 語言知識編寫一個小型的、僅有兩三個函數(shù)的程序,實現(xiàn)基本數(shù)據(jù)類型數(shù)組的數(shù)據(jù)輸入、查找、插入、刪除等操作。這一代碼既是“學生基本信息系統(tǒng)”的雛形,又可以讓學生先以1~2 個課時的時間,復習回顧C程序的相關知識點和編寫過程,對編程知識進行查漏補缺。
2)在提出“結點”概念與“順序結構”數(shù)據(jù)操作偽代碼后,讓學生針對第一步驟實現(xiàn)的代碼進行修改。
在提出“順序結構”存儲的相關知識點后,首先讓學生以“結點”替代上一代碼中的基本數(shù)據(jù)類型,并在此基礎上修改上一步驟代碼中有關數(shù)據(jù)操作的部分。采用這一方法的目的,即是讓學生在此步驟中,重點關注數(shù)據(jù)結構的特點以及“結點”數(shù)據(jù)的訪問方式,而將了解數(shù)據(jù)查找、插入、刪除等算法設計的原理流程這一學習過程在上一步驟就完成,從而在這一步驟簡化并突出知識點的學習,分步完成基于順序表結構的“學生基本信息系統(tǒng)”。
3)在提出“鏈式結構”的概念與數(shù)據(jù)操作偽代碼后,讓學生針對第2 步驟實現(xiàn)的代碼進行修改。
在提出“鏈式結構”存儲的相關知識點后,讓學生修改上一步驟的代碼,將“結點”數(shù)據(jù)修改為以“鏈表”存儲,并修改查找、插入、刪除的相關代碼。學生在修改的過程中,可以進一步比較兩種不同存儲結構在進行數(shù)據(jù)操作時的異同點,并通過比較前后兩個版本代碼的時間與空間復雜度,了解如何在不同需求的情況下,選用不同的數(shù)據(jù)存儲結構。
4)在以上3 個步驟中,學生在編寫完各自的代碼后,采用相互之間分析、找錯、糾錯的方式,提高代碼編寫規(guī)范與程序調試能力。
寫完的代碼需要調試,學生在調試代碼方面往往存在問題,較難發(fā)現(xiàn)自己代碼的問題,可以通過同學間的相互改錯糾錯,發(fā)現(xiàn)問題所在,這樣學生不僅學習興趣高漲,還能進一步提高有關代碼編寫、調試的能力。
(1)實踐考評成績=實驗報告與代碼(30%)+答辯(50%)+組內成員互評(20%)。
(2)在答辯環(huán)節(jié),組內每個成員對自己所承擔部分的系統(tǒng)任務進行演示與解說,包括匯報遇到的問題與解決方式等[5]。教師可以對學生進行提問,通過學生的回答了解學生的實際完成過程,并綜合學生的完成與答辯情況進行評分。
(3)在組內成員互評部分,組內成員間通過匿名互評的方式,對其他成員的任務完成情況和團隊合作情況進行評分。
通過以上考評方式的改進,學生就不能再僅僅依靠實驗報告與代碼的簡單復制粘貼通過考評,而是通過真正的團隊合作以及思考與動手實踐,從而提高學習主動性,保障考評的實際意義。
數(shù)據(jù)結構與算法課程所采用的分步式任務驅動型教學改革和考評改革,改變了按教材內容教學、按教材中一個算法接一個算法講解的傳統(tǒng)教學過程,更強調章節(jié)之間的聯(lián)結,從學生C 語言基礎的實際掌握能力出發(fā),從學生的學習效果出發(fā),設計合適的案例,并采用循序漸進的步驟,從代碼雛形出發(fā),根據(jù)實際的數(shù)據(jù)結構知識點進行進一步修改完善,將傳統(tǒng)教學過程中學生本應同時掌握的多個知識點拆解開來,分步教學,更適合學生的學習節(jié)奏;同時,通過新的實踐考評辦法,激發(fā)學生的學習主動性。在莆田學院近年的教學過程中,使用上述方法對數(shù)據(jù)結構與算法課程進行教學改革實踐,結果表明,學生更容易理解教材中各類數(shù)據(jù)操作的偽代碼,對于不同數(shù)據(jù)結構的特點與區(qū)別也理解得更為深刻,學生的學習與程序編寫興趣更高,編寫的代碼更加嚴謹、完整,取得了更好的學習效果。