摘要:“C語(yǔ)言程序設(shè)計(jì)”是高校多數(shù)非計(jì)算機(jī)專業(yè)本科生的必修課,也是學(xué)生普遍認(rèn)為非常難學(xué)的課程。為了降低難度,筆者提出從調(diào)整授課順序和改革教學(xué)內(nèi)容兩個(gè)方面入手,進(jìn)行改革。實(shí)踐證明,這一做法能夠取得比較好的教學(xué)效果,學(xué)生的程序設(shè)計(jì)能力也較以前有明顯提高。
關(guān)鍵詞:C語(yǔ)言程序設(shè)計(jì);教學(xué)效果;授課順序;教學(xué)內(nèi)容
中圖分類號(hào):G642文獻(xiàn)標(biāo)識(shí)碼:B
文章編號(hào):1672-5913 (2007) 20-0067-03
隨著計(jì)算機(jī)在各個(gè)專業(yè)領(lǐng)域的普及,許多非計(jì)算機(jī)專業(yè)的本科生都需要在學(xué)習(xí)和工作中根據(jù)專業(yè)的特點(diǎn)編寫實(shí)用程序。以“C語(yǔ)言程序設(shè)計(jì)”(下面簡(jiǎn)稱為“C語(yǔ)言”)為代表的“程序設(shè)計(jì)”類課程是高校多數(shù)非計(jì)算機(jī)專業(yè)本科生的必修課。通過(guò)系統(tǒng)地學(xué)習(xí)該課程,學(xué)生主要學(xué)習(xí)兩大類的知識(shí):一種流行的程序設(shè)計(jì)語(yǔ)言(例如C)和程序設(shè)計(jì)初步。其中,程序設(shè)計(jì)的思維方式以及與之相關(guān)的概念、操作等都將比較系統(tǒng)地介紹給學(xué)生。
按照傳統(tǒng)的教學(xué)模式,學(xué)生普遍認(rèn)為《C語(yǔ)言》比較難學(xué),而且在后續(xù)課程學(xué)習(xí)中也不能很好地用它進(jìn)行程序設(shè)計(jì)。學(xué)生程序設(shè)計(jì)能力普遍偏低,主要體現(xiàn)在兩個(gè)方面:編寫程序的效率低和程序的質(zhì)量低。就此,國(guó)內(nèi)有的學(xué)者提出通過(guò)按照專業(yè)調(diào)整授課重點(diǎn)、補(bǔ)充多媒體等教學(xué)手段激發(fā)學(xué)生興趣、通過(guò)“精選”、“精講”、“勤練”等方式提高授課質(zhì)量[1]。
在講授過(guò)程中,筆者對(duì)比和研究了多種教學(xué)手段和國(guó)內(nèi)外計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言類教材[2~8],并進(jìn)行了小范圍的實(shí)驗(yàn),最終發(fā)現(xiàn),單純改革教學(xué)方式能夠收到一定的教學(xué)效果,但是受教師本身教學(xué)水平的影響比較大,不會(huì)從根本上解決問(wèn)題。另外一個(gè)結(jié)論就是傳統(tǒng)教學(xué)中有兩方面值得推敲:一方面是授課順序,另一方面是教學(xué)內(nèi)容。
1傳統(tǒng)的教學(xué)順序
傳統(tǒng)的“C語(yǔ)言”教學(xué)中,概述之后往往要用兩章的篇幅(大約10學(xué)時(shí))分別介紹數(shù)據(jù)類型和運(yùn)算符,然后依次是程序控制結(jié)構(gòu)、數(shù)組、指針、函數(shù)等知識(shí)。這種教學(xué)順序可能來(lái)自于教材的編纂順序。筆者認(rèn)為,這種順序比較適合于編寫產(chǎn)品使用說(shuō)明書(shū),而不適合組織教材,更不適合教學(xué)。它存在如下兩個(gè)問(wèn)題:
(1) 初期的知識(shí)點(diǎn)過(guò)于繁多。以數(shù)據(jù)類型部分為例,C語(yǔ)言中用于修飾數(shù)據(jù)的基本數(shù)據(jù)類型只有4個(gè)(分別是char、int、float和double)。如果只是簡(jiǎn)單介紹,這些內(nèi)容并不多,但在這部分通常還要講述short、long、signed和unsigned修飾,其他進(jìn)制整數(shù)的表示、各種小數(shù)的表示、字符和字符串的表示、各種數(shù)據(jù)的輸入和輸出、輸入輸出數(shù)據(jù)時(shí)格式的控制等等。如果學(xué)生已經(jīng)基本掌握了C語(yǔ)言,作為復(fù)習(xí),倒還可以按此方式總結(jié),但在學(xué)習(xí)伊始就要面對(duì)如此繁雜的內(nèi)容,確實(shí)有些不妥。調(diào)查發(fā)現(xiàn),學(xué)習(xí)完這部分內(nèi)容以后,許多學(xué)生都表示聽(tīng)明白了,但什么都沒(méi)有記住,更談不上如何在程序中使用,為什么要這樣用等。甚至有的學(xué)生在進(jìn)行到一半的時(shí)候就產(chǎn)生了畏難情緒和放棄思想。類似的問(wèn)題在講授運(yùn)算符部分時(shí)也存在。
(2) 數(shù)組、指針和函數(shù)比較難掌握。這是整個(gè)課程的重點(diǎn)和難點(diǎn)部分,其中既包括很多新的概念和相應(yīng)的操作,還包括課程要求掌握的大部分算法。學(xué)習(xí)完這部分內(nèi)容之后,學(xué)生普遍反映能夠讀懂程序,但不能熟練編寫和調(diào)試程序,因此有必要研究這部分內(nèi)容的教學(xué)方法。
2調(diào)整授課順序
從軟件工程的角度分析,C語(yǔ)言屬于結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言。結(jié)構(gòu)化程序設(shè)計(jì)的一個(gè)突出特點(diǎn)是程序要圍繞著數(shù)據(jù)展開(kāi)。就此,筆者根據(jù)幾本國(guó)內(nèi)外語(yǔ)言類教材的組織方式[2-8],并站在初學(xué)者的角度,本著由問(wèn)題引入、由淺入深的原則,重新組合了部分內(nèi)容,分散了知識(shí)點(diǎn)和難點(diǎn),基本消除了上面提到的問(wèn)題。具體說(shuō)明如下:
(1) 按照程序處理對(duì)象安排教學(xué)順序。圍繞著不同類型的數(shù)據(jù),我們把整個(gè)教學(xué)過(guò)程主要分成三個(gè)階段進(jìn)行。第一階段采用以int型數(shù)據(jù)為例,重點(diǎn)介紹整型數(shù)據(jù)及其相關(guān)操作,例如常量、變量、定義、輸入、輸出、計(jì)算等概念。第二階段在前一階段的基礎(chǔ)之上,通過(guò)簡(jiǎn)單擴(kuò)充,講授完float、double等其他數(shù)值型數(shù)據(jù)的相關(guān)概念和操作等知識(shí)。最后一個(gè)階段講授有關(guān)字符與字符串的概念及其操作。
(2) 綜合介紹數(shù)組、指針和函數(shù)。數(shù)組、指針和函數(shù)是C語(yǔ)言中的重點(diǎn)和難點(diǎn)部分。這三個(gè)概念之間既包括相互獨(dú)立的部分,也有相互重疊的部分。在講授的時(shí)候,最好按照各部分的難易、重疊關(guān)系安排教學(xué)順序。為此,我們把這部分也分成三個(gè)階段進(jìn)行。第一階段,仍然以整型數(shù)據(jù)為例,重點(diǎn)介紹三部分的基本概念和操作。第二個(gè)階段重點(diǎn)介紹要求掌握的算法,例如排序、查找等。第三階段,重點(diǎn)討論涉及字符串的概念和操作。當(dāng)然,如果能夠把前后兩部分綜合考慮,從整體上劃分成三個(gè)階段講授,會(huì)使得課程更為緊湊。
經(jīng)過(guò)這樣劃分以后,由于每一階段都針對(duì)特定的數(shù)據(jù)類型展開(kāi),所以不論是學(xué)生理解和掌握,還是教師的備課和授課,都將輕松許多。經(jīng)筆者小范圍實(shí)驗(yàn)證明,調(diào)整之后也確實(shí)取得了令人滿意的教學(xué)效果。
3調(diào)整課程內(nèi)容
當(dāng)然,這里說(shuō)的調(diào)整課程內(nèi)容并不是說(shuō)哪些專業(yè)適合學(xué)習(xí)C語(yǔ)言,哪些專業(yè)不適合,什么專業(yè)適合學(xué)習(xí)哪部分內(nèi)容等有關(guān)分級(jí)教學(xué)的問(wèn)題。《中國(guó)高等院校計(jì)算機(jī)基礎(chǔ)教育課程體系2004》(簡(jiǎn)稱CFC2004)提出計(jì)算機(jī)基礎(chǔ)教育的理念是:“面向應(yīng)用需要;采用多種模式;啟發(fā)自主學(xué)習(xí);重視實(shí)踐環(huán)節(jié);培養(yǎng)創(chuàng)新意識(shí);樹(shù)立團(tuán)隊(duì)精神?!眰鹘y(tǒng)的《C語(yǔ)言》教學(xué)中,多以介紹語(yǔ)法為主,所講述的程序或者是針對(duì)理想數(shù)據(jù)的驗(yàn)證性程序,或者是簡(jiǎn)單的算法,例如數(shù)組的排序、檢索、插入與刪除元素等。這些內(nèi)容當(dāng)然重要,但是它們都是針對(duì)理想數(shù)據(jù)、特定情況展開(kāi)的。因此,學(xué)生按照這種方式學(xué)習(xí)了一個(gè)學(xué)期之后并不能保證順利編寫和調(diào)試具有實(shí)用價(jià)值的簡(jiǎn)單的小程序。
為了使學(xué)生具有一定的實(shí)踐能力,筆者認(rèn)為需要從兩個(gè)方面調(diào)整課程。第一個(gè)方面是修改例題。具體地講,就是要改變?cè)瓉?lái)程序的給出方式。原來(lái)的方式是在簡(jiǎn)單分析之后直接給出程序的。筆者認(rèn)為,例題必須從零開(kāi)始,按照自頂向下逐步細(xì)化的設(shè)計(jì)過(guò)程逐步給出,尤其是比較靠前面的例題和比較復(fù)雜的例題更應(yīng)如此。
另一方面是補(bǔ)充有關(guān)程序調(diào)試、測(cè)試方法和異常處理等方面的知識(shí)。其中,程序調(diào)試方法至少包括設(shè)置斷點(diǎn)、跟蹤、查看變量的值等操作。測(cè)試方法主要介紹黑盒測(cè)試和白盒測(cè)試。針對(duì)初學(xué)者的特點(diǎn),不妨把異常處理的重點(diǎn)放在以scanf為代表的輸入函數(shù)上。除了上面這些內(nèi)容以外,根據(jù)專業(yè)需要,筆者認(rèn)為針對(duì)不同的專業(yè),還可以考慮補(bǔ)充有關(guān)人機(jī)界面設(shè)計(jì)和程序格式方面的內(nèi)容。要補(bǔ)充的內(nèi)容看似很多,其實(shí),只要在講授例題的時(shí)候調(diào)整一下方式方法,就可以使學(xué)生在潛移默化中掌握這些內(nèi)容。
異常處理是所有補(bǔ)充內(nèi)容中最不容易實(shí)現(xiàn)的部分。因?yàn)橐话闱闆r下,scanf出現(xiàn)在課程的初期,而異常處理則出現(xiàn)在課程的中期或者后期。按照完全沉浸法解決這個(gè)問(wèn)題的一種策略是教師編寫具有異常處理功能的輸入函數(shù)myScanf,替代原來(lái)輸入函數(shù)scanf,供學(xué)生使用。到后面講述異常處理的時(shí)候,再剖析myScanf的設(shè)計(jì)。這樣的好處是既培養(yǎng)了學(xué)生處理異常情況的習(xí)慣,又教會(huì)了學(xué)生處理異常的常見(jiàn)方法??芍^“一舉兩得”。
為了便于交流,下面簡(jiǎn)單介紹一下myScanf的設(shè)計(jì)思路。在C語(yǔ)言中,最為常用的輸入函數(shù)就是scanf,它主要包括3個(gè)組成部分:作為第1個(gè)參數(shù)的格式字符串部分,作為后續(xù)參數(shù)的地址列表,以及該函數(shù)的返回值。地址列表按順序提供了存儲(chǔ)各輸入數(shù)據(jù)的存儲(chǔ)單元的地址;格式字符串部分是程序員明確定義的輸入數(shù)據(jù)的順序、數(shù)據(jù)類型、個(gè)數(shù)等信息??梢园裺canf函數(shù)的執(zhí)行過(guò)程描述為:操作者通過(guò)鍵盤輸入數(shù)據(jù),程序按照格式字符串分解輸入的數(shù)據(jù),并把它轉(zhuǎn)換成一個(gè)相應(yīng)的值,最后再按照地址列表中的地址存儲(chǔ);重復(fù)前面的分解、轉(zhuǎn)換和存儲(chǔ)過(guò)程,直到格式字符串為空。當(dāng)分解出的數(shù)據(jù)非法時(shí),scanf函數(shù)將終止運(yùn)行。返回值描述的是正確接收和存儲(chǔ)的數(shù)據(jù)個(gè)數(shù)。初學(xué)者在使用scanf函數(shù)時(shí),問(wèn)題主要包括:
(1) 缺少或者不會(huì)給出提示信息
(2) 編寫程序時(shí),格式字符串中格式轉(zhuǎn)換說(shuō)明符與后面的地址在數(shù)據(jù)類型、個(gè)數(shù)、順序方面不統(tǒng)一
(3) 運(yùn)行程序時(shí),輸入的數(shù)據(jù)與格式字符串不匹配,造成不能正常接收部分?jǐn)?shù)據(jù)
(4) 運(yùn)行前面scanf時(shí)多輸入的數(shù)據(jù)會(huì)影響后面輸入函數(shù)讀取數(shù)據(jù)
myScanf圍繞著上述問(wèn)題展開(kāi)。由于根據(jù)地址很難判斷出數(shù)據(jù)類型,此外,按階段教學(xué)時(shí),數(shù)據(jù)類型也非常單一,因此在myScanf函數(shù)中可以不處理有關(guān)格式轉(zhuǎn)換說(shuō)明符與后面地址的數(shù)據(jù)類型是否匹配的問(wèn)題。
據(jù)此,設(shè)計(jì)myScanf函數(shù)的流程圖如圖1所示。教學(xué)中,可在此基礎(chǔ)之上根據(jù)學(xué)生實(shí)際情況增減功能。
4結(jié)束語(yǔ)
誠(chéng)然,提高學(xué)生程序設(shè)計(jì)能力絕對(duì)不是靠一門“C語(yǔ)言”就能夠做到的,但對(duì)于非計(jì)算機(jī)專業(yè)的學(xué)生來(lái)講,由于后續(xù)的相關(guān)課程非常少,該課程的學(xué)習(xí)效果將直接影響到他們的程序設(shè)計(jì)能力,因此筆者認(rèn)為有必要仔細(xì)研究在不開(kāi)設(shè)后續(xù)課程的基礎(chǔ)上,如何調(diào)整以C語(yǔ)言為代表的語(yǔ)言課程的教學(xué)方法。
在近幾年的教學(xué)中,筆者嘗試在不增加學(xué)時(shí)的情況下,調(diào)整了教學(xué)順序,用符合上述規(guī)范的例題替換了原來(lái)過(guò)于簡(jiǎn)單的例題,同時(shí)也要求學(xué)生按此規(guī)范編寫程序、完成實(shí)驗(yàn)。從作業(yè)、實(shí)驗(yàn)情況等反饋信息來(lái)看,學(xué)生的程序設(shè)計(jì)能力明顯提高,取得了比較好的教學(xué)效果。
參考資料:
[1] 雷學(xué)生,胡多. C語(yǔ)言程序設(shè)計(jì)教學(xué)方法探討[J]. 計(jì)算機(jī)教育,2006,(6).
[2] KR. The C Programming Language[M]. 北京:清華大學(xué)出版社.
[3] Bjarne Stroustrup. C++程序設(shè)計(jì)語(yǔ)言(特別版影印本)[M]. 北京:高等教育出版社.
[4] Richard C. Detmer. 80X86匯編語(yǔ)言與計(jì)算機(jī)體系結(jié)構(gòu)[M]. 北京:機(jī)械工業(yè)出版社.
[5] Bradley L. Jones, Peter Aitken. 21天學(xué)通C語(yǔ)言(第6版)[M]. 北京:人民郵電出版社.
[6] 面向?qū)ο蟪绦蛟O(shè)計(jì)[M]. 北京:機(jī)械工業(yè)出版社.
[7] 譚浩強(qiáng). 程序設(shè)計(jì)[M]. 北京:清華大學(xué)出版社.
[8] 彭旭東,王成霞,萬(wàn)紅. 程序設(shè)計(jì)教程[M]. 北京:清華大學(xué)出版社.
作者簡(jiǎn)介
彭旭東(1971-),男(漢族),副教授,研究方向:數(shù)字圖像處理、并行計(jì)算。
聯(lián)系地址:天津理工大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 300191
電話:13752123198
E-mail:pengxvdong@163.com