文章編號:1672-5913(2008)18-0120-03
摘要:“C語言程序設(shè)計”課程是高等院校計算機專業(yè)基礎(chǔ)課程之一,其教學(xué)效果直接影響學(xué)生在計算機方面的應(yīng)用。本文就C語言的特點并結(jié)合三年來的教學(xué)實踐,淺談幾點對該課程的教學(xué)體會。
關(guān)鍵詞:C語言;程序設(shè)計;教學(xué)體會
中國分類號:G642 文獻標(biāo)識碼:A
Simply discussing C language program design teaching experience
Yu Jiu-jiu
(AnHui WenDa Information And Technology CollegeHefei231201)
Abstract: C language program design is one of the courses for computer specialty in colleges, the effect on teaching affects the application for aspect of computer for students directly. The article is about the character on C language combined with theteaching practice for three years, and discusses some teaching experience for the course.
Keywords: C language;program design;teaching experience
“C語言程序設(shè)計”課程是高等院校計算機專業(yè)開設(shè)的專業(yè)基礎(chǔ)課程之一。近幾年筆者先后承擔(dān)了高校計算機網(wǎng)絡(luò)技術(shù)、軟件應(yīng)用技術(shù)等專業(yè)的C語言程序設(shè)計課程的教學(xué)任務(wù),但在教學(xué)過程中卻發(fā)現(xiàn)了一些問題,也總結(jié)了一些經(jīng)驗?,F(xiàn)就C語言課程的教學(xué),淺談幾點個人體會,僅供大家借鑒。
1由實驗入手,培養(yǎng)學(xué)生的學(xué)習(xí)興趣
“C語言程序設(shè)計”課程是學(xué)生所接觸的第一門計算機編程方面課程,所以很多老師采用理論教學(xué)2周后開始上機實踐,從介紹C語言的語法算法開始,然后講書寫程序,最后進入程序調(diào)試的教學(xué)過程。由于程序設(shè)計語言貫穿于由設(shè)計算法到書寫程序與調(diào)試運行的一連串過程,復(fù)雜且抽象,再加上有些學(xué)生的邏輯思維能力不強,這也就是導(dǎo)致部分學(xué)生在上課伊始反映C語言難懂、難學(xué)的主要原因。
在學(xué)習(xí)之初,教師應(yīng)注意教學(xué)的方式方法,要設(shè)法調(diào)動學(xué)生的學(xué)習(xí)興趣,教學(xué)過程才不會枯燥無味?!癈語言程序設(shè)計”課程的核心是將現(xiàn)實中的數(shù)學(xué)問題轉(zhuǎn)化為具體的C源程序,并調(diào)試實現(xiàn),因此第一次課最好定為實驗課。通過給出幾個簡單且學(xué)生熟悉的數(shù)學(xué)問題以及它們所對應(yīng)的C語言程序源代碼,邊介紹程序運行平臺(如Turbo C, VC++等)的操作邊指導(dǎo)學(xué)生自己編輯調(diào)試,觀察運行結(jié)果。當(dāng)程序成功的輸出結(jié)果時,學(xué)生對這門課的學(xué)習(xí)興趣自然產(chǎn)生了。在此基礎(chǔ)上,教師可對程序進行一些簡單的修改,使程序輸出不同的結(jié)果,并解釋原因,然后提出新問題,讓學(xué)生參與思考。第一堂課通過實驗教學(xué),使學(xué)生明白如何分析并解決實際問題,完成從數(shù)學(xué)邏輯到計算機語言程序的轉(zhuǎn)變,從而逐漸培養(yǎng)學(xué)生對程序設(shè)計的興趣。
2教學(xué)中應(yīng)避免過分強調(diào)某些容易引起副作用的知識細節(jié)
一般而言,C語言是高校所開設(shè)的第一門程序設(shè)計課程,所以學(xué)生一般都沒有計算機語言的基礎(chǔ),對計算機語言的認識也非常有限,很多基本概念都不知道。由于C語言牽涉到的概念比較復(fù)雜,規(guī)則繁多,使用靈活,容易出錯,所以在C語言教學(xué)過程中,要應(yīng)該要遵循由易到難,抓主要矛盾的原則,加強對學(xué)生C語言基礎(chǔ)知識、基本運算的強化練習(xí)的同時又不拘泥于某些易產(chǎn)生副作用的細節(jié)。例如在介紹C語言自加自減功能時,假設(shè)有程序:
main()
{int i=5,j=5,p,q;
p=(i+ +) + (i+ +) + (i+ +);
q=(+ +j) + (+ +j) + (+ +j);
printf(“p=%d,q=%d,i=%d,j=%d”,p,q,i,j);}
程序結(jié)果卻是p=15,q=24,i=8,j=8 。為什么是這個結(jié)果呢?這對于初學(xué)者來說很難理解。因為這里產(chǎn)生了有關(guān)自加自減運算副作用功能。對p=(i+ +) + (i+ +) + (i+ +)而言,應(yīng)理解為三個i相加,故p=15。然后i的值自加1三次,故i=8; 對于q則不然,q=(+ +j) + (+ +j) + (+ +j)應(yīng)理解為j先自加1三次后值為8,三個8相加后值為24,j的最后值為8。
所以說,教師在介紹C語言自加自減運算功能時,一定要加強與其相關(guān)的基本知識點的教學(xué)及運用,不宜強調(diào)與上例類似的易產(chǎn)生副作用功能的程序。
同樣,在介紹C函數(shù)調(diào)用時,也應(yīng)該避免向?qū)W生介紹如下程序:
main()
{ int i=2, p;
p=f(i, + +i);
printf(“%d”, p);}
int f(int a, int b)
{ int c;
if(a>b) c=1;
else if(a==b) c=0;
else c=-1;
return (c);}
為什么最后程序結(jié)果是1而不是-1呢?這是因為Turbo C下printf( )函數(shù)參數(shù)的求值順序是自右向左的。介于C語言中有些細節(jié)牽涉到的副作用問題很多,教學(xué)時不必在每個細節(jié)上過于死摳,應(yīng)把教學(xué)精力放在最基本、最常用的那些部分,待學(xué)生有一定基礎(chǔ)后再深入到一些非主要的細節(jié)上。C語言有些細節(jié)是需要學(xué)生通過長期實踐才能熟練掌握的。教學(xué)過程中切忌過早的向?qū)W生反復(fù)強調(diào)C語言中某些容易引起錯誤的細節(jié),例如:+ +和- -運算符的副作用,邏輯表達式中的“邏輯短路”問題,Turbo C平臺下printf( )函數(shù)中由右至左的參數(shù)輸出原則等。
現(xiàn)在大多數(shù)高校的計算機課程都是采用多媒體教學(xué)方式,在C語言每堂課上,教師可以先在投影上以關(guān)鍵詞的形式列出本次課所要涉及到的基本知識點,在強化學(xué)生對基本知識點學(xué)習(xí)的同時,簡單的介紹一下在該知識點的使用上可能會產(chǎn)生的某些副作用。久而久之,學(xué)生在掌握C語言基本概念的同時又不拘泥于某些知識細節(jié)的副作用。
3階梯法舉例
為培養(yǎng)學(xué)生的學(xué)習(xí)興趣,大部分教師在C語言教學(xué)過程中,都不一味地按書本去講,而通過多舉些實際的例子來鞏固學(xué)生所學(xué)習(xí)的知識點。但是教師對所教授的知識點如何舉例,例子的難度如何,學(xué)生能否從所舉的例子中更好的掌握相應(yīng)的理論知識等一系列問題卻擺在教師面前。筆者在三年多的C語言教學(xué)實踐中采用階梯法舉例方式,取得了不錯的教學(xué)效果。
階梯法舉例是指在課堂上把同類型問題歸結(jié)出來,將這些問題按難易程度排列舉例,讓學(xué)生從理解最簡單的例子開始,按照由易到難的順序依次理解所學(xué)知識點。例如在講述C語言中求若干數(shù)中最大值的知識點時,舉出:
第一層問題:2個數(shù)的最大值求法
第二層問題:3個數(shù)的最大值求法
第三層問題:4個數(shù)的最大值求法
第四層問題:n個數(shù)(4個數(shù)以上)的最大值求法
第一層問題的解決:采用簡單if語句
main( )
{ int a,b,max;
scanf(“%d%d\”,a,b);
if(a>b) max=a; else max=b;
printf(“max=%d\”,max);}
第二層問題的解決:采用簡單if-else復(fù)合語句
main( )
{int a,b,c,max;
scanf(“%d%d%d\”,a,b,c);
if(a>b) max=a;
else if(c>b) max=c;
else max=b;
printf(“max=%d\”,max);}
第三層問題的解決:采用條件語句加上if語句
main( )
{int a,b,c,d,max;
scanf(“%d%d%d%d”,a,b,c,d);
max=(a>b)?a:b;
if(max if(max printf(“max=%d\”,max);} 第四層問題的解決:采用一維數(shù)組比較方式 main( ) { int a[4],max, i ; for(i=1;i<4;i++) scanf(“%d”,a[i]); max=a[0]; for(i=1;i<4;i++) if(a[i]>max)max=a[i]; printf(“max=%d\”,max);} 這樣通過階梯法舉例教學(xué),學(xué)生對同類問題的解決有了比較深刻的認識。這樣使不同程度的學(xué)生,尤其是學(xué)習(xí)有困難和問題較多的學(xué)生,都能夠得到提高和發(fā)展。階梯法舉例的主要特點是目標(biāo)具體,升級適度,符合學(xué)生的心態(tài),使學(xué)生有成就感,形成積極向上的學(xué)習(xí)態(tài)度。 4強調(diào)程序語法規(guī)則,淡化程序算法設(shè)計思想 C語言語法規(guī)則繁多,且使用靈活,很容易出錯。這樣使得學(xué)生調(diào)試程序過程變得更難。因此,教師在C語言的教學(xué)過程中,一定要強調(diào)C語言中語法細節(jié)問題,把一些經(jīng)常會犯的錯誤總結(jié)出來,例如在C語言里,賦值運算符是“=”,而“==”是關(guān)系運算符的相等比較,但是很多學(xué)生在編程時經(jīng)常會誤把“==”當(dāng)成“=”;對于算數(shù)運算符“/”,當(dāng)兩個整數(shù)相除時結(jié)果是整數(shù)商而不一定是實際的結(jié)果;在判斷語句中,例如if (a = 1),因為“=”是賦值操作,括號中的條件則會永遠為真,程序在編譯時不會提示有錯,可以編譯通過,但這明顯不是所要的結(jié)果等。以上這些語法細節(jié)和現(xiàn)實中的數(shù)學(xué)問題是不一樣的,對于初學(xué)者而言,教師在授課時一定要強調(diào)語法細節(jié),避免出現(xiàn)不必要的錯誤。 任何語言程序在組織結(jié)構(gòu)上都遵循一定的算法,算法是程序設(shè)計的靈魂。好的算法能使程序運行高效。但是算法在講授C語言程序設(shè)計課程中所占地位如何卻是有爭議的。根據(jù)筆者的教學(xué)體會,認為C語言的教學(xué)過程中應(yīng)該強調(diào)程序語法,淡化程序算法。淡化算法并非忽視算法,只是在完成某一程序的同時不必過分強調(diào)其別的算法的實現(xiàn)。例如在講授一維數(shù)組中的冒泡排序問題時,應(yīng)避免強調(diào)各種不同的其它排序算法(例如插入排序,二分排序,快速排序等),因為“C語言程序設(shè)計”課程本身的性質(zhì)是專業(yè)基礎(chǔ)課程,是以后所開設(shè)的“數(shù)據(jù)結(jié)構(gòu)”、“算法設(shè)計”等專業(yè)課程的先行課,其重點是放在語法的使用上,及如何運用C語言編寫簡單程序。至于有關(guān)程序算法的研究和實現(xiàn),可以放在“數(shù)據(jù)結(jié)構(gòu)”、“算法設(shè)計”等專業(yè)課程中。加之C語言通常是學(xué)生所接觸的第一門語言設(shè)計課程,大多數(shù)學(xué)生是沒有算法設(shè)計基礎(chǔ)的,教學(xué)中淡化算法可以使學(xué)生集中精力消化C語言本身,取得不錯的聽課效果。當(dāng)然,在講授某一具體程序?qū)嵗龝r,首先要給出程序的算法流程圖(這一塊讓學(xué)生完成是不適宜的),然后著重強調(diào)程序的語法組織結(jié)構(gòu),至于程序所采用的算法思想可以簡單介紹一下,不必作過多研究,也不必討論有關(guān)該算法所實現(xiàn)程序的效率。課后布置學(xué)生完成的程序(例如求兩數(shù)公約數(shù)、公倍數(shù)等程序),教師一定要事先給出算法流程圖,以程序最終能否調(diào)試運行為考核標(biāo)準(zhǔn),不宜追求程序算法實現(xiàn)的難易程度。 5傳授編程技巧,養(yǎng)成良好的編程規(guī)范,培養(yǎng)學(xué)生獨立調(diào)試程序的能力 C語言是一門實踐性相當(dāng)強的課程,上機實驗是C語言教學(xué)的重要組成部分,針對不同的學(xué)習(xí)對象和學(xué)習(xí)要求布置好上機作業(yè)是教學(xué)成功的重要保證。教學(xué)中,教師應(yīng)該傳授學(xué)生一些編程技巧,例如一些典型數(shù)學(xué)問題的運用等,讓學(xué)生學(xué)會如何熟練應(yīng)用C語言行動編程。由于C語言語句書寫靈活,教師在實驗課上應(yīng)重視學(xué)生書寫程序規(guī)范問題。例如,強調(diào)變量命名應(yīng)顧名思義,一行只書寫一條語句,每一小段程序要有中文注釋等。養(yǎng)成這些良好的編程規(guī)范對學(xué)生今后從事軟件開發(fā)工作是大有裨益的。此外還應(yīng)引導(dǎo)學(xué)生多讀程序,多編程序,多上機調(diào)試程序。當(dāng)然,教師光教會學(xué)生如何編寫程序還遠遠不夠,教會學(xué)生如何高效地調(diào)試程序也是很重要的一點。由于學(xué)生第一次接觸語言設(shè)計課程,編寫一個程序,無論大小,最初不可能一點錯誤都沒有,無論是出現(xiàn)語法錯誤還是邏輯錯誤,哪怕是一點筆誤,編譯器都會報錯。在這里,教師應(yīng)發(fā)揮學(xué)生的自主能力,指導(dǎo)學(xué)生如何根據(jù)編譯器所報錯誤的類型找到程序中出錯的地方,并加以改正。而非學(xué)生在編寫程序時一發(fā)生錯誤教師就越俎代庖,幫學(xué)生解決問題?!笆谥詽O,則享其生”,這個環(huán)節(jié)尤其重要,否則讓學(xué)生養(yǎng)成了依賴心理,對學(xué)生今后的職業(yè)發(fā)展是不利的。 最后教師在實驗課中,應(yīng)該把一些常用的程序調(diào)試方法總結(jié)出來,教給學(xué)生,讓他們自己去學(xué)習(xí)如何找錯糾錯,最后把程序運行成功。學(xué)生只有通過反復(fù)上機操作,在教師的指導(dǎo)下找錯糾錯,才能對C語言有更深、更全面的認識和理解,逐步提高實際操作和學(xué)習(xí)的能力。 總之,在C語言實踐教學(xué)中,就是要讓學(xué)生養(yǎng)成良好的編程規(guī)范,培養(yǎng)學(xué)生獨立調(diào)試程序的能力。 6采取多元化的考核方式 為了保證課程的教學(xué)質(zhì)量,課程的考核方式也很重要。要想真正科學(xué)全面的考查學(xué)生是否建立了嚴(yán)謹?shù)某绦蛟O(shè)計思想,是否具備一定的上機編程能力,必須采用多元化的考核方式,針對C語言中不同的知識類型采取不同的考試形式。如:考查C語言中常識性的知識可以采用閉卷考試形式;考查學(xué)生知識轉(zhuǎn)化能力、應(yīng)用能力等可以采用開卷考試形式;考查學(xué)生的程序調(diào)試、改錯等可以采用上機考試。當(dāng)然在課程教學(xué)的同時,鼓勵學(xué)生積極參加與該門課程內(nèi)容相關(guān)的全國計算機等級考試(二級C語言),獲取證書,并宣布通過二級考試可以代替該課程的學(xué)期總成績,以激發(fā)學(xué)生們的學(xué)習(xí)興趣。這樣,學(xué)生們?yōu)榱四転榻窈缶蜆I(yè)增加籌碼,確定了學(xué)習(xí)目標(biāo)。 7結(jié)束語 以上是筆者三年來C語言教學(xué)中的一點心得體會,在教學(xué)過程中應(yīng)注意的問題還是有很多的,但是關(guān)鍵在于對教學(xué)內(nèi)容(教什么)和教學(xué)方法(如何教)的合理組合,是否能調(diào)動學(xué)生學(xué)習(xí)的積極性。在具體的教學(xué)過程中,只要教師能理解C語言本身的特點,有比較豐富的實踐經(jīng)驗,并在教學(xué)中采取相應(yīng)的措施與教學(xué)手段,一定能取得理想的教學(xué)效果。 參 考 文 獻 [1] 譚浩強. C語言程序設(shè)計(第三版)[M]. 北京:清華大學(xué)出版社,2006. [2] 方少卿. C語言程序設(shè)計[M]. 北京:中國鐵道出版社,2007. [3] 程奎文. C語言教學(xué)方法探析[J]. 科學(xué)時代,2006,(12):111-112.