蔡敏?汪世義
摘要:“數(shù)據(jù)結(jié)構(gòu)”是計算機專業(yè)的一門核心課程,但實際教學效果卻往往難以令人滿意。結(jié)合應(yīng)用型高校學生的實際情況,在教學過程中進行了多方面探索和改革,對培養(yǎng)和保持學生的學習興趣、提高學生的分析和解決問題的能力方面起到很好的效果。
關(guān)鍵詞:數(shù)據(jù)結(jié)構(gòu);現(xiàn)場編程;聯(lián)動教學改革;C語言
作者簡介:蔡敏(1975-),男,安徽巢湖人,巢湖學院計算機與信息工程學院,講師;汪世義(1974-),男,安徽桐城人,巢湖學院計算機與信息工程學院,副教授。(安徽 合肥 238000)
基金項目:本文系巢湖學院教研項目(項目編號:Jyxm201102)、安徽省省級質(zhì)量工程項目(項目編號:20100970)的研究成果。
中圖分類號:G642.0 文獻標識碼:A 文章編號:1007-0079(2013)07-0103-02
“數(shù)據(jù)結(jié)構(gòu)”課程對于培養(yǎng)應(yīng)用型計算機專業(yè)人才至關(guān)重要。但因其理論抽象、邏輯性強、對程序設(shè)計基礎(chǔ)要求比較高,學生普遍感覺這門課程難以理解,上機實踐也不知從何著手,對該課程缺乏應(yīng)有的興趣。王曉東教授指出:學生的學習興趣受專業(yè)基礎(chǔ)課程成績和對課程學習重要性認識的影響,增加實踐性教學和以案例為先導的理論課教學方式更有利于提高學生的學習興趣。[1]本文以此為指導思想,開展了一系列教學改革探索。
一、與C編程語言聯(lián)動改革
學習數(shù)據(jù)結(jié)構(gòu)離不開編程。所學的理論只有落實到程序?qū)崿F(xiàn)上,學生才會真正感到“數(shù)據(jù)結(jié)構(gòu)”課程的用處。以前教師只試圖通過一些有趣或?qū)嵱玫睦觼砑ぐl(fā)學生學習興趣,如猴子選大王、24點游戲等問題,但這種興趣并不能成為學生嘗試編程實現(xiàn)的動力,其根本原因不是學生偷懶,而是他們的編程基礎(chǔ)比較差。在這種情形下,要求學生運用理論去解決實際問題是不切實際的。因此,如果只是單純對“數(shù)據(jù)結(jié)構(gòu)”教學進行改革,不解決學生編程基礎(chǔ)差的問題,改革必定難以取得成功。我校開設(shè)的“數(shù)據(jù)結(jié)構(gòu)”以C語言為描述工具的,因此對“數(shù)據(jù)結(jié)構(gòu)”與“C語言”兩門課程進行了聯(lián)動教學改革。
有的教師課堂駕馭能力較好,教學也非常負責,但在C語言教學過程中,有意或無意把公共C語言等級考試的大綱當作計算機專業(yè)C語言教學大綱來開展教學。他們在教學中比較注重語法細節(jié)的教學,沒有將教學重點放在算法上。這種教學對提高非計算機上專業(yè)學生等級考試通過率效果非常顯著,但對于計算機專業(yè)學生卻效果不好。
C語言本身概念復(fù)雜、規(guī)則繁多、靈活而易錯,在教學過程中要“淡化語法規(guī)則,注重算法,以練代記”。提高編程能力的唯一途徑就是不斷編程,只有在反復(fù)實踐中才能掌握并靈活使用諸多繁雜的規(guī)則。把語法知識分為三類,第一類是教師須重點講解的語法,比如for語句,應(yīng)重點講解其結(jié)構(gòu)以及嵌套方法,并輔以足夠的練習;第二類是非重點語法,這類語法不應(yīng)占用課堂時間,比如for語句的各種省略形式,如果實踐中遇到需使用這類語法的情況,可引導學生自主學習;第三類是盡量不用的語法,主張在編程時使用簡單明了的語句,比如在表達式里要求不用(i++)+(++i)+(i++)形式。
過度地強調(diào)語法一方面偏離了計算機專業(yè)教學目標,另一方面占據(jù)了過多課時,使得后面的指針、結(jié)構(gòu)體等內(nèi)容得不到充分學習,而這些內(nèi)容恰恰是C語言的難點和精華,也是數(shù)據(jù)結(jié)構(gòu)的重要基礎(chǔ)。缺乏這些知識,將很難理解數(shù)據(jù)結(jié)構(gòu)。
二、數(shù)據(jù)結(jié)構(gòu)教學改革
1.一題多解、一題多變、一題多用
教師在講解課本算法時要廣開思路,不能就題論題,應(yīng)適當加以擴展、發(fā)散,盡量做到一題多解、一題多變、一題多用。這既有利于學生更透徹地理解課本算法,又能開闊學生思維,激發(fā)學生積極思考。實踐表明,這種方法課堂氣氛熱烈,學生參與度高。
例如課本例題:有兩個順序表LA和LB,其元素均為非遞減有序排列,試編寫一個算法,將它們合并成一個順序表LC,要求LC也是非遞減有序排列。[2]
課本算法思路是:首先根據(jù)LA和LB中數(shù)據(jù)元素個數(shù)之和,為LC分配空間;其次依次從表頭到表尾掃描LA和LB中元素,比較它們當前元素的值,將值較小者插入LC中,直到其中一個順序表掃描完畢;最后將另一順序表中剩余元素逐個插入LC中。
對此例題準備了兩個發(fā)散點。發(fā)散點一:如果希望LC合并后的結(jié)果是非遞增有序排列,經(jīng)討論得到可得到兩種辦法,一種是掃描方向不變,而把插入方向反過來,即從表尾往表頭方向插入;另一種是插入方向不變,把掃描方向反過來,但每次將值較大者插入到LC。如果把掃描和插入方向都反過來,每次比較時將值較大者插入LC,就可以得到原題另一解法。發(fā)散點二:課本算法使用了3個循環(huán),其中后兩個循環(huán)只會執(zhí)行其中一個,那么可不可以只要一個循環(huán)就能達到目的呢?[3]首先帶學生分析為什么課本算法要三個循環(huán)。這是因為第一個循環(huán)后必有一個順序表中會有剩余元素。要想在一個循環(huán)就能實現(xiàn),必須在這個循環(huán)內(nèi)讓所有元素都能插入到LC中。方法是在兩個順序表尾各加一個無窮大。注意控制循環(huán)條件,不要把無窮大也插入到LC中了。
可以發(fā)散的例子很多,比如再講二分查找時,可以發(fā)散到三分查找,也會引發(fā)有趣的討論。再比如折半查找還可以用來迅速找到第k小的元素,等等。
2. 適當采用現(xiàn)場編程示范
很多學生反映上課算法思路能聽懂,許多問題他們心里知道如何去解決問題,但就是不知道如何用編程語言或算法表達出來。教師可利用多媒體教室,在課堂上可適當采用現(xiàn)場編程方式。[4]這種方法可以讓學生見習教師把自己的思路轉(zhuǎn)變成代碼的全過程。程序從無到有,到最終運行通過,對學生編寫和調(diào)試程序起到很好的示范作用。C語言教學中涉及的程序通常較短,最好能讓學生主寫,而數(shù)據(jù)結(jié)構(gòu)程序通常比較長,也更復(fù)雜一些,可由教師來主寫,邊寫邊講解。教師也可故意制造一些問題,由學生積極獻計獻策加以解決。現(xiàn)場編序雖然比較耗費課時,但適當示范還是必要的。
例如猴子選大王問題,教師先帶著學生先把算法總體思想寫出來,這個算法不依賴于具體的存儲結(jié)構(gòu)。接下來分別用順序結(jié)構(gòu)和鏈式結(jié)構(gòu)加以實現(xiàn)。這對學生深刻理解緒論中“算法的設(shè)計只取決于邏輯結(jié)構(gòu),而算法的實現(xiàn)則依賴于具體的存儲結(jié)構(gòu)”這句話很有幫助。也能讓學生體會到用類C語言表示的算法與用C語言實現(xiàn)的程序的區(qū)別。同時,學生也能認識到,算法并非只是抽象的理論,而是可以運用到實踐中的。
經(jīng)過這次課的講解,直接把課本算法照抄到電腦上運行的學生大大減少,不少學生課后按自己的思路,寫出了程序,極大地增強了學生編程的自信心。
3.培養(yǎng)學生編程意志和自信心
意志與興趣并不矛盾,有興趣固然是好,但沒有產(chǎn)生興趣之前,意志就顯得特別重要了。當學生能解決很多問題時,往往就有興趣了,至少不覺得痛苦。學習編程也一樣不可能一帆風順,雖然教師布置任務(wù)時總希望由易到難,循序漸進,但實踐中總會遇到一些相對復(fù)雜的問題,需要花費較多時間和精力。如果學生沒有堅強的編程意志,知難而退,最終也難以成為高質(zhì)量的應(yīng)用型人才。比如24點游戲,因為擔心學生意志力不夠會中途放棄,所以采用逐次增加任務(wù)的方法。首先讓學生實現(xiàn)課本表達式求值算法,然后要求他們修改程序和結(jié)構(gòu),隨機產(chǎn)生1至13的整數(shù),當輸入一個表達式后,能判斷是否正確,最后再要求如果用戶輸入“?”應(yīng)能給出一種解,或提示無解。等全部實現(xiàn)完之后,學生發(fā)現(xiàn)已經(jīng)寫了幾百行程序,特別有成就感。學生在完成該課程設(shè)計題的過程中,經(jīng)歷了反復(fù)認真的思考,耐心的調(diào)試,對培養(yǎng)學生編程意志和編程自信心起到很好的效果。
三、其他輔助措施
1.及時給學生提供幫助
由于每次上機實驗的學生數(shù)較多,有些學生的問題不能得到及時解決,如果學生問題積壓多了,也會逐漸失去興趣。教師可通過電子郵件、QQ等方式給他們提供及時幫助,還可以開展編程興趣小組,讓編程能力強的同學幫助編程基礎(chǔ)差的同學,也為他們相互交流編程心得提供了方便。
2.嚴格考核方式
在教學過程中發(fā)現(xiàn),一些學生不愿獨立思考,把同學做好的作業(yè)直接拷貝過來。因為學生數(shù)較多,難以逐個甄別,為此教師采取了隨機抽查答辯的方式。每次抽取一半學生當面給教師解釋所提交的程序的部分代碼,如果不能正確解答,則本次作業(yè)被視為不合格。這種方式至少能鞭策學生設(shè)法弄懂拷貝來的程序,這也是一種收獲,而大部分學生都能獨立地或經(jīng)過與同學討論完成作業(yè)。
四、結(jié)束語
興趣是學習的內(nèi)在動力。只有讓學生對編程產(chǎn)生興趣,學生才有可能主動把理論應(yīng)用于實踐,主動去提高自己解決問題的能力,以后的教學才能事半功倍,應(yīng)用型計算機專業(yè)人才培養(yǎng)目標才能最終得以實現(xiàn)。好的編程基礎(chǔ)是學習興趣的前提條件,如何使學生產(chǎn)生和保持編程興趣,值得進一步深入研究。
參考文獻:
[1].王曉東,吳英杰,等.算法與數(shù)據(jù)結(jié)構(gòu)學習興趣影響因素分析[J].計算機教育,2010,(12):73-76.
[2]嚴蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu)[M].北京:清華大學出版社,2007,
4:26.
[3]T.Cormen,C.Leiserson,R.Rivest,等.算法導論[M].潘金貴,等,譯.
北京:機械工業(yè)出版社,2006.
[4] 董洪偉.數(shù)據(jù)結(jié)構(gòu)課程的教學改革初探[J].無錫教育學院學報,
2005,(1):56.
(責任編輯:宋秀麗)