摘要:程序設(shè)計(jì)語(yǔ)言課程教學(xué)應(yīng)當(dāng)注重能力培養(yǎng),以學(xué)生能夠獨(dú)立地讀寫(xiě)程序?yàn)橹行哪繕?biāo)。課程內(nèi)容須少而精。上機(jī)實(shí)踐不宜選用算法設(shè)計(jì)難度大的題目。文中介紹了多種獲取學(xué)習(xí)狀況反饋的途徑。一個(gè)反響良好的措施是要求學(xué)生每天讀透一個(gè)程序示例,并在下一次課上隨機(jī)抽取學(xué)生上臺(tái)講解。
關(guān)鍵詞:程序設(shè)計(jì)語(yǔ)言課程;教學(xué)方法;能力培養(yǎng);每天一例
中圖分類(lèi)號(hào):G64文獻(xiàn)標(biāo)識(shí)碼:B
文章編號(hào):1672-5913 (2007) 21-0031-03
前言
程序設(shè)計(jì)語(yǔ)言課程已經(jīng)成為高等院校的基礎(chǔ)課程。它不但是計(jì)算機(jī)專(zhuān)業(yè)學(xué)生的必修課程,而且是非計(jì)算機(jī)專(zhuān)業(yè)的必修課程。學(xué)好本課程,有利于學(xué)生深入地理解和掌握計(jì)算機(jī)技術(shù),更好地使用計(jì)算機(jī)。
本文是我在從事程序設(shè)計(jì)語(yǔ)言教學(xué)過(guò)程中的經(jīng)驗(yàn)教訓(xùn)和心得體會(huì)的總結(jié)。目的是引發(fā)一些思考和討論,從而在程序設(shè)計(jì)語(yǔ)言課程教學(xué)上探索出更有效的手段和方法。
我講授的是C語(yǔ)言,授課對(duì)象是非計(jì)算機(jī)專(zhuān)業(yè)的學(xué)生。教材選用的是譚浩強(qiáng)教授編著的《C程序設(shè)計(jì)(第三版)》。本文給出的觀點(diǎn)和方法不限于C語(yǔ)言教學(xué)范疇,盡管部分例子采用了C語(yǔ)言編寫(xiě)的程序代碼。這些觀點(diǎn)和方法可以推廣應(yīng)用至各類(lèi)程序設(shè)計(jì)語(yǔ)言課程教學(xué)中。
我的觀點(diǎn)和方法概括如下:
●衡量課程學(xué)得好壞的標(biāo)準(zhǔn)有兩條:(1) 會(huì)讀程序;(2) 能寫(xiě)程序解決問(wèn)題。
●課程內(nèi)容須少而精。
●課堂教學(xué)要多交待背景、多舉例和多提問(wèn)。
●強(qiáng)調(diào)課后復(fù)習(xí),采取措施進(jìn)行督促。
●強(qiáng)化實(shí)踐環(huán)節(jié),及時(shí)解決學(xué)生們遇到的問(wèn)題。
●獲取反饋,跟蹤學(xué)生的課程學(xué)習(xí)狀況。
1衡量標(biāo)準(zhǔn)
計(jì)算機(jī)程序設(shè)計(jì)課程學(xué)得好與壞,就看這個(gè)學(xué)生能否做到兩件事:讀程序和寫(xiě)程序?!皶?huì)讀程序”是前提,會(huì)寫(xiě)程序并且寫(xiě)出好程序是最終目的。誠(chéng)如譚浩強(qiáng)教授所言:衡量這門(mén)課學(xué)習(xí)的好壞,不是看你“知不知道”,而是“會(huì)不會(huì)干”。
會(huì)讀程序不是一件容易的事。應(yīng)該要求學(xué)生讀“透”程序——把程序語(yǔ)句背后的含義讀出來(lái)。舉個(gè)例子來(lái)說(shuō),程序清單1的功能是把一個(gè)二維數(shù)組行和列互換,存到另一個(gè)二維數(shù)組中。
程序清單1:
#include
void main() {
int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
int b[3][2], i, j;
printf(\"數(shù)組a: \\");
for(i=0; i<=1; i++){
for(j=0; j<=2; j++){
printf(\"%5d\", a[i][j]);
b[j][i] = a[i][j];
}
printf(\"\\");
}
printf(\"數(shù)組b: \\");
for(i=0; i<=2; i++){
for(j=0; j<=1; j++)
printf(\"%5d\", b[i][j]);
printf(\"\\");
}
}
上述程序是簡(jiǎn)單的。讀透它不僅僅是給出程序運(yùn)行結(jié)果,而應(yīng)該讀出語(yǔ)句背后的含義。例如以下程序段的含義是把數(shù)組a的一行轉(zhuǎn)換成數(shù)組b的一列。由此,我們也可以讀出變量i代表的是數(shù)組a的行號(hào),數(shù)組b的列號(hào)。行號(hào)/列號(hào)正是變量i背后的含義。
程序清單2:
for(j=0; j<=2; j++){
printf(\"%5d\", a[i][j]);
b[j][i] = a[i][j];
}
能寫(xiě)程序解決問(wèn)題是更高一層的要求。這一能力必須通過(guò)不斷的練習(xí)來(lái)獲得。這主要依靠課程實(shí)踐環(huán)節(jié)。需要注意的是,寫(xiě)程序前須要求學(xué)生復(fù)習(xí)知識(shí)點(diǎn)和多讀程序示例,否則學(xué)生在上機(jī)編程中會(huì)遇到相當(dāng)多的低級(jí)錯(cuò)誤,效率大打折扣。
2課程內(nèi)容
課程內(nèi)容要少而精。課程應(yīng)當(dāng)聚焦于基礎(chǔ)概念和核心知識(shí)點(diǎn),不宜貪多。講一門(mén)程序設(shè)計(jì)語(yǔ)言,只要提供學(xué)生進(jìn)一步自學(xué)的基礎(chǔ)就可以了。
相信很多人認(rèn)同這個(gè)觀點(diǎn),只是操作起來(lái)就走樣。課程設(shè)計(jì)者也許是想多塞些知識(shí)給學(xué)生,或者在他/她眼里任何一個(gè)知識(shí)點(diǎn)都是那么重要。殊不知這帶來(lái)以下問(wèn)題:(1)教師趕進(jìn)度,減少對(duì)隱藏在背后的知識(shí)的詳細(xì)講解。在“課堂教學(xué)方法”一節(jié)會(huì)提到,這些背后的知識(shí)是掌握某些課程知識(shí)的前提。(2)學(xué)生消化不了。不但多塞的內(nèi)容掌握不了,連基本的都學(xué)得不扎實(shí)。(3)給學(xué)生造成課程“難”的印象。一旦提不起興趣,積極性和主動(dòng)性就得不到發(fā)揮。這一后果比少學(xué)一點(diǎn)更嚴(yán)重。
授課者應(yīng)該思考向?qū)W生提供什么。舉例來(lái)講,C語(yǔ)言課程不見(jiàn)得要逐一講授眾多字符串操作函數(shù)和文件操作函數(shù)的用法,而應(yīng)該是舉例講解,進(jìn)而歸結(jié)出庫(kù)函數(shù)的使用方法。重要的是掌握在閱讀函數(shù)原型和有關(guān)說(shuō)明后能夠正確使用函數(shù)的能力,而不是熟記大量函數(shù)的用法。逐一講解函數(shù)的用法既耗時(shí)又不能解決根本。
課程內(nèi)容少而精是合理的。對(duì)以后從事計(jì)算機(jī)專(zhuān)業(yè)的學(xué)生而言,安排內(nèi)容再多也不足以應(yīng)付將來(lái)的工作崗位的知識(shí)需求。對(duì)以后不從事計(jì)算機(jī)專(zhuān)業(yè)的學(xué)生而言,內(nèi)容多了反而是浪費(fèi)。課程內(nèi)容多了,學(xué)生疲于吞吃新知識(shí),無(wú)心也無(wú)力形成對(duì)計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言的深層次理解,無(wú)法做到融會(huì)貫通。而融會(huì)貫通、學(xué)以致用才是課程的真諦。
就《C程序設(shè)計(jì)(第三版)》而言,如果安排的學(xué)時(shí)數(shù)是48,那么內(nèi)容應(yīng)當(dāng)作較大幅的刪減。
3課堂教學(xué)方法
課堂教學(xué)要多交待背景。其中有的是知識(shí)背景,而有的是應(yīng)用背景。比如,課程開(kāi)始有必要交待程序編制過(guò)程,由此學(xué)生們能夠認(rèn)識(shí)到源程序和二進(jìn)制指令的關(guān)系。而了解內(nèi)存的結(jié)構(gòu)模型對(duì)于理解變量地址和指針等概念是必需的。更早的課程應(yīng)該講解過(guò)相關(guān)知識(shí),不過(guò)在課程開(kāi)始作一簡(jiǎn)要回顧還是值得的。介紹應(yīng)用背景可以引起學(xué)生們的思考。比如講解鏈表時(shí),恰當(dāng)?shù)膽?yīng)用背景明顯有助于理解。我在課堂上使用的實(shí)例是超市貨品管理軟件維護(hù)的庫(kù)存不足貨品列表——一個(gè)動(dòng)態(tài)變化的集合。首先分析指出采用靜態(tài)數(shù)組或動(dòng)態(tài)數(shù)組來(lái)維護(hù)庫(kù)存不足貨品列表所存在的問(wèn)題,接著告訴學(xué)生鏈表是解決問(wèn)題的好辦法。在這一場(chǎng)景下,鏈表結(jié)點(diǎn)、插入操作、刪除操作和遍歷操作等都是有具體含義的。待全部知識(shí)內(nèi)容講解完畢,回頭再總結(jié)問(wèn)題是如何解決的。如此能夠避免抽象和枯燥,使學(xué)生更容易接受相關(guān)知識(shí),甚至學(xué)以致用。
現(xiàn)在有一個(gè)不好的傾向,就是教材或課堂過(guò)于重視抽象化的知識(shí),忽視應(yīng)用背景。數(shù)據(jù)結(jié)構(gòu)的教材是這一傾向的代表。這對(duì)入門(mén)階段的學(xué)生來(lái)講是不適宜的,因?yàn)閷W(xué)生難以走進(jìn)所涉及的抽象世界,最終表現(xiàn)為不知道在講什么。所以在課堂上應(yīng)當(dāng)交待背景以化抽象為具體,而后通過(guò)歸納從具體走向抽象。
對(duì)程序設(shè)計(jì)語(yǔ)言課而言,在課堂上多舉例,也就是多展示源程序的示例是好做法。有些概念或知識(shí)點(diǎn),用文字費(fèi)力描述也達(dá)不到效果,用示例代碼就容易說(shuō)清楚。
課堂上應(yīng)當(dāng)多提問(wèn),隨機(jī)抽取學(xué)生回答問(wèn)題。這一方面能夠促使學(xué)生集中注意力;另一方面能夠活躍課堂氣氛。隨機(jī)抽取學(xué)生回答問(wèn)題能夠提供一些反饋信息,而且大部分學(xué)生是不會(huì)主動(dòng)站起來(lái)回答的,除非被授課者叫到。
4課后復(fù)習(xí)
應(yīng)該要求學(xué)生們課后及時(shí)復(fù)習(xí),鞏固每一次課所學(xué)的知識(shí)內(nèi)容。因?yàn)橐坏┓e累了問(wèn)題,到后面可能連課都聽(tīng)不懂。不及時(shí)復(fù)習(xí)又會(huì)影響到上機(jī)實(shí)踐的效率和效果。
光倡議是不起作用的。我在第一次課就提出了要求,可是學(xué)生們動(dòng)靜不大。有必要采取措施來(lái)督促學(xué)生們做好課后復(fù)習(xí)工作。我采用的辦法是在一次課的前5到10分鐘內(nèi)隨機(jī)挑選兩位學(xué)生上講臺(tái)講解與上一次課程內(nèi)容相關(guān)的示例程序。這一措施實(shí)施后,收效比較明顯。
另一個(gè)值得考慮的舉措是把班級(jí)分組,8到10人一組。每一組推選一名組長(zhǎng),職責(zé)是在課余以及上機(jī)實(shí)驗(yàn)過(guò)程中為本組同學(xué)解答疑問(wèn)。期末評(píng)分上給予組長(zhǎng)適當(dāng)獎(jiǎng)勵(lì)。
5課程實(shí)踐
每一位授課者都知道程序設(shè)計(jì)語(yǔ)言課離不開(kāi)上機(jī)實(shí)踐。課程進(jìn)行同時(shí)也會(huì)安排上機(jī)練習(xí)時(shí)間。要保證既有效率又有效果,須注意以下幾點(diǎn)。
●制定合適的上機(jī)實(shí)驗(yàn)計(jì)劃。實(shí)驗(yàn)計(jì)劃宜與課堂教學(xué)進(jìn)度同步,即把實(shí)驗(yàn)任務(wù)分成多個(gè)組,每一個(gè)組分別針對(duì)主要的知識(shí)體(如分支語(yǔ)句、循環(huán)語(yǔ)句和函數(shù))。一個(gè)任務(wù)組包含由淺至深的程序題。
●程序題的難度不宜過(guò)高。上機(jī)實(shí)驗(yàn)的中心目標(biāo)是掌握程序設(shè)計(jì)語(yǔ)言的使用。程序題難度主要在于算法復(fù)雜程度。難度過(guò)高的題目導(dǎo)致學(xué)生們花費(fèi)大量時(shí)間去尋求解題思路。這與中心目標(biāo)不符。提高尋求解題思路的能力應(yīng)當(dāng)是其他課程的任務(wù),對(duì)程序設(shè)計(jì)語(yǔ)言課程而言是次要的。當(dāng)然,程序題也要有一定的挑戰(zhàn)性,以及趣味性。
●課堂上應(yīng)該講解算法是什么和如何寫(xiě)算法。盡管算法不是課程的中心內(nèi)容,不過(guò)學(xué)生們?cè)谏蠙C(jī)實(shí)驗(yàn)過(guò)程中遇到的大部分問(wèn)題歸因于算法。只要幫助學(xué)生理清算法,問(wèn)題通常迎刃而解。因此,應(yīng)當(dāng)利用恰當(dāng)比例的時(shí)間開(kāi)展必要的算法訓(xùn)練。
●督促學(xué)生養(yǎng)成良好的編程習(xí)慣。這主要涉及兩方面。一方面是“先算法后編程”,可以不把算法描述成文,但在心里必須清楚明了。另一方面是注意編程風(fēng)格,值得強(qiáng)調(diào)重點(diǎn)是縮進(jìn)和取名??梢钥紤]利用網(wǎng)絡(luò)論壇公開(kāi)展示學(xué)生寫(xiě)的好程序。
6學(xué)習(xí)狀況跟蹤
我在教學(xué)過(guò)程中獲得了一條教訓(xùn):切忌自我感覺(jué)良好。我感覺(jué)良好的原因在于:(1)自信能夠把課程內(nèi)容講清楚;(2)課堂上學(xué)生反應(yīng)頗佳,向大家發(fā)出的提問(wèn)都能得到較滿意的答案。這種良好感覺(jué)在一次小測(cè)驗(yàn)后完全消失。我認(rèn)識(shí)到,我以前的良好感覺(jué)是建立在主觀性的反饋之上的,甚至加上了自己的傾向。準(zhǔn)確了解學(xué)生學(xué)習(xí)狀況離不開(kāi)客觀性的反饋。值得借鑒的具體做法是:
●向隨機(jī)挑選的學(xué)生提問(wèn),并禁止其他同學(xué)的“協(xié)助”。
●批改適當(dāng)比例的作業(yè)。
●一兩次認(rèn)真組織的小測(cè)驗(yàn)。小測(cè)驗(yàn)可以是筆試也可以是機(jī)試。這也能讓學(xué)生了解自己的學(xué)習(xí)狀況。
7總結(jié)
本文是我在C語(yǔ)言教學(xué)過(guò)程中所獲得的經(jīng)驗(yàn)教訓(xùn)和心得體會(huì)的總結(jié)。它不是一種教學(xué)方法的系統(tǒng)論述,而是一些零碎的觀點(diǎn)和方法的討論。我想再一次強(qiáng)調(diào)的一個(gè)觀點(diǎn)是“課程內(nèi)容須少而精”。課程設(shè)計(jì)者應(yīng)當(dāng)掌握好“度”。就我個(gè)人來(lái)看,目前課程內(nèi)容過(guò)多是普遍現(xiàn)象,造成學(xué)生囫圇吞棗地學(xué)習(xí),為考試記憶知識(shí),無(wú)法達(dá)到融會(huì)貫通。這不正是造成“考完了就還給老師”這一狀況的原因嗎?
收稿日期:2007-06-26
作者簡(jiǎn)介:葉常春(1974-),男,浙江東陽(yáng)人,博士畢業(yè),講師,現(xiàn)就職于國(guó)防科學(xué)技術(shù)大學(xué)計(jì)算機(jī)學(xué)院。研究方向:軟件工程、程序設(shè)計(jì)基礎(chǔ)和操作系統(tǒng)。
E_mail: chchye@nudt.edu.cn