摘要:“C語言程序設計”是高校多數非計算機專業本科生的必修課,也是學生普遍認為非常難學的課程。為了降低難度,筆者提出從調整授課順序和改革教學內容兩個方面入手,進行改革。實踐證明,這一做法能夠取得比較好的教學效果,學生的程序設計能力也較以前有明顯提高。
關鍵詞:C語言程序設計;教學效果;授課順序;教學內容
中圖分類號:G642文獻標識碼:B
文章編號:1672-5913 (2007) 20-0067-03
隨著計算機在各個專業領域的普及,許多非計算機專業的本科生都需要在學習和工作中根據專業的特點編寫實用程序。以“C語言程序設計”(下面簡稱為“C語言”)為代表的“程序設計”類課程是高校多數非計算機專業本科生的必修課。通過系統地學習該課程,學生主要學習兩大類的知識:一種流行的程序設計語言(例如C)和程序設計初步。其中,程序設計的思維方式以及與之相關的概念、操作等都將比較系統地介紹給學生。
按照傳統的教學模式,學生普遍認為《C語言》比較難學,而且在后續課程學習中也不能很好地用它進行程序設計。學生程序設計能力普遍偏低,主要體現在兩個方面:編寫程序的效率低和程序的質量低。就此,國內有的學者提出通過按照專業調整授課重點、補充多媒體等教學手段激發學生興趣、通過“精選”、“精講”、“勤練”等方式提高授課質量[1]。
在講授過程中,筆者對比和研究了多種教學手段和國內外計算機程序設計語言類教材[2~8],并進行了小范圍的實驗,最終發現,單純改革教學方式能夠收到一定的教學效果,但是受教師本身教學水平的影響比較大,不會從根本上解決問題。另外一個結論就是傳統教學中有兩方面值得推敲:一方面是授課順序,另一方面是教學內容。
1傳統的教學順序
傳統的“C語言”教學中,概述之后往往要用兩章的篇幅(大約10學時)分別介紹數據類型和運算符,然后依次是程序控制結構、數組、指針、函數等知識。這種教學順序可能來自于教材的編纂順序。筆者認為,這種順序比較適合于編寫產品使用說明書,而不適合組織教材,更不適合教學。它存在如下兩個問題:
(1) 初期的知識點過于繁多。以數據類型部分為例,C語言中用于修飾數據的基本數據類型只有4個(分別是char、int、float和double)。如果只是簡單介紹,這些內容并不多,但在這部分通常還要講述short、long、signed和unsigned修飾,其他進制整數的表示、各種小數的表示、字符和字符串的表示、各種數據的輸入和輸出、輸入輸出數據時格式的控制等等。如果學生已經基本掌握了C語言,作為復習,倒還可以按此方式總結,但在學習伊始就要面對如此繁雜的內容,確實有些不妥。調查發現,學習完這部分內容以后,許多學生都表示聽明白了,但什么都沒有記住,更談不上如何在程序中使用,為什么要這樣用等。甚至有的學生在進行到一半的時候就產生了畏難情緒和放棄思想。類似的問題在講授運算符部分時也存在。
(2) 數組、指針和函數比較難掌握。這是整個課程的重點和難點部分,其中既包括很多新的概念和相應的操作,還包括課程要求掌握的大部分算法。學習完這部分內容之后,學生普遍反映能夠讀懂程序,但不能熟練編寫和調試程序,因此有必要研究這部分內容的教學方法。
2調整授課順序
從軟件工程的角度分析,C語言屬于結構化程序設計語言。結構化程序設計的一個突出特點是程序要圍繞著數據展開。就此,筆者根據幾本國內外語言類教材的組織方式[2-8],并站在初學者的角度,本著由問題引入、由淺入深的原則,重新組合了部分內容,分散了知識點和難點,基本消除了上面提到的問題。具體說明如下:
(1) 按照程序處理對象安排教學順序。圍繞著不同類型的數據,我們把整個教學過程主要分成三個階段進行。第一階段采用以int型數據為例,重點介紹整型數據及其相關操作,例如常量、變量、定義、輸入、輸出、計算等概念。第二階段在前一階段的基礎之上,通過簡單擴充,講授完float、double等其他數值型數據的相關概念和操作等知識。最后一個階段講授有關字符與字符串的概念及其操作。
(2) 綜合介紹數組、指針和函數。數組、指針和函數是C語言中的重點和難點部分。這三個概念之間既包括相互獨立的部分,也有相互重疊的部分。在講授的時候,最好按照各部分的難易、重疊關系安排教學順序。為此,我們把這部分也分成三個階段進行。第一階段,仍然以整型數據為例,重點介紹三部分的基本概念和操作。第二個階段重點介紹要求掌握的算法,例如排序、查找等。第三階段,重點討論涉及字符串的概念和操作。當然,如果能夠把前后兩部分綜合考慮,從整體上劃分成三個階段講授,會使得課程更為緊湊。
經過這樣劃分以后,由于每一階段都針對特定的數據類型展開,所以不論是學生理解和掌握,還是教師的備課和授課,都將輕松許多。經筆者小范圍實驗證明,調整之后也確實取得了令人滿意的教學效果。
3調整課程內容
當然,這里說的調整課程內容并不是說哪些專業適合學習C語言,哪些專業不適合,什么專業適合學習哪部分內容等有關分級教學的問題。《中國高等院校計算機基礎教育課程體系2004》(簡稱CFC2004)提出計算機基礎教育的理念是:“面向應用需要;采用多種模式;啟發自主學習;重視實踐環節;培養創新意識;樹立團隊精神。”傳統的《C語言》教學中,多以介紹語法為主,所講述的程序或者是針對理想數據的驗證性程序,或者是簡單的算法,例如數組的排序、檢索、插入與刪除元素等。這些內容當然重要,但是它們都是針對理想數據、特定情況展開的。因此,學生按照這種方式學習了一個學期之后并不能保證順利編寫和調試具有實用價值的簡單的小程序。
為了使學生具有一定的實踐能力,筆者認為需要從兩個方面調整課程。第一個方面是修改例題。具體地講,就是要改變原來程序的給出方式。原來的方式是在簡單分析之后直接給出程序的。筆者認為,例題必須從零開始,按照自頂向下逐步細化的設計過程逐步給出,尤其是比較靠前面的例題和比較復雜的例題更應如此。
另一方面是補充有關程序調試、測試方法和異常處理等方面的知識。其中,程序調試方法至少包括設置斷點、跟蹤、查看變量的值等操作。測試方法主要介紹黑盒測試和白盒測試。針對初學者的特點,不妨把異常處理的重點放在以scanf為代表的輸入函數上。除了上面這些內容以外,根據專業需要,筆者認為針對不同的專業,還可以考慮補充有關人機界面設計和程序格式方面的內容。要補充的內容看似很多,其實,只要在講授例題的時候調整一下方式方法,就可以使學生在潛移默化中掌握這些內容。
異常處理是所有補充內容中最不容易實現的部分。因為一般情況下,scanf出現在課程的初期,而異常處理則出現在課程的中期或者后期。按照完全沉浸法解決這個問題的一種策略是教師編寫具有異常處理功能的輸入函數myScanf,替代原來輸入函數scanf,供學生使用。到后面講述異常處理的時候,再剖析myScanf的設計。這樣的好處是既培養了學生處理異常情況的習慣,又教會了學生處理異常的常見方法。可謂“一舉兩得”。
為了便于交流,下面簡單介紹一下myScanf的設計思路。在C語言中,最為常用的輸入函數就是scanf,它主要包括3個組成部分:作為第1個參數的格式字符串部分,作為后續參數的地址列表,以及該函數的返回值。地址列表按順序提供了存儲各輸入數據的存儲單元的地址;格式字符串部分是程序員明確定義的輸入數據的順序、數據類型、個數等信息。可以把scanf函數的執行過程描述為:操作者通過鍵盤輸入數據,程序按照格式字符串分解輸入的數據,并把它轉換成一個相應的值,最后再按照地址列表中的地址存儲;重復前面的分解、轉換和存儲過程,直到格式字符串為空。當分解出的數據非法時,scanf函數將終止運行。返回值描述的是正確接收和存儲的數據個數。初學者在使用scanf函數時,問題主要包括:
(1) 缺少或者不會給出提示信息
(2) 編寫程序時,格式字符串中格式轉換說明符與后面的地址在數據類型、個數、順序方面不統一
(3) 運行程序時,輸入的數據與格式字符串不匹配,造成不能正常接收部分數據
(4) 運行前面scanf時多輸入的數據會影響后面輸入函數讀取數據
myScanf圍繞著上述問題展開。由于根據地址很難判斷出數據類型,此外,按階段教學時,數據類型也非常單一,因此在myScanf函數中可以不處理有關格式轉換說明符與后面地址的數據類型是否匹配的問題。
據此,設計myScanf函數的流程圖如圖1所示。教學中,可在此基礎之上根據學生實際情況增減功能。

4結束語
誠然,提高學生程序設計能力絕對不是靠一門“C語言”就能夠做到的,但對于非計算機專業的學生來講,由于后續的相關課程非常少,該課程的學習效果將直接影響到他們的程序設計能力,因此筆者認為有必要仔細研究在不開設后續課程的基礎上,如何調整以C語言為代表的語言課程的教學方法。
在近幾年的教學中,筆者嘗試在不增加學時的情況下,調整了教學順序,用符合上述規范的例題替換了原來過于簡單的例題,同時也要求學生按此規范編寫程序、完成實驗。從作業、實驗情況等反饋信息來看,學生的程序設計能力明顯提高,取得了比較好的教學效果。
參考資料:
[1] 雷學生,胡多. C語言程序設計教學方法探討[J]. 計算機教育,2006,(6).
[2] KR. The C Programming Language[M]. 北京:清華大學出版社.
[3] Bjarne Stroustrup. C++程序設計語言(特別版影印本)[M]. 北京:高等教育出版社.
[4] Richard C. Detmer. 80X86匯編語言與計算機體系結構[M]. 北京:機械工業出版社.
[5] Bradley L. Jones, Peter Aitken. 21天學通C語言(第6版)[M]. 北京:人民郵電出版社.
[6] 面向對象程序設計[M]. 北京:機械工業出版社.
[7] 譚浩強. 程序設計[M]. 北京:清華大學出版社.
[8] 彭旭東,王成霞,萬紅. 程序設計教程[M]. 北京:清華大學出版社.
作者簡介
彭旭東(1971-),男(漢族),副教授,研究方向:數字圖像處理、并行計算。
聯系地址:天津理工大學計算機科學與技術學院 300191
電話:13752123198
E-mail:pengxvdong@163.com