李環(huán)宇,林曉霞,徐燕妮
(山東科技大學(xué)信息工程系,泰安271019)
目前國內(nèi)各高校普遍將《C語言程序設(shè)計》作為計算類相關(guān)專業(yè)的基礎(chǔ)必修課,它以編程語言作為工具和平臺,介紹程序設(shè)計的一般思想和程序設(shè)計所涉及的方法。該課程對后續(xù)學(xué)位課程起著重要的鋪墊作用。同時由于C語言具有高級和低級語言的雙重特點,能夠?qū)Φ讓佑布M行較為靈活的操縱,還有著靈活的控制和數(shù)據(jù)結(jié)構(gòu),能夠表達豐富的語義,能夠比較簡潔的完成各種操作[2],所以理工類各專業(yè),例如地圖學(xué)與地理信息系統(tǒng)、氣象學(xué)、自動化、機械電子工程等專業(yè)也都把它當做重要的基礎(chǔ)課來開設(shè)。
學(xué)習(xí)C語言程序設(shè)計的學(xué)生,一般都是初次接觸程序設(shè)計,甚至是初次接觸計算機,所以大多對計算機編程一無所知,因而在實際的C語言程序設(shè)計課程教學(xué)中,許多學(xué)生普遍感覺C語言涉及的概念比較復(fù)雜,規(guī)則繁多,知識點太多,容易出錯,致使學(xué)生在不同程度上產(chǎn)生畏難心理。
另外,在教師的教學(xué)過程中,為了照顧緩解學(xué)生們的畏難情緒,長期以來的C語言程序設(shè)計教學(xué)過多注重的語句、語法和程序設(shè)計技巧,從而忽略了培養(yǎng)學(xué)生的動手編程解決問題的能力和程序調(diào)試能力。許多學(xué)生在一學(xué)期的學(xué)習(xí)結(jié)束后,或許對某個語法點是了解的,但在面對程序設(shè)計的題目、在解決實際問題的時候,感到無從下手,一篇茫然。由此也經(jīng)常產(chǎn)生疑問:我花了這么多的時間、費了那么多精力來學(xué)習(xí)程序設(shè)計,但到底有什么用呢?能解決什么問題呢?
很多經(jīng)常講授該課程的教師都意識到了該課程的教學(xué)所面臨的問題,認識到該課程的教學(xué)方法、教學(xué)方式的改革的必要性,并已經(jīng)從很多方面進行了有益的嘗試。
在多年的教學(xué)改革中,已經(jīng)取得明顯成效的改革措施中,以“項目為驅(qū)動的案例式”教學(xué)方式的改革,取得的效果極為明顯。例如《C語言程序設(shè)計課程改革探討》[3]一文中就指出:不能一開始就給學(xué)生講解相對無趣和復(fù)雜的語言和定義,而是應(yīng)該從一個學(xué)生感興趣的實際案例出發(fā),通過對案例的分析與講解找到解決問題的方法和思路,依次激發(fā)學(xué)生學(xué)習(xí)的熱情,也能使學(xué)生感性地認識到所學(xué)知識的可用性?!皽\析案例教學(xué)對教學(xué)成果的提升”[4]一文中也有類型的觀點。
上述教學(xué)研究成果旨在增強學(xué)生學(xué)習(xí)的興趣,克服學(xué)生的畏難情緒。可以說是都在一定程度上解決了學(xué)生學(xué)習(xí)C語言程序設(shè)計比較困難的問題。但也有較大的改進空間:
首先,從要求掌握基本知識點來看,很多教學(xué)案例雖然從自身來看,其架構(gòu)較為完整,但每個案例到底應(yīng)該包含多少知識點,并無定論,只是根據(jù)教師的實際經(jīng)驗來臨時確定,在面對不同專業(yè)、不同知識背景的學(xué)生時,事前并不好預(yù)判這樣的案例是否合適。
這天傍晚,柳紅正在井邊沖涼,蘇秋琴來了。她見到柳紅就哇哇直叫,說:“好啊,柳紅,你當著爸的面在洗澡啊?!绷t被她說得難為情起來,轉(zhuǎn)身欲走,蘇秋琴就一把攔住了她,罵這鬼天氣,一個月都不落一顆雨,想熱死人啊。她也迅速地扒了衣服,和柳紅一起沖涼。柳紅就羞她:“你怎么也當著爸的面洗澡了?”
其次,從整個C語言程序設(shè)計課程來說,各個案例開放性不足,案例之間缺乏相互的聯(lián)系,無形之間就割裂了本該前后勾連的知識體系,也就是缺少對課程知識點群合理的分布和重組[5]。
最后,由于缺乏整體的結(jié)構(gòu)性,學(xué)生們在進行二次開發(fā),以鞏固基本知識點,提升編程能力時,需要再次搭建知識載體,并對載體進行再認識,效率比較低。同時也失去了給學(xué)生強調(diào)模塊化(函數(shù)化)思想的機會,但C程序設(shè)計最基本的思想,從微觀角度看,是強調(diào)函數(shù)這個基本單位而不是單個語句。
通過分析可以發(fā)現(xiàn),之所以在教改中仍然出現(xiàn)很多問題,很重要的一點就是很多教師在制定相應(yīng)案例的時候,忽略了案例的“粒度”問題。所謂“粒度”,原意是指數(shù)據(jù)倉庫的數(shù)據(jù)單位中保存數(shù)據(jù)的細化或綜合程度的級別。細化程度越高,粒度級就越??;相反,細化程度越低,粒度級就越大[6]。
本文所說的“粒度”,實際是一種對知識點的劃分問題,也就是怎樣合乎邏輯的將聯(lián)系較為緊密的知識點化為一個整體來進行理解和掌握。粒度級別太低,將融合較多的知識點,給學(xué)生的學(xué)習(xí)帶來較多的困難;相反,如果粒度級別太高,一個案例將只包含數(shù)個甚至是單個知識點,這樣可能人為的割裂知識點之間的有機聯(lián)系,妨礙從總體上把握課程總的知識框架。
為了有效解決上述問題,筆者所在的程序設(shè)計教學(xué)團隊,在總結(jié)經(jīng)驗的基礎(chǔ)上,充分調(diào)研,對以“項目驅(qū)動的案例式教學(xué)”再次改進,形成多層次的多粒度的案例教學(xué)題庫[7]。該題庫從“分”與“和”,“微觀”與“宏觀”兩個方面入手,較為合理地把握“粒度”的概念,確定了兩個“粒度”劃分標準:即宏觀粒度與微觀粒度。
宏觀粒度的案例主要涉及三個層次:認知層次、提高層次和應(yīng)用層次。
認知層次對所有的學(xué)生(包括專科生)都是適用的,它們是學(xué)習(xí)了C語言后最起碼應(yīng)該達到了水平;提高層次主要體現(xiàn)在對知識的融會貫通,對知識的熟練應(yīng)用,在這個過程中應(yīng)該能夠?qū)W到一些編程的方法和技巧;而提高層次則應(yīng)該能夠用學(xué)到的編程思想和編程方法、技巧,結(jié)合后續(xù)課程所用的算法和數(shù)據(jù)結(jié)構(gòu),用于解決實際的問題,真正能夠為后續(xù)課程,甚至是畢業(yè)后的工作打好知識基礎(chǔ)。該層次主要是在課程講授完畢后課程實訓(xùn)時實施。
為了方便教師授課,學(xué)生聽課,該粒度的三個層次都將形成各自的一個完整C源程序,其中的各個子函數(shù)將分別涵蓋了本課程所有重要知識點,以函數(shù)調(diào)用的形式出現(xiàn),這樣幫助學(xué)生一開始就能從宏觀上理解他們以后所編程的程序到底該是什么樣的。
在目前紛繁多樣的教學(xué)改革中,“慕課”和“微課”所取得的教學(xué)成果也非常明顯。認知層次所涉及的知識點就非常適合使用“慕課”和“微課”收到予以解決。事實上,我們也的確是將各基本知識點以“慕課”的形式錄制,放在學(xué)校校園網(wǎng)上,方便學(xué)生隨時隨地的學(xué)習(xí),這樣的學(xué)習(xí)“以學(xué)習(xí)者為中心,增強學(xué)習(xí)者的吸引力”[8],大大緩解了教師講授該方面知識點的時間壓力,教師在課上只需要講解學(xué)生關(guān)注的重點難點內(nèi)容。
微觀粒度的案例主要是對宏觀粒度中各個子函數(shù)的分解,其內(nèi)容服從于整個宏觀框架,力求做到出現(xiàn)在一個案例重大知識點具有內(nèi)聯(lián)性。雖然這里的主體內(nèi)容來自于宏觀粒度中的子函數(shù),卻是一個可以單獨調(diào)試、不需要參數(shù)的主函數(shù)的形式的出現(xiàn),因為這里關(guān)注的是一個函數(shù)內(nèi)部所涉及的到的知識點,需要看到立竿見影的效果。
需要注意的是,為了提高學(xué)習(xí)的效率,所用到的所有源程序都應(yīng)該給學(xué)生練習(xí)預(yù)留接口,使學(xué)生比較容易的利用框架所提供的形式為掌握知識點服務(wù)。
筆者所在教學(xué)團隊就認真研究了“基于用戶角色的圖書管理系統(tǒng)案例分析”[10],選擇該案例的目的,是因為該案例來自于學(xué)生比較熟悉的場景,貼近學(xué)生們的生活,容易讓學(xué)生對其感興趣,同時該案例有一定的工程背景[9],如果想要日后都學(xué)生進行拓展訓(xùn)練,非常容易在該案例的基礎(chǔ)上進行改進。
不過對于初學(xué)者來說,它還是太復(fù)雜了,所以筆者對其進行簡化,保留了其整體的架構(gòu),分解出了若干函數(shù),每個函數(shù)均包含教學(xué)大綱中所要求的知識點,在不同的章節(jié)進行重點講解。例如:在“管理員系統(tǒng)菜單界面”,重點引入了printf函數(shù)和scanf函數(shù),用于輸出菜單信息和供用戶選擇的輸入信息。從層次上說,這是認知層次。
具體菜單選項中引入了多分支選擇結(jié)構(gòu)switch語句,而對于該界面能夠持續(xù)的存在,則還引入了循環(huán)結(jié)構(gòu);在文件讀取用戶信息模塊,引入了文件的管理和字符串在數(shù)組中的保存。從層次上說,這也是認知層次。但是在應(yīng)用switch時,涉及到了表達式的應(yīng)用、整除的具體應(yīng)用,屬于多知識點的教誨,這又屬于提高層次。這樣教師再給學(xué)生講授相關(guān)知識點時,學(xué)生就不會單純認為類似的算術(shù)運算早就知道,枯燥無味。他們會發(fā)現(xiàn),原來一個簡單的算術(shù)運算及其表達式,原來還有如此的用途,增強了其學(xué)習(xí)興趣。
在信息統(tǒng)計模塊,則引入了數(shù)組中的排序算法,并對此類信息進行統(tǒng)計。這就屬于提高層次。
以上一系列的編排一方面使學(xué)生從總體上了解到了該函數(shù)模塊的作用,有了較強的方向性,另一方面又簡化了程序的復(fù)雜度,使單節(jié)學(xué)習(xí)的效率更高。由于上面所述的各個函數(shù)均是“圖書管理管理系統(tǒng)”的一個組成函數(shù),最后再強調(diào)整體性的時候,當然很容易的實現(xiàn)了從“分”到“合”,從“微觀”到“宏觀”的轉(zhuǎn)變。
為了能夠使學(xué)生在學(xué)習(xí)了C語言以后有一個自我消化、理解的過程,一般應(yīng)在開設(shè)了程序設(shè)計課程后的下一個學(xué)期,安排學(xué)生進行二個周的課程實訓(xùn),課程實訓(xùn)的內(nèi)容將是應(yīng)用層次框架下的已經(jīng)詳細規(guī)定功能帶有綜合知識點與一定應(yīng)用價值的題目。例如,筆者就曾經(jīng)讓學(xué)生編制程序,讓學(xué)生實現(xiàn)一個簡單的計算器的算術(shù)計算功能,根據(jù)時間的長短,對該計算器的功能可以進行約束。經(jīng)過了這一步的訓(xùn)練,絕大多數(shù)的學(xué)生都能夠熟悉掌握所學(xué)程序的重要知識點、一定的編程思想和編程技巧,為后續(xù)課程的學(xué)習(xí)打下了堅實的基礎(chǔ)。
在確定了上述教學(xué)方法后,筆者所在單位的對17級、18級本科生中進行了試驗,取得了較好的效果:兩個年級的學(xué)生連續(xù)兩年參加“藍橋杯”軟件技術(shù)大賽中多個獎項。在以程序設(shè)計課為基礎(chǔ)的學(xué)習(xí)中,例如在學(xué)習(xí)《數(shù)據(jù)結(jié)構(gòu)》課程時,兩級的學(xué)生都展現(xiàn)了較強的編程能力,有力促進了相關(guān)專業(yè)課的學(xué)生。
當然,應(yīng)該認識到,在粒度劃分中,允許針對不同能力的學(xué)習(xí)者,做到分層設(shè)計,要有較常規(guī)的實驗內(nèi)容,特別是在認知層次上更應(yīng)該考慮到學(xué)生之間的差異性。在應(yīng)用層次中應(yīng)該有綜合性較強并和后續(xù)課程有一定聯(lián)系的項目實驗案例??己巳后w和考核內(nèi)容也進行分層,實現(xiàn)同一課堂的分層教學(xué)。
本文給出了基于案例粒度的程序設(shè)計教學(xué)方法,該方法既強調(diào)案例本身的內(nèi)斂性,認識到每個案例本身的知識聚集點,同時又從宏觀角度考慮到知識之間的關(guān)聯(lián)性,方便學(xué)生學(xué)習(xí)和掌握。但是粒度的劃分不是一成不變的,根據(jù)學(xué)生的專業(yè)特點和能力特點,應(yīng)該有不同的劃分方法。案例的選擇應(yīng)該與時俱進,始終能引起的興趣,便于學(xué)生沉浸其中,激發(fā)學(xué)生學(xué)習(xí)的主動性。