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