丁海燕
(云南大學(xué)信息學(xué)院,云南昆明650091)
C語言程序設(shè)計(jì)是一門邏輯性與實(shí)踐性很強(qiáng)的課程,尤其是指針學(xué)生普遍反映難學(xué),學(xué)習(xí)者必須通過大量的編程練習(xí),在實(shí)踐中掌握語言知識(shí),培養(yǎng)程序設(shè)計(jì)的基本能力,并逐步理解和掌握程序設(shè)計(jì)的思想和方法。因此,C語言程序設(shè)計(jì)課程的教學(xué)重點(diǎn)是培養(yǎng)學(xué)生的實(shí)踐編程能力。在傳統(tǒng)的教學(xué)方法中,采用“點(diǎn)—線—面”的教學(xué)模式,即先介紹變量定義,再介紹指令的語法規(guī)則,最后例子講解。這種教學(xué)模式不利于將知識(shí)轉(zhuǎn)化為能力。筆者根據(jù)教學(xué)經(jīng)驗(yàn)和體會(huì),對該門課程的教學(xué)方法進(jìn)行了創(chuàng)新,并取得了良好的教學(xué)效果。
C語言程序設(shè)計(jì)是信息技術(shù)相關(guān)專業(yè)中一門必修的核心專業(yè)課程,它既可以實(shí)現(xiàn)高級(jí)語言的功能,又能夠通過指針直接訪問硬件,使用C語言既可以編寫功能強(qiáng)大的系統(tǒng)軟件,又可以編寫應(yīng)用軟件。C語言程序設(shè)計(jì)它也是諸如數(shù)據(jù)結(jié)構(gòu)、編譯原理、算法分析等課程的前導(dǎo)課程,C語言程序設(shè)計(jì)學(xué)習(xí)的好壞將直接影響后繼課程的學(xué)習(xí),甚至影響整個(gè)專業(yè)的學(xué)習(xí)成績[1]。
計(jì)算機(jī)語言教學(xué)通常先講概念,講語法,講例子,然后上機(jī)做練習(xí),教學(xué)死板不利于將知識(shí)轉(zhuǎn)化為能力。學(xué)生在學(xué)習(xí)C語言時(shí),隨著大量難以理解和抽象的新概念、新名詞、新術(shù)語、新規(guī)則的介紹,枯燥乏味的例題分析后,學(xué)生會(huì)覺得學(xué)習(xí)C語言很枯燥,即使是上機(jī)也只會(huì)照著書本上的例子進(jìn)行驗(yàn)證,要獨(dú)立完成程序編寫常常感到無從下手。因此,要想講好此門課,需要加大教學(xué)與研究力度。根據(jù)教學(xué)情況,目前C語言教學(xué)主要存在的問題有以下幾方面:
作為計(jì)算機(jī)專業(yè)大一的必修課,C語言程序設(shè)計(jì)課時(shí)少,內(nèi)容多,邏輯思維嚴(yán)密,實(shí)踐性強(qiáng),多數(shù)學(xué)生從高中進(jìn)入大學(xué),對老師依賴性較強(qiáng),自學(xué)能力不足,此外對計(jì)算機(jī)專業(yè)的學(xué)習(xí)方法不適應(yīng),對編程的邏輯思維方法還沒有形成,VC++上機(jī)操作不熟練,對編譯、調(diào)試過程中出現(xiàn)的專業(yè)英語不熟悉等各方面的因素,導(dǎo)致這門課程學(xué)生學(xué)習(xí)起來有一定困難,容易形成成績兩極分化的結(jié)果。因此更需要教師提高教學(xué)水平,激發(fā)學(xué)習(xí)興趣,使得枯燥難懂的編程變得生動(dòng)有趣。
C語言的學(xué)習(xí)類似于外語,要先會(huì)詞、句,然后才能寫出段落,C語言也必須掌握常量、變量、運(yùn)算符、順序、選擇、循環(huán)語句等,才能寫出程序來。但要寫出好的文章光有詞匯和語法是不夠的,還需要流暢的思路,編程也是如此,算法才是程序的靈魂。大多數(shù)C語言教材中通常先給出一般的語法格式,然后講解語法要點(diǎn),再舉例說明。很多教師對語句語法進(jìn)行深入的教學(xué),而對算法教學(xué)卻偏少、不重視。加上應(yīng)試教育的選擇題、填空題題目側(cè)重于語法細(xì)節(jié),與程序設(shè)計(jì)的實(shí)用性偏離甚遠(yuǎn),使學(xué)生產(chǎn)生了學(xué)習(xí)誤區(qū),導(dǎo)致了學(xué)生會(huì)讀程序,但自己上機(jī)寫程序時(shí)有種無從下手的感覺。學(xué)習(xí)程序設(shè)計(jì)語言的真正目的是編程解決問題,必須大量練習(xí)編程題,在編程的過程中掌握語法。
C語言的教學(xué)目的是要熟練掌握C語言的用法和培養(yǎng)結(jié)構(gòu)化程序設(shè)計(jì)的思維方式,培養(yǎng)編程能力,因此理論聯(lián)系實(shí)際是教學(xué)改革的一個(gè)重點(diǎn)。在高校中普遍存在著注入式教學(xué)方法,學(xué)生為學(xué)習(xí)而學(xué)習(xí),而忽視了學(xué)習(xí)的目的,C語言程序設(shè)計(jì)是一門理論性和實(shí)踐性都很強(qiáng)的課程。當(dāng)前,在程序設(shè)計(jì)實(shí)踐常用的模式中,基本遵循著前幾十年延續(xù)下來的習(xí)慣做法,即教師布置與程序設(shè)計(jì)語言教材的知識(shí)點(diǎn)相符的任務(wù),學(xué)生通過上機(jī)來驗(yàn)證教材和講課的內(nèi)容以及自己所編的程序正確與否。這種做法與實(shí)際完全脫節(jié)[2],學(xué)生只會(huì)解決書上的問題,如求最大、最小值、平均值、排序、交換數(shù)組元素位置等,而對于現(xiàn)實(shí)問題卻很茫然。很少有教師仔細(xì)斟酌實(shí)驗(yàn)的內(nèi)容,以使其與實(shí)際聯(lián)系更緊密,導(dǎo)致學(xué)生學(xué)完了不理解學(xué)了C有什么用處。因此講解和練習(xí)要多引入日常生活中的實(shí)際問題:如計(jì)算器、小游戲、具備插入、查詢、刪除、保存等基本功能的學(xué)生管理信息系統(tǒng)等,通過這些編程問題使學(xué)生綜合應(yīng)用各章的知識(shí),如循環(huán)、數(shù)組、函數(shù)、指針、文件,達(dá)到解決實(shí)際問題的編程能力。
C語言是函數(shù)式的語言,因此C語言的重點(diǎn)一是函數(shù)、二是指針[1]。而數(shù)組與指針是密切聯(lián)系的,因此在C語言程序設(shè)計(jì)的教與學(xué)中一定要抓住數(shù)組、函數(shù)、指針這條主線,掌握數(shù)據(jù)在內(nèi)存中的存儲(chǔ)和變化,就有利于突出重點(diǎn)和突破難點(diǎn)。
與其他編程語言相比,C語言中數(shù)據(jù)類型和運(yùn)算符眾多,指針概念抽象復(fù)雜,函數(shù)參數(shù)用法靈活,概念、語法規(guī)則和例子眾多,不易掌握。通常學(xué)生對單一的知識(shí)點(diǎn)能夠掌握,但對于知識(shí)點(diǎn)的聯(lián)系理解不深,難以形成完整的知識(shí)體系。因此C語言在講解時(shí)在介紹完數(shù)據(jù)類型、變量、常量、運(yùn)算符、表達(dá)式和面向過程的三種基本程序設(shè)計(jì)結(jié)構(gòu)以后,要圍繞數(shù)組、函數(shù)、指針這一主線展開程序設(shè)計(jì),這樣的話才能抓住C語言的重點(diǎn),將紛繁的知識(shí)點(diǎn)形成清晰的脈絡(luò)。
我們知道,數(shù)組是相同數(shù)據(jù)類型的變量的集合,函數(shù)的作用是將程序模塊化,而函數(shù)的參數(shù)可以是普通變量,數(shù)組名和指針變量[3]。當(dāng)在函數(shù)間傳遞數(shù)組和字符串時(shí)就可以用指針變量或數(shù)組名作函數(shù)參數(shù)進(jìn)行地址傳遞,這樣實(shí)參與形參就有四種組合,即:(1)實(shí)參、形參均為數(shù)組名;(2)實(shí)參為數(shù)組名,形參為指針變量;(3)實(shí)參為指針變量,形參為數(shù)組名;(4)實(shí)參、形參均為指針變量。數(shù)組、函數(shù)、指針通過這一主線就貫穿和聯(lián)系起來了,學(xué)生既懂得它們之間的區(qū)別也懂得它們之間的聯(lián)系,學(xué)習(xí)起來輕而易舉。例如編寫swap函數(shù)(指針法):交換數(shù)組a和數(shù)組b中的對應(yīng)元素并輸出a、b數(shù)組。該例子既用到了函數(shù)調(diào)用,又用到了數(shù)組,還用到了指針變量作函數(shù)參數(shù),函數(shù)、指針、數(shù)組三個(gè)重要的知識(shí)點(diǎn)都聯(lián)系起來了。
C語言程序設(shè)計(jì)課程是C語言與程序設(shè)計(jì)相結(jié)合的一門課程,這就要求教師在授課過程中,既要講解C語言的一些語法規(guī)則,又要重視程序設(shè)計(jì)。如果上課的老師不能準(zhǔn)確把握,把重點(diǎn)簡單放在講述一些語法規(guī)則方面,往往會(huì)使學(xué)生喪失學(xué)習(xí)興趣,另一方面也沒有達(dá)到教學(xué)目的,有損教學(xué)質(zhì)量[4]。通過典型的例題既講了語法,又掌握了算法,可謂一舉兩得。如果按照章節(jié)的順序,往往是先講變量、運(yùn)算符,才講順序、選擇和循環(huán)結(jié)構(gòu),但孤立地講變量,常量,運(yùn)算符學(xué)生往往學(xué)了就忘,理解不深,這時(shí)可以引入后面的實(shí)例。例如可用循環(huán)的例子for(i=1;i<=n;i++)p=p*i;指出變量要先定義后使用,定義數(shù)據(jù)類型的作用是為變量分配相應(yīng)大小的內(nèi)存空間,p為n!其值可能會(huì)超過基本整型變量的表示范圍-32768~+32767,因此p要定義為長整型,++是自增運(yùn)算符,它的作用是i=i+1,for循環(huán)的功能是完成累積,乘數(shù)i從1至n,每循環(huán)一次i增加1。通過具體的實(shí)例使學(xué)生理解語法不是孤立的規(guī)則,而是互相聯(lián)系,使得一個(gè)功能得以實(shí)現(xiàn)的不可缺的組成部分。
在C語言中,指針是C語言中的重點(diǎn)和難點(diǎn),概念抽象,學(xué)生不容易掌握。要啟發(fā)學(xué)生多進(jìn)行對比,歸納總結(jié),深入本質(zhì),透過現(xiàn)象看到本質(zhì),培養(yǎng)和提高分析和解決問題的能力。例如,指針是地址,通過指針可以間接訪問它所指向的目標(biāo)變量,但為什么要用指針?還要引導(dǎo)學(xué)生深入思考。函數(shù)之間傳遞數(shù)據(jù)要依靠參數(shù),而且只能由實(shí)參向形參傳遞,有值傳遞和地址傳遞兩種方式。如果將數(shù)組名或指針變量作參數(shù)就是地址傳遞。在函數(shù)間不僅可以傳遞變量的值,變量的地址,還可傳遞數(shù)組,字符串等[3]。形參是局部變量,函數(shù)調(diào)用結(jié)束形參變量就釋放掉了,而函數(shù)返回值又只能有一個(gè),那如何才能夠從調(diào)用函數(shù)帶回多個(gè)不同數(shù)據(jù)類型的數(shù)據(jù)呢?帶著這樣的問題,讓學(xué)生思考通過指針進(jìn)行地址傳遞的作用,其好處就在于可以通過形參的指針變量間接訪問實(shí)參變量,達(dá)到了“雙向傳遞”的效果,這樣在函數(shù)調(diào)用時(shí)對形參變量的操作就等價(jià)于對實(shí)參變量的操作,理解了這一點(diǎn)就可以明白指針的重要性和好處了,學(xué)習(xí)也變得輕松和簡單了。例如交換兩個(gè)數(shù)的例子,用指針作形參。當(dāng)函數(shù)調(diào)用結(jié)束后,形參空間雖然釋放了,但在函數(shù)調(diào)用過程中通過形參對實(shí)參的影響卻留了下來[1]。
在教學(xué)中只要抓住數(shù)據(jù)在內(nèi)存的存儲(chǔ)和變化這個(gè)關(guān)鍵點(diǎn),結(jié)合適當(dāng)?shù)膱D形教學(xué),例如數(shù)組元素的內(nèi)存分配,指針操作數(shù)組元素時(shí),指針的自增與自減運(yùn)算,指針的交換,目標(biāo)變量的交換,鏈表的創(chuàng)建、插入、刪除和輸出等,都可以畫出內(nèi)存單元的圖示來,一步一步地操作,循序漸進(jìn)的學(xué)習(xí),學(xué)生就容易理解和學(xué)好C語言了。例如用圖示法形象化上例中的swap函數(shù)交換兩個(gè)變量,如圖1所示:
圖1 調(diào)用swap函數(shù)交換a、b的值
同一個(gè)問題,鼓勵(lì)學(xué)生用幾種不同的方法編程實(shí)現(xiàn),并讓學(xué)生去分析它們的異同,從而加深對知識(shí)點(diǎn)的理解,掌握本質(zhì)的算法思想。例如求1到100的累加和,可以用while,for和do while循環(huán)三種方法實(shí)現(xiàn),輸入字符串時(shí)可以用scanf,getchar,gets函數(shù)來實(shí)現(xiàn),輸出字符串時(shí)可用printf,putchar,puts來函數(shù)實(shí)現(xiàn),輸入、輸出數(shù)組元素時(shí)可以用下標(biāo)法,也可以通過指針法等[5]。通過讓學(xué)生嘗試用不同的方法解決問題,一方面使學(xué)生對相近知識(shí)點(diǎn)的異同有了深刻的理解,培養(yǎng)了學(xué)生發(fā)現(xiàn)事物之間內(nèi)在聯(lián)系的觀察能力,另一方面鍛煉了學(xué)生編程的能力,培養(yǎng)了學(xué)生主動(dòng)學(xué)習(xí),積極思考的學(xué)習(xí)習(xí)慣,并且能將所學(xué)知識(shí)融會(huì)貫通,可謂一舉兩得。
程序設(shè)計(jì)課程,上機(jī)操作是必不可少的重要教學(xué)環(huán)節(jié),程序調(diào)試能力的培養(yǎng)是重中之重,通過程序調(diào)試,學(xué)生可以查出自己編寫程序時(shí)容易犯的錯(cuò)誤,而且更重要的是能培養(yǎng)學(xué)生分析問題、解決問題的實(shí)際能力和創(chuàng)新意識(shí)[6]。實(shí)際上任務(wù)的完成標(biāo)志著學(xué)生實(shí)踐能力的提高,學(xué)生也能體驗(yàn)到任務(wù)完成后的成就感,從而激發(fā)他們進(jìn)一步學(xué)習(xí)興趣和積極性。所以應(yīng)大力加強(qiáng)實(shí)踐教學(xué)和實(shí)訓(xùn),不斷提高學(xué)生的動(dòng)腦動(dòng)手能力。教師要做好實(shí)踐設(shè)計(jì),結(jié)合教材每一章都要有上機(jī)內(nèi)容,供學(xué)生練習(xí),使學(xué)生上機(jī)目的明確,使之成為加強(qiáng)學(xué)生實(shí)踐能力、自學(xué)能力和創(chuàng)新思維的重要依托。期末考試盡可能采取客觀題在線考試與上機(jī)考試相結(jié)合的形式,使學(xué)生從根本上重視上機(jī)編程實(shí)踐。
[1]陳興無,段昌盛.《C語言程序設(shè)計(jì)》教學(xué)主線的研究與實(shí)踐[J].恩施職業(yè)技術(shù)學(xué)院學(xué)報(bào),2006,18(2):83-85.
[2]徐曉偉.《C語言程序設(shè)計(jì)》教學(xué)方法改革探析[J].軟件導(dǎo)刊,2008,7(11):207-208.
[3]譚浩強(qiáng).《C程序設(shè)計(jì)》[M].北京:清華大學(xué)出版社,2005.
[4]董衛(wèi)紅.《C語言程序設(shè)計(jì)》的教學(xué)改革與實(shí)踐[J].常州輕工職業(yè)技術(shù)學(xué)院學(xué)報(bào),2007(1):53-56.
[5]李玲.《C語言程序設(shè)計(jì)教程》[M].北京:人民郵電出版社,2005.
[6]廖秋香.C語言課程教學(xué)改革的幾點(diǎn)建議[J].梧州學(xué)院學(xué)報(bào),2008,18(3):95-96.
云南農(nóng)業(yè)大學(xué)學(xué)報(bào)(社會(huì)科學(xué))2012年6期