宋建萍
【摘 要】C語言語法豐富、結(jié)構(gòu)靈活、功能強大,應(yīng)用領(lǐng)域較為廣泛。但也因為較為抽象,對初學(xué)者來說,難以透徹理解和掌握,導(dǎo)致不能達(dá)到學(xué)以致用的目的。本文以“循環(huán)結(jié)構(gòu)程序設(shè)計”教學(xué)內(nèi)容為例,選用適合的教學(xué)方法,對較為抽象的知識點,采用趣味形象的案例進(jìn)行導(dǎo)入,易于被學(xué)生理解和接受,也調(diào)動了學(xué)生的學(xué)習(xí)興趣;由淺入深,循序漸進(jìn),啟發(fā)和培養(yǎng)學(xué)生的計算思維,幫助學(xué)生理清編程思路,快速入門和提高,從而有效地提高C語言課堂的教學(xué)效率。
【關(guān)鍵詞】C語言;循環(huán)結(jié)構(gòu)程序設(shè)計;案例;計算思維
0 引言
C語言作為一門計算機編程語言,自1978年面世至今,仍非常流行,這源于它“語法簡潔、數(shù)據(jù)類型及運算符豐富、結(jié)構(gòu)表現(xiàn)力好、能面向底層系統(tǒng)開發(fā)和上層應(yīng)用”等諸多優(yōu)點。因此,不同高校的許多非計算機專業(yè),特別是理工類專業(yè),都把C語言作為一門必修的計算機公共基礎(chǔ)課程來開設(shè);在全國計算機等級考試的二級科目中,“C語言程序設(shè)計”也是報考人數(shù)較多的考試項目。
C語言如此熱門,但對于對非計算機專業(yè)的學(xué)生而言,想學(xué)好這門編程語言,也非易事。究其原因,主要源于以下方面:
(1)課程學(xué)時壓縮,教師的課堂授課容量有限,而課程內(nèi)容多、難點多,學(xué)生僅靠有限學(xué)時,難以達(dá)到系統(tǒng)學(xué)習(xí)的目的。
(2)課程中許多內(nèi)容較為抽象,理解起來有一定難度,教師授課中能否做到形象生動、深入淺出,也會影響學(xué)生的學(xué)習(xí)興趣和吸收效率。
(3)對語句及程序結(jié)構(gòu)、執(zhí)行流程缺乏細(xì)致理解,對問題的抽象計算思維能力難以形成,從而導(dǎo)致編程解題困難,導(dǎo)致對該門語言的學(xué)習(xí)流于“皮毛”而無法學(xué)以致用。
以上種種原因,都影響著C語言課程的教學(xué)效果。在教學(xué)中常常出現(xiàn)的現(xiàn)象是:多數(shù)學(xué)生剛開始學(xué)習(xí)的時候熱情挺高,當(dāng)遇上“循環(huán)”、“數(shù)組”、“指針”等一些較為抽象的難點,就像遇到了難以跨越的高門檻,逐漸產(chǎn)生的畏難情緒導(dǎo)致中途放棄,能夠以較大的學(xué)習(xí)熱情堅持到課程結(jié)束、且掌握及運用情況較好的學(xué)生比例并不多。因此,在教師的教學(xué)中,將課程的學(xué)習(xí)特點與學(xué)生的認(rèn)知規(guī)律有效結(jié)合,調(diào)動學(xué)生的學(xué)習(xí)積極性,針對教學(xué)中學(xué)生普遍認(rèn)為的難點內(nèi)容,靈活運用多種教學(xué)方法,啟發(fā)學(xué)生的思維,讓學(xué)生在C語言的學(xué)習(xí)過程中體會到學(xué)習(xí)的目標(biāo)性、求解問題的興趣感和能解決問題帶來的成就感,保持學(xué)習(xí)的動力和熱情,避免“教”與“學(xué)”脫節(jié)變成兩張皮,才能有效地保障C語言課程的教學(xué)效果。
1 C語言難點及教法分析,以循環(huán)為例
C語言學(xué)習(xí)過程中,學(xué)生的疑難知識點較多,在結(jié)構(gòu)化程序設(shè)計部分,“循環(huán)結(jié)構(gòu)”相較“順序結(jié)構(gòu)”和“分支結(jié)構(gòu)”而言,較為抽象,雖然語句簡潔,但運用靈活,需要加強理解并進(jìn)行問題抽象和算法設(shè)計思維訓(xùn)練。學(xué)生學(xué)習(xí)的過程中,容易在這一關(guān)上卡住。因此,循環(huán)結(jié)構(gòu)也被視為學(xué)習(xí)C語言的第一道門檻。那么,教師作為學(xué)生學(xué)習(xí)的引導(dǎo)者,如何進(jìn)行知識的導(dǎo)入,才能讓“循環(huán)”從抽象變?yōu)樾蜗?,從而更容易被學(xué)生理解和接收呢?
(1)欲用循環(huán)進(jìn)行編程,概念理解應(yīng)先行。
“循環(huán)結(jié)構(gòu)”學(xué)習(xí)之初,“循環(huán)”的概念需要溫習(xí)。生活中常見的循環(huán)的例子有很多,比如,每年春夏秋冬四季的輪回、每天的日出日落、大自然中水的循環(huán)、早晨我們圍著操場轉(zhuǎn)圈跑步,等等。教師著重通過這些例子,引導(dǎo)學(xué)生認(rèn)識到循環(huán)的本質(zhì),即:循環(huán)表達(dá)的是一組重復(fù)進(jìn)行的過程;這組過程的重復(fù),往往是有條件、可終止的。用C語言編程來表達(dá)一組重復(fù)過程的進(jìn)行,有專門的循環(huán)語句,也是針對有條件、能夠終止的循環(huán)。
(2)語句的理解是運用之本,注重其結(jié)構(gòu)與流程。
循環(huán)語句的學(xué)習(xí),以“while語句、do-while語句、for語句”這三種基本語句為主。其中,while語句稱為“當(dāng)型”循環(huán),最符合學(xué)生的認(rèn)知規(guī)律;do-while語句同while語句相近,但執(zhí)行流程略有不同;for語句最為靈活而學(xué)生應(yīng)用最易出錯。因此在循環(huán)語句的教學(xué)上,若從while語句的學(xué)習(xí)和運用開始,引入一些趣味性的編程示例,能夠幫助學(xué)生快速理解和領(lǐng)會循環(huán)語句的基本用法。
例如,經(jīng)過前面課程內(nèi)容的學(xué)習(xí),學(xué)生對輸出“Hello,world!”的程序已經(jīng)非常熟悉,換一種情境,假如一個男孩要向心愛的女孩表白,羞于開口,借程序表達(dá)。則對程序語句稍作變換,輸出“I love you, girl!”。基礎(chǔ)程序如程序1所示。
程序1:
#include
void main()
{
printf(“I love you, girl?。躰”);
}
學(xué)生已非常清楚程序的輸出是“I love you, girl!”。一句表白不足以表達(dá)愛慕的心意,因此男孩又對程序1作了修改,如程序2所示。
程序2:
#include
void main()
{
while( 1 )
{
printf(“I love you, girl! \n”);
}
}
僅僅加了while(1)這個部分,程序的輸出結(jié)果令學(xué)生大感意外和驚嘆,學(xué)生通過此例,感受到了循環(huán)語句的強大表現(xiàn)力。由此引出while語句的語法結(jié)構(gòu),介紹“當(dāng)型”循環(huán)的特點,指出“循環(huán)條件”和“循環(huán)體”這兩個關(guān)鍵組成部分,及語句的執(zhí)行流程。程序2的輸出是無限次的,若要限制輸出的次數(shù),則可引入一個控制次數(shù)的變量,因此再次修改程序,引入一個能夠控制循環(huán)次數(shù)的變量,變化如程序3所示。
程序3:
#include
void main()
{ int i = 1;
while( i <= 10 )
{
printf(“I love you, girl! \n”);
i = i + 1;
}
}
則程序3的輸出得到了有限次的控制。在這個程序中,注意引導(dǎo)學(xué)生分析變量i的相關(guān)部分:i的起始值設(shè)置、i值滿足的條件以及i的值是如何變化。i的取值決定著循環(huán)能否執(zhí)行下去,因此它可視為循環(huán)的控制變量。
(3)循環(huán)過程需抽象,計算思維應(yīng)強化。
前面例舉的編程問題,因為重復(fù)執(zhí)行的過程簡單直接,較易被學(xué)生認(rèn)識和接受。但在實際編程問題中,其求解過程能否用循環(huán)語句來表達(dá),需要結(jié)合問題中數(shù)據(jù)的處理要求,仔細(xì)分析求解過程是否具備可重復(fù)計算處理的規(guī)律,若有,則可進(jìn)一步提煉出重復(fù)的過程有哪些操作、重復(fù)的條件是什么,找出這兩個關(guān)鍵的要素,再使用循環(huán)語句表達(dá),并結(jié)合重復(fù)過程前的數(shù)據(jù)狀態(tài)給出循環(huán)前的初始狀態(tài)表示。這個問題分析和數(shù)據(jù)處理的計算過程的抽象,就是對學(xué)生的計算思維進(jìn)行訓(xùn)練和強化運用的過程。
以計算1+2+3+…+100為例,這個問題如何抽象成一組可重復(fù)進(jìn)行的計算過程?若結(jié)合學(xué)生日常生活中存錢的例子,則抽象過程會變得比較生動有趣、易于理解。假設(shè)某學(xué)生要攢錢買電腦,制定了一個100天攢錢行動的計劃并堅持實施,分析其實施過程:
儲錢罐s,初始為空,即s=0;
第1天,往儲錢罐中投1元錢,則s中的變化為:0+1=1,即s=s+1;
第2天,往儲錢罐中投2元錢,則s中的變化為:1+2=3,即s=s+2;
第3天,往儲錢罐中投3元錢,則s中的變化為:3+3=6,即s=s+3;
……
第i天,往儲錢罐中投i元錢,則s中的變化為:s=s+i;
……
第100天,往儲錢罐中投100元錢,則s中的變化為s=s+100;
第101天,計劃完成,收手。砸破儲錢罐數(shù)錢,則s里的總錢數(shù)就是1+2+3+…+100的和,已能買到一部性價比不錯的電腦。
分析此實施過程,就是在重復(fù)地往儲錢罐投錢。試著讓學(xué)生提煉重復(fù)的操作,很顯然有:s=s+i;,而i也在變化,是怎么變化的?經(jīng)過觀察,每一天里,i的值都是在前一天i值的基礎(chǔ)上增加1,則可表示為:i=i+1;。每一天的過程里,都是這兩條:s=s+i; i=i+1;,從而形成重復(fù)的過程。重復(fù)的條件是什么?根據(jù)計劃制定和實施的天數(shù)是100天,超出100天則停止。因此可根據(jù)i的取值來定重復(fù)的條件i<=100。則用循環(huán)語句可表示為:
while( i <= 100 )
{ s = s + i ; i = i + 1; }
分析s和i的初始狀態(tài),可在while循環(huán)之前加上:s=0; i=1;。則完整的程序表達(dá),即為程序4。
程序4:
#include
void main()
{ int s = 0, i = 1;
while( i <= 100 )
{
s = s + i; i = i+1;
}
}
1+2+3+…+100的計算過程抽象,是一個頗具代表性的例子。以這類問題的抽象過程為基礎(chǔ),另有如:1~100的偶數(shù)和、1+1/2+1/3+…+1/100計算、以及格里高利公式求解圓周率等類似的一些迭加計算的問題,可在此基礎(chǔ)上加強分析過程的訓(xùn)練,促使學(xué)生建立起數(shù)據(jù)分析和抽象、及抽象求解過程的計算思維能力,形成對一類問題求解方法的認(rèn)知,并強化編程表達(dá);然后逐步擴展、加入其他抽象類問題,再進(jìn)行抽象分析的思維訓(xùn)練并強化編程。抽象思維分析訓(xùn)練和編程強化語言運用雙重過程相結(jié)合,反復(fù)進(jìn)行,從而加強學(xué)生運用循環(huán)結(jié)構(gòu)進(jìn)行程序設(shè)計的能力訓(xùn)練。此外,教師結(jié)合課堂內(nèi)容,設(shè)計適量的課下編程練習(xí)并及時監(jiān)督和檢驗學(xué)生的學(xué)習(xí)效果,加強學(xué)習(xí)方法溝通和交流,也是十分必要的。
(4)循環(huán)有終止和中止,需要分清楚。
循環(huán)的終止和循環(huán)條件相關(guān),若循環(huán)條件不成立,則循環(huán)終止。而循環(huán)的中止,是指循環(huán)的循環(huán)體正在執(zhí)行過程中,因其他條件不成立而中途停止。中止分兩種情況:一種是停止后不再回來執(zhí)行循環(huán),用break;,一種是停止當(dāng)前一次循環(huán)后再進(jìn)行下一次循環(huán),用coninue;。具體運用,也可結(jié)合日常生活中的例子進(jìn)行舉例。
例如:班上某同學(xué)某學(xué)期上課,正常情況下,從1周上到19周,但第8周時因生病請假,第9周繼續(xù)回來上課,此時就可表達(dá)為:
i = 1;
while( i <= 19 )
{
printf( “第%d周,正常上課”, i );
if( i == 8 ) { printf(“第%d周,病假”, i); continue; }
i++;
}
若該同學(xué)的病需要長期住院,導(dǎo)致從第8周開始的課全部請假,則需用break;,語句表達(dá)為:
i = 1;
while( i <= 19 )
{
printf( “第%d周,正常上課”, i );
if( i >= 8 ) { printf(“第%d周后,長期病假”, i); break; }
i++;
}
簡單的示例有助于幫助學(xué)生快速理解相關(guān)語句的用法,加深對語句功能印象,再結(jié)合其他編程實例進(jìn)一步加強對這些語句的運用,起到融會貫通的效果。
另外,嵌套循環(huán)的流程理解對學(xué)生來說,也是一個難點。在充分理解了單層循環(huán)并能熟練運用的基礎(chǔ)上,也可引入貼近生活實際的形象例子,將雙重嵌套的循環(huán)運用起來,結(jié)合實際過程,理解嵌套循環(huán)的流程,結(jié)合典型的編程問題,將嵌套循環(huán)運用于求解過程表達(dá),加強編程應(yīng)用。
2 小結(jié)
在教學(xué)過程中,學(xué)生的“學(xué)”是過程,“學(xué)好”是結(jié)果,“學(xué)好”的標(biāo)準(zhǔn)是什么?對于一門編程語言來講,則是能理解和掌握語言本身的表達(dá)方式和方法,進(jìn)而能靈活自如地運用這個語言工具來“表情達(dá)意”——即求解實際問題,能夠表達(dá)該問題的具體求解過程。在具體問題的編程上,僅掌握語法的表達(dá)是不夠的,許多較為抽象的問題,還需運用抽象思維分析和設(shè)計問題的求解過程。因此,在教的過程中,針對不同的學(xué)習(xí)內(nèi)容,選擇適合的教學(xué)法,幫助學(xué)生化解疑難點,注重從計算思維上對學(xué)生進(jìn)行啟發(fā)訓(xùn)練,發(fā)現(xiàn)和總結(jié)問題求解的規(guī)律,設(shè)計正確有效的求解算法,加強編程實踐,才能促使教學(xué)相長,讓學(xué)生真正掌握和運用好這門編程語言。
【參考文獻(xiàn)】
[1]譚浩強.C程序設(shè)計(第4版)[M].清華大學(xué)出版社,2010,6.
[2]劉永春.C語言教學(xué)中的難點分析與多種教學(xué)方法的應(yīng)用[J].教育教學(xué)論壇, 2012,10.
[3]孫麗君,楊志強,高枚.圍繞計算思維培養(yǎng)的程序設(shè)計課程改革[J].計算機教育,2013,5.
[4]黎昂,曾力軍,李澤軍.高校非計算機專業(yè)C語言程序設(shè)計教學(xué)方法探索[J]. 課程教學(xué)研究,2012,7.
[責(zé)任編輯:楊玉潔]