丁海燕
(云南大學信息學院,云南昆明650091)
C語言程序設(shè)計是一門邏輯性與實踐性很強的課程,尤其是指針學生普遍反映難學,學習者必須通過大量的編程練習,在實踐中掌握語言知識,培養(yǎng)程序設(shè)計的基本能力,并逐步理解和掌握程序設(shè)計的思想和方法。因此,C語言程序設(shè)計課程的教學重點是培養(yǎng)學生的實踐編程能力。在傳統(tǒng)的教學方法中,采用“點—線—面”的教學模式,即先介紹變量定義,再介紹指令的語法規(guī)則,最后例子講解。這種教學模式不利于將知識轉(zhuǎn)化為能力。筆者根據(jù)教學經(jīng)驗和體會,對該門課程的教學方法進行了創(chuàng)新,并取得了良好的教學效果。
C語言程序設(shè)計是信息技術(shù)相關(guān)專業(yè)中一門必修的核心專業(yè)課程,它既可以實現(xiàn)高級語言的功能,又能夠通過指針直接訪問硬件,使用C語言既可以編寫功能強大的系統(tǒng)軟件,又可以編寫應(yīng)用軟件。C語言程序設(shè)計它也是諸如數(shù)據(jù)結(jié)構(gòu)、編譯原理、算法分析等課程的前導(dǎo)課程,C語言程序設(shè)計學習的好壞將直接影響后繼課程的學習,甚至影響整個專業(yè)的學習成績[1]。
計算機語言教學通常先講概念,講語法,講例子,然后上機做練習,教學死板不利于將知識轉(zhuǎn)化為能力。學生在學習C語言時,隨著大量難以理解和抽象的新概念、新名詞、新術(shù)語、新規(guī)則的介紹,枯燥乏味的例題分析后,學生會覺得學習C語言很枯燥,即使是上機也只會照著書本上的例子進行驗證,要獨立完成程序編寫常常感到無從下手。因此,要想講好此門課,需要加大教學與研究力度。根據(jù)教學情況,目前C語言教學主要存在的問題有以下幾方面:
作為計算機專業(yè)大一的必修課,C語言程序設(shè)計課時少,內(nèi)容多,邏輯思維嚴密,實踐性強,多數(shù)學生從高中進入大學,對老師依賴性較強,自學能力不足,此外對計算機專業(yè)的學習方法不適應(yīng),對編程的邏輯思維方法還沒有形成,VC++上機操作不熟練,對編譯、調(diào)試過程中出現(xiàn)的專業(yè)英語不熟悉等各方面的因素,導(dǎo)致這門課程學生學習起來有一定困難,容易形成成績兩極分化的結(jié)果。因此更需要教師提高教學水平,激發(fā)學習興趣,使得枯燥難懂的編程變得生動有趣。
C語言的學習類似于外語,要先會詞、句,然后才能寫出段落,C語言也必須掌握常量、變量、運算符、順序、選擇、循環(huán)語句等,才能寫出程序來。但要寫出好的文章光有詞匯和語法是不夠的,還需要流暢的思路,編程也是如此,算法才是程序的靈魂。大多數(shù)C語言教材中通常先給出一般的語法格式,然后講解語法要點,再舉例說明。很多教師對語句語法進行深入的教學,而對算法教學卻偏少、不重視。加上應(yīng)試教育的選擇題、填空題題目側(cè)重于語法細節(jié),與程序設(shè)計的實用性偏離甚遠,使學生產(chǎn)生了學習誤區(qū),導(dǎo)致了學生會讀程序,但自己上機寫程序時有種無從下手的感覺。學習程序設(shè)計語言的真正目的是編程解決問題,必須大量練習編程題,在編程的過程中掌握語法。
C語言的教學目的是要熟練掌握C語言的用法和培養(yǎng)結(jié)構(gòu)化程序設(shè)計的思維方式,培養(yǎng)編程能力,因此理論聯(lián)系實際是教學改革的一個重點。在高校中普遍存在著注入式教學方法,學生為學習而學習,而忽視了學習的目的,C語言程序設(shè)計是一門理論性和實踐性都很強的課程。當前,在程序設(shè)計實踐常用的模式中,基本遵循著前幾十年延續(xù)下來的習慣做法,即教師布置與程序設(shè)計語言教材的知識點相符的任務(wù),學生通過上機來驗證教材和講課的內(nèi)容以及自己所編的程序正確與否。這種做法與實際完全脫節(jié)[2],學生只會解決書上的問題,如求最大、最小值、平均值、排序、交換數(shù)組元素位置等,而對于現(xiàn)實問題卻很茫然。很少有教師仔細斟酌實驗的內(nèi)容,以使其與實際聯(lián)系更緊密,導(dǎo)致學生學完了不理解學了C有什么用處。因此講解和練習要多引入日常生活中的實際問題:如計算器、小游戲、具備插入、查詢、刪除、保存等基本功能的學生管理信息系統(tǒng)等,通過這些編程問題使學生綜合應(yīng)用各章的知識,如循環(huán)、數(shù)組、函數(shù)、指針、文件,達到解決實際問題的編程能力。
C語言是函數(shù)式的語言,因此C語言的重點一是函數(shù)、二是指針[1]。而數(shù)組與指針是密切聯(lián)系的,因此在C語言程序設(shè)計的教與學中一定要抓住數(shù)組、函數(shù)、指針這條主線,掌握數(shù)據(jù)在內(nèi)存中的存儲和變化,就有利于突出重點和突破難點。
與其他編程語言相比,C語言中數(shù)據(jù)類型和運算符眾多,指針概念抽象復(fù)雜,函數(shù)參數(shù)用法靈活,概念、語法規(guī)則和例子眾多,不易掌握。通常學生對單一的知識點能夠掌握,但對于知識點的聯(lián)系理解不深,難以形成完整的知識體系。因此C語言在講解時在介紹完數(shù)據(jù)類型、變量、常量、運算符、表達式和面向過程的三種基本程序設(shè)計結(jié)構(gòu)以后,要圍繞數(shù)組、函數(shù)、指針這一主線展開程序設(shè)計,這樣的話才能抓住C語言的重點,將紛繁的知識點形成清晰的脈絡(luò)。
我們知道,數(shù)組是相同數(shù)據(jù)類型的變量的集合,函數(shù)的作用是將程序模塊化,而函數(shù)的參數(shù)可以是普通變量,數(shù)組名和指針變量[3]。當在函數(shù)間傳遞數(shù)組和字符串時就可以用指針變量或數(shù)組名作函數(shù)參數(shù)進行地址傳遞,這樣實參與形參就有四種組合,即:(1)實參、形參均為數(shù)組名;(2)實參為數(shù)組名,形參為指針變量;(3)實參為指針變量,形參為數(shù)組名;(4)實參、形參均為指針變量。數(shù)組、函數(shù)、指針通過這一主線就貫穿和聯(lián)系起來了,學生既懂得它們之間的區(qū)別也懂得它們之間的聯(lián)系,學習起來輕而易舉。例如編寫swap函數(shù)(指針法):交換數(shù)組a和數(shù)組b中的對應(yīng)元素并輸出a、b數(shù)組。該例子既用到了函數(shù)調(diào)用,又用到了數(shù)組,還用到了指針變量作函數(shù)參數(shù),函數(shù)、指針、數(shù)組三個重要的知識點都聯(lián)系起來了。

C語言程序設(shè)計課程是C語言與程序設(shè)計相結(jié)合的一門課程,這就要求教師在授課過程中,既要講解C語言的一些語法規(guī)則,又要重視程序設(shè)計。如果上課的老師不能準確把握,把重點簡單放在講述一些語法規(guī)則方面,往往會使學生喪失學習興趣,另一方面也沒有達到教學目的,有損教學質(zhì)量[4]。通過典型的例題既講了語法,又掌握了算法,可謂一舉兩得。如果按照章節(jié)的順序,往往是先講變量、運算符,才講順序、選擇和循環(huán)結(jié)構(gòu),但孤立地講變量,常量,運算符學生往往學了就忘,理解不深,這時可以引入后面的實例。例如可用循環(huán)的例子for(i=1;i<=n;i++)p=p*i;指出變量要先定義后使用,定義數(shù)據(jù)類型的作用是為變量分配相應(yīng)大小的內(nèi)存空間,p為n!其值可能會超過基本整型變量的表示范圍-32768~+32767,因此p要定義為長整型,++是自增運算符,它的作用是i=i+1,for循環(huán)的功能是完成累積,乘數(shù)i從1至n,每循環(huán)一次i增加1。通過具體的實例使學生理解語法不是孤立的規(guī)則,而是互相聯(lián)系,使得一個功能得以實現(xiàn)的不可缺的組成部分。
在C語言中,指針是C語言中的重點和難點,概念抽象,學生不容易掌握。要啟發(fā)學生多進行對比,歸納總結(jié),深入本質(zhì),透過現(xiàn)象看到本質(zhì),培養(yǎng)和提高分析和解決問題的能力。例如,指針是地址,通過指針可以間接訪問它所指向的目標變量,但為什么要用指針?還要引導(dǎo)學生深入思考。函數(shù)之間傳遞數(shù)據(jù)要依靠參數(shù),而且只能由實參向形參傳遞,有值傳遞和地址傳遞兩種方式。如果將數(shù)組名或指針變量作參數(shù)就是地址傳遞。在函數(shù)間不僅可以傳遞變量的值,變量的地址,還可傳遞數(shù)組,字符串等[3]。形參是局部變量,函數(shù)調(diào)用結(jié)束形參變量就釋放掉了,而函數(shù)返回值又只能有一個,那如何才能夠從調(diào)用函數(shù)帶回多個不同數(shù)據(jù)類型的數(shù)據(jù)呢?帶著這樣的問題,讓學生思考通過指針進行地址傳遞的作用,其好處就在于可以通過形參的指針變量間接訪問實參變量,達到了“雙向傳遞”的效果,這樣在函數(shù)調(diào)用時對形參變量的操作就等價于對實參變量的操作,理解了這一點就可以明白指針的重要性和好處了,學習也變得輕松和簡單了。例如交換兩個數(shù)的例子,用指針作形參。當函數(shù)調(diào)用結(jié)束后,形參空間雖然釋放了,但在函數(shù)調(diào)用過程中通過形參對實參的影響卻留了下來[1]。


在教學中只要抓住數(shù)據(jù)在內(nèi)存的存儲和變化這個關(guān)鍵點,結(jié)合適當?shù)膱D形教學,例如數(shù)組元素的內(nèi)存分配,指針操作數(shù)組元素時,指針的自增與自減運算,指針的交換,目標變量的交換,鏈表的創(chuàng)建、插入、刪除和輸出等,都可以畫出內(nèi)存單元的圖示來,一步一步地操作,循序漸進的學習,學生就容易理解和學好C語言了。例如用圖示法形象化上例中的swap函數(shù)交換兩個變量,如圖1所示:

圖1 調(diào)用swap函數(shù)交換a、b的值
同一個問題,鼓勵學生用幾種不同的方法編程實現(xiàn),并讓學生去分析它們的異同,從而加深對知識點的理解,掌握本質(zhì)的算法思想。例如求1到100的累加和,可以用while,for和do while循環(huán)三種方法實現(xiàn),輸入字符串時可以用scanf,getchar,gets函數(shù)來實現(xiàn),輸出字符串時可用printf,putchar,puts來函數(shù)實現(xiàn),輸入、輸出數(shù)組元素時可以用下標法,也可以通過指針法等[5]。通過讓學生嘗試用不同的方法解決問題,一方面使學生對相近知識點的異同有了深刻的理解,培養(yǎng)了學生發(fā)現(xiàn)事物之間內(nèi)在聯(lián)系的觀察能力,另一方面鍛煉了學生編程的能力,培養(yǎng)了學生主動學習,積極思考的學習習慣,并且能將所學知識融會貫通,可謂一舉兩得。
程序設(shè)計課程,上機操作是必不可少的重要教學環(huán)節(jié),程序調(diào)試能力的培養(yǎng)是重中之重,通過程序調(diào)試,學生可以查出自己編寫程序時容易犯的錯誤,而且更重要的是能培養(yǎng)學生分析問題、解決問題的實際能力和創(chuàng)新意識[6]。實際上任務(wù)的完成標志著學生實踐能力的提高,學生也能體驗到任務(wù)完成后的成就感,從而激發(fā)他們進一步學習興趣和積極性。所以應(yīng)大力加強實踐教學和實訓(xùn),不斷提高學生的動腦動手能力。教師要做好實踐設(shè)計,結(jié)合教材每一章都要有上機內(nèi)容,供學生練習,使學生上機目的明確,使之成為加強學生實踐能力、自學能力和創(chuàng)新思維的重要依托。期末考試盡可能采取客觀題在線考試與上機考試相結(jié)合的形式,使學生從根本上重視上機編程實踐。
[1]陳興無,段昌盛.《C語言程序設(shè)計》教學主線的研究與實踐[J].恩施職業(yè)技術(shù)學院學報,2006,18(2):83-85.
[2]徐曉偉.《C語言程序設(shè)計》教學方法改革探析[J].軟件導(dǎo)刊,2008,7(11):207-208.
[3]譚浩強.《C程序設(shè)計》[M].北京:清華大學出版社,2005.
[4]董衛(wèi)紅.《C語言程序設(shè)計》的教學改革與實踐[J].常州輕工職業(yè)技術(shù)學院學報,2007(1):53-56.
[5]李玲.《C語言程序設(shè)計教程》[M].北京:人民郵電出版社,2005.
[6]廖秋香.C語言課程教學改革的幾點建議[J].梧州學院學報,2008,18(3):95-96.