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