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