嚴小燕 夏桂林
(巢湖學院計算機與信息工程學院,安徽 巢湖 238000)
《數(shù)據(jù)結構》作為計算機相關專業(yè)的學科基礎課程,具有承上啟下的重要作用。它既是對先修課程(高級語言)的擴充,又為學生學習《操作系統(tǒng)》、《軟件工程》、《編譯原理》、《數(shù)據(jù)庫》、《人工智能》等課程提供必要的知識儲備。通過本課程的學習,使學生系統(tǒng)地掌握基本數(shù)據(jù)結構的特點,數(shù)據(jù)結構與算法的關系,著重培養(yǎng)學生的數(shù)據(jù)組織、數(shù)據(jù)存儲以及如何處理數(shù)據(jù)等的基本理論知識和技能,提高學生設計算法、設計合適的數(shù)據(jù)結構的能力。本課程強調(diào)理論和實踐的結合,突出對學生的動手能力的培養(yǎng),使得學生在面對復雜問題時能夠提出優(yōu)化解決方法。由此,如何能使學生更好的學好本課程,達到良好的教學效果顯得尤為重要。
目前數(shù)據(jù)結構課程教學中主要存在的主要問題有:
數(shù)據(jù)結構課程是抽象性、理論性較強的一門課,教材中,大都從抽象數(shù)據(jù)類型的觀點來論述數(shù)據(jù)結構、描述算法,操作性不強,學生看不到立竿見影的運行結果,不重視實驗課,學習積極性不如語言類課程[1]。大部分學生不清楚為什么要學習數(shù)據(jù)結構,學了以后能用在哪?認為不學照樣可以完成編程。這樣,教學效果不盡人意。
我校數(shù)據(jù)結構教學采用的是C語言版本的教材,這就要求學生有一定的C語言基礎。但一年級第一學期就開始學習C,讓很多還沒來及適應大學學習生活的學生措手不及。特別是函數(shù)、指針、結構體等相對難度較大的知識點,理解不夠透徹,運用有困難,而這三部分恰恰是數(shù)據(jù)結構中應用最廣泛的知識點。C知識的不牢靠,導致上機實驗時,類C的算法無法轉(zhuǎn)換成程序調(diào)試運行,不能及時鞏固所學理論知識,無法通過數(shù)據(jù)結構課程的學習來提高自己的算法設計和程序編寫的能力,影響了學生的學習主動性。
通過課堂的學習,大部分同學都可以理解和掌握算法的思想和描述,但在實驗課上,一旦要求學生自己動手設計算法,編寫程序,他們就會感到力不從心,這一實際問題到底應該使用哪一種邏輯結構組織、采用哪一種存儲結構實現(xiàn),都是學生可能碰到的難題。隨著教學知識的深入,算法轉(zhuǎn)換成程序更加困難,學生便會逐步失去學習本課程的興趣。
在開始講授數(shù)據(jù)結構課程之前,先通過講解一些簡單的具體實例,以達到既能讓學生復習C語言的相關知識,又能引出數(shù)據(jù)結構的一些基本概念的目的。例如:對一張學生成績表的操作?,F(xiàn)在需要處理的數(shù)據(jù)是批量的,連續(xù)的即數(shù)據(jù)結構中的邏輯結構??梢杂脭?shù)組實現(xiàn)嗎?當然可以,但顯然,每一位學生的信息(學號、姓名、各科成績)是不同的數(shù)據(jù)類型組成,使用普通數(shù)組存儲數(shù)據(jù)會導致頻繁讀取內(nèi)存。這時,我們自然想到先使用用戶自定義類型結構體來保存每一位學生的信息,再用數(shù)組保存整張表即數(shù)據(jù)結構中的存儲結構。教學中,可以利用常見的Excel表格幫助學生理解。首先新建一張空表,再輸入數(shù)據(jù)。某一位同學的信息(表格中一行)便是數(shù)據(jù)結構中的數(shù)據(jù)元素,表格中的某一個具體的單元格便是數(shù)據(jù)結構中的數(shù)據(jù)項。訪問、插入或刪除一位同學的信息等操作可以寫成函數(shù)等待調(diào)用。而函數(shù)體中可以使用指針來訪問數(shù)據(jù)。
并且,教師在給學生梳理相關知識的同時,可以對例題進行現(xiàn)場編寫程序,讓學生在一開始直觀了解解決實際問題的全過程,分析問題、算法設計、算法實現(xiàn)等。特別是,算法如何轉(zhuǎn)換成程序,其中預處理、結構體定義、函數(shù)調(diào)用、參數(shù)傳遞、指針等知識點的運用。讓學生從一開始認識類C算法和程序之間的區(qū)別和聯(lián)系,同時要求學生鞏固自己的C語言知識,大部分學生只有看到算法變成程序可以運行出結果才能產(chǎn)生持續(xù)的學習主動性,這樣才能加大他們學習數(shù)據(jù)結構的興趣。
數(shù)據(jù)結構是研究非數(shù)值計算的程序設計問題中計算機的操作對象以及它們之間的關系和操作等的學科[2]。本課程整體圍繞抽象數(shù)據(jù)類型,把數(shù)據(jù)的邏輯結構、存儲結構和相適應的各種運算有機聯(lián)系在一起[3],并針對實際問題設計出相應的算法并分析算法的效率。
非數(shù)值計算問題中的操作對象通常在高級語言中找不到現(xiàn)有的數(shù)據(jù)類型與之匹配,如上例中的學生成績表等。這時,要求我們運用用戶自定義類型來完成操作對象的描述,它包括數(shù)據(jù)對象集合,數(shù)據(jù)關系集合以及數(shù)據(jù)在關系上所允許的操作集合。這便是抽象數(shù)據(jù)類型,它實現(xiàn)了封裝、代碼重用等,類似C++中類的概念。
邏輯結構是只抽象反映數(shù)據(jù)元素的邏輯關系。存儲結構是數(shù)據(jù)的邏輯結構在計算機中存儲映象,即在計算機存儲器中的實現(xiàn),它包括數(shù)據(jù)元素的表示和關系的表示。在講解這兩個概念時,要抓住“在算法設計時只取決于數(shù)據(jù)的邏輯結構,在算法實現(xiàn)的時候只依賴數(shù)據(jù)的存儲結構”這句話,可以用具體實例來加深學生的理解。例如:對一個序列進行排序操作。采用哪種排序方法不依賴于存儲結構,可以選擇學生最為熟悉的起泡排序算法,再分別用順序和鏈式結構加以實現(xiàn)。
培養(yǎng)學生創(chuàng)新精神、提高學生實踐能力,加強實驗課教學的同時,突出課程設計對教學的延伸和補充。
實驗課一直是數(shù)據(jù)結構教學中的軟肋,通過理論課上C語言知識的梳理復習,類C算法向程序的轉(zhuǎn)換演示,基本概念的加強理解,相信會在一定程度上提高學生自己動手編程的積極性,但實驗課輔導要和理論課相輔相成,才能達到更好的教學效果。
首先,在實驗課內(nèi)容安排上,盡量選擇和學生日常生活聯(lián)系較大的題目,讓學生產(chǎn)生共鳴。例如:隊列一節(jié)的實驗題目,設置成“模擬病人到醫(yī)院排隊看病”[4]。由于醫(yī)院看病是先到先看,所以可以使用隊列來實現(xiàn)排隊過程。模擬病人的排隊看病主要完成以下幾個操作:(1)病人把病歷本交到護士手中,相當于進隊;(2)排在最前面的病人先看,同時取走病歷,這一步相當于出隊;(3)查看排隊,從隊頭到隊尾依次顯示隊列中所有的病歷號;(4)停止排隊,醫(yī)生看病結束,退出程序。
其次,加強實驗課輔導,克服學生人數(shù)過多問題。對學生進行分組,編程能力強的和基礎偏弱的同學搭配組合。課上,隨機從每組抽取學生解釋程序部分代碼,激勵學生主動學習。同時,要求學生養(yǎng)成良好的編程習慣,鼓勵學生程序出現(xiàn)錯誤是正?,F(xiàn)象,沒有什么可怕,但要學會利用編譯器工具自己調(diào)試程序,總結常見錯誤,降低出錯頻率。課下,通過網(wǎng)絡及時回答解決學生遇到的問題。
最后,通過案例驅(qū)動式教學,豐富課程設計教學內(nèi)容。學生在學習數(shù)據(jù)結構之前只學過C語言,對軟件開發(fā)的過程并不熟悉,獨立完成課程設計有一定的難度。教師可先完整的給學生講解一個案例,讓學生了解如何用軟件工程的思想來開發(fā)設計軟件。例如:圖書館管理系統(tǒng)。(1)圖書入庫:新購一種書,確定書號后,登記到圖書目錄表中,如果表中已有,則只將庫存量增加;圖書數(shù)據(jù)包括圖書書號,書名,作者,數(shù)量,單價等;(2)排序:以書號按升序進行排序(可以任選一種排序方法);(3)查找:能按書名、書號進行查找(分別用順序查找和折半查找方法);(4)刪除:從表中刪除指定的圖書;(5)借閱:如果一種書的現(xiàn)存量大于0,則借出一本,登記借閱者的書證號和歸還期限,改變現(xiàn)存量;(6)歸還:注銷對借閱者的登記,改變該書的現(xiàn)存量。
通過實驗課和課程設計的多維實踐,培養(yǎng)學生綜合運用所學數(shù)據(jù)結構相關知識,切實促進學生實踐能力的提高。
通過對傳統(tǒng)教學中存在的幾個問題的改進,提高了學生的學習主動性,教學效果得到了一定的改善,讓學生可以更好的學習后續(xù)課程。今后,我們將進一步探索與實踐數(shù)據(jù)結構課程教學改革,突出數(shù)據(jù)結構在計算機專業(yè)的核心課程的地位,以期為培養(yǎng)出合格的計算機專業(yè)人才打下夯實基礎。
[1] 王麗麗.探討《數(shù)據(jù)結構》教學中的幾個關鍵問題[J].科技信息,2012,(7):6-7.
[2] 嚴蔚敏,吳偉民.數(shù)據(jù)結構(C 語言版)[M].北京:清華大學出版社,2008:3.
[3] 張銘,耿國華,陳衛(wèi)衛(wèi),等.數(shù)據(jù)結構與算法課程教學實施方案[J].中國大學教學,2011,(3):56-60.
[4] 江家寶,程勇.數(shù)據(jù)結構[M].北京:科學出版社,2011:98.