王倩麗
(西安航空學(xué)院 圖書館, 陜西 西安 710077)
C語言程序設(shè)計幾乎是工科類院校各專業(yè)的公共基礎(chǔ)課程,也是應(yīng)用型本科院校理工科專業(yè)學(xué)習(xí)計算機程序設(shè)計的首選課程。它的目標(biāo)是培養(yǎng)學(xué)生的計算機編程思維,積累程序設(shè)計中常用的、經(jīng)典的算法,達(dá)到熟練使用C語言編程,培養(yǎng)分析問題、解決實際問題的能力。由于C語言程序設(shè)計課程內(nèi)容量大,知識點抽象、枯燥, 理解困難,加大學(xué)習(xí)難度,學(xué)生難以上手,削弱了其學(xué)習(xí)興趣,導(dǎo)致學(xué)生參與的意愿削弱,感受不到知識的價值,學(xué)生的編程思想難以培養(yǎng),分析問題解決問題的能力得不到提高。因此,筆者提出C語言程序設(shè)計實踐教學(xué)改革,探索一種以案例分析為主,結(jié)合項目實戰(zhàn),注重培養(yǎng)學(xué)生計算思維、編程思想[1],提高實踐動手能力的教學(xué)方法。
傳統(tǒng)的C語言程序設(shè)計教學(xué)注重知識內(nèi)容的講授,忽略了C語言程序的實際應(yīng)用,使學(xué)生陷入知識的細(xì)節(jié)。雖然經(jīng)過一段時間基礎(chǔ)知識的學(xué)習(xí)和經(jīng)典算法的練習(xí),學(xué)生可以看懂、修改和編寫簡單的程序,但是面對于一個較難的題目或者實際問題,學(xué)生卻難以下手,不會分析問題、聯(lián)系生活實踐解決問題,自主創(chuàng)新[2]的意識更是難以培養(yǎng)。
C語言課程是大學(xué)生入校以來第一門程序設(shè)計語言,對程序的計算思維不理解,沒有制定學(xué)習(xí)目標(biāo)、學(xué)習(xí)計劃,盲目學(xué)習(xí),缺乏主動性。學(xué)生很少從課程的培養(yǎng)目的、培養(yǎng)能力出發(fā),很少考慮這門課程的學(xué)習(xí)對今后課程和工作的影響;沒有一個全面的、正確的認(rèn)識,總覺得能及格就可以了。在學(xué)習(xí)的過程中,學(xué)生缺少前后課程之間的相互聯(lián)系,不能把已學(xué)的課程和現(xiàn)學(xué)課程聯(lián)系起來,從計算機的工作過程出發(fā)來考慮程序的執(zhí)行過程,進(jìn)一步來理解、學(xué)習(xí)C語言程序的結(jié)構(gòu)組成,對本門課程缺乏系統(tǒng)性的認(rèn)識。
課堂傳授以教師講授為主,老師覺得重要的知識點,學(xué)生卻感受不到知識的價值; 主動參與學(xué)習(xí)的意愿和興趣不濃,被動的接受知識;課堂采取“先理論,后實踐”的教學(xué)模式。只有知識內(nèi)容的滿堂灌,學(xué)生的學(xué)習(xí)熱情沒有被調(diào)動,缺乏與學(xué)生的互動交流,難以了解學(xué)生對程序的理解情況。課本講述的內(nèi)容主要是純數(shù)學(xué)的抽象案例,缺乏實際聯(lián)系、實際應(yīng)用,學(xué)生理解比較困難。為了完成教學(xué)任務(wù),追求教學(xué)進(jìn)度,內(nèi)容講得過多,實際操作少,學(xué)生來不及消化和吸收。這種教學(xué)模式下,學(xué)生上課無求知欲、無興趣,部分學(xué)生昏昏欲睡,聽課如聽天書;有的學(xué)生即使認(rèn)真做筆記,課后合上筆記也沒有深刻的印象。這種教學(xué)模式只能引發(fā)淺層學(xué)習(xí),即使學(xué)生對知識點了如指掌,遇到真實的情境卻未必能夠靈活運用。因此,這種教學(xué)模式需要很大程度的改進(jìn)。
傳統(tǒng)的教學(xué)注重基本概念、語法等知識點,教學(xué)內(nèi)容瑣碎化、細(xì)節(jié)化。利用大量課時講解基本概念,如常量、變量、數(shù)據(jù)類型、表達(dá)式等概念,記憶的知識過多,知識過于瑣碎、細(xì)節(jié)化。學(xué)生即使掌握所學(xué)知識點,很難與實際問題聯(lián)系起來,解決問題。學(xué)生碰到問題,無從下手,產(chǎn)生畏難心理,進(jìn)而對課程的學(xué)習(xí)失去興趣。
1946年美籍匈牙利數(shù)學(xué)家馮·諾依曼提出程序存儲原理,程序如同數(shù)據(jù)來處理,并確定了程序存儲計算機的三大組成部件(I/O設(shè)備、存儲器、處理器)和基本工作方法。
計算機與程序設(shè)計的關(guān)系:計算機的工作過程(IPO),輸入(Input):程序用到的數(shù)據(jù);處理(Process);編寫的程序放于存儲器中用于數(shù)據(jù)處理操作;輸出(Output):對處理或計算后的結(jié)果進(jìn)行輸出。C語言結(jié)構(gòu)中定義變量相當(dāng)于計算機分配存儲空間(存儲器);初始化相當(dāng)于輸入設(shè)備;程序處理問題的過程(算法)相當(dāng)于處理器;C語言輸出相當(dāng)于計算機的輸出設(shè)備。
計算機硬件結(jié)構(gòu)與C語言程序基本結(jié)構(gòu)對照關(guān)系,如圖1所示。

圖1
在教學(xué)過程中,教師注重引導(dǎo)、深入淺出地講解,采用啟發(fā)式[3]教學(xué)法來幫助學(xué)生理解程序的邏輯,訓(xùn)練計算思維能力。筆者舉例:求全班50個同學(xué)C語言課程的平均成績及最高分。
首先,先從簡單的題目出發(fā),輸入兩個學(xué)生的成績,求其平均分,其代碼如下。
int score1,score2,aver;
scanf("%d",&score1);
scanf("%d",&score1);
aver=(score1+score2)/2;
其次,提出問題:輸入50個學(xué)生的成績,求其平均分?
寫出代碼為:
int score1,score2,.,score50,aver;
scanf("%d",&score1);
scanf("%d",&score1);
scanf("%d",&score50);
然后,再提出問題:要反復(fù)地進(jìn)行輸入50個同學(xué)的成績,然后累加,這種方法是否合適?計算機的快速、便捷有沒有應(yīng)用?算法太過冗余,降低程序的執(zhí)行效率,有沒有更好的辦法可以解決此問題,我們會想到反復(fù)地進(jìn)行某個操作,利用循環(huán),其代碼為:
int score, I, aver, sum=0;
for (i=0; i<50; i++)
{
Scanf("%d",& score);
Sum=sum + score;
}
aver= sum/50;
然后,問題又來了:如果要進(jìn)行求最高分、排序等其他操作,使用一個變量能不能解決問題?優(yōu)點:用一個score變量通過循環(huán)可以解決以上問題,避免重復(fù),浪費內(nèi)存空間,提高程序的效率;缺點:它只能保存最后一個學(xué)生的成績。要保存大量同類型的數(shù)據(jù),順理成章引出數(shù)組,其代碼為:
int score[50], i , aver, sum=0;
for (i=0; i<50; i++)
{
Scanf("%d",& score[i]);
Sum=sum + score[i];
}
aver= sum/50;
深入淺出,啟發(fā)式教學(xué)能增強課堂趣味性,學(xué)生好理解,容易進(jìn)入學(xué)習(xí)狀態(tài),所學(xué)知識容易掌握,能提高學(xué)生學(xué)習(xí)的興趣和學(xué)習(xí)效果。通過上述過程一步步引導(dǎo)學(xué)生,既鞏固了以前所學(xué)知識內(nèi)容又啟發(fā)了學(xué)生思維,使其容易理解容易學(xué)習(xí)。
依據(jù)人才培養(yǎng)目標(biāo)、教學(xué)大綱、教學(xué)目的及要求,教師設(shè)計、規(guī)劃課堂內(nèi)容[4],選取多個恰當(dāng)?shù)陌咐?以案例分析為重點,結(jié)合項目驅(qū)動深入淺出、啟發(fā)式引導(dǎo),完成整個教學(xué)內(nèi)容。在案例的選取當(dāng)中,要以學(xué)生熟悉的、感興趣的、學(xué)生日常生活相接近的問題,并結(jié)合章節(jié)內(nèi)容將知識點涵蓋其中,具有一定的難度、深度,引導(dǎo)學(xué)生學(xué)習(xí),進(jìn)一步學(xué)習(xí)相應(yīng)的知識點。在學(xué)習(xí)案例的過程中,不斷地積累經(jīng)典算法,學(xué)習(xí)編程思想,學(xué)習(xí)怎樣分析問題、解決問題。課堂堅持“精講多練”,每個案例讓學(xué)生通過特定的事件情景進(jìn)行分析問題、解決實際問題,最終用C語言實現(xiàn),從而培養(yǎng)學(xué)生運用理論知識,了解編程思維,通過動手實踐[5],培養(yǎng)動手能力,符合應(yīng)用型院校人才培養(yǎng)目標(biāo)要求,為培養(yǎng)應(yīng)用型人才打下堅實的基礎(chǔ)。
通過大量的案例分析學(xué)習(xí),學(xué)生積累一定的算法, 了解編程思維,掌握怎樣分析問題、怎樣把實際生活中的問題轉(zhuǎn)換成程序代碼,進(jìn)而解決問題。但是學(xué)生所學(xué)知識點比較零碎、沒有系統(tǒng)性,沒有切身體會到C程序設(shè)計的真正用處。教師在部分章節(jié)具體案例選取中下功夫,設(shè)計案例內(nèi)容與某個總項目有著密切的關(guān)聯(lián)。學(xué)生學(xué)完整個課程后,把相關(guān)案例結(jié)合起來,組合成一個總項目。通過整個項目完成,學(xué)生能看到具體的效果,切身體會,獲得成就感;學(xué)生不僅加深和鞏固了所學(xué)知識點,把前面學(xué)習(xí)的比較瑣碎的知識串聯(lián)起來,而且更加有條理、對C程序設(shè)計這門課程有了系統(tǒng)的深刻的認(rèn)識,從而學(xué)會分析問題、思考解決問題及動手編寫程序的能力。
通過案例分析教學(xué)+項目驅(qū)動,學(xué)生不僅掌握了知識點的學(xué)習(xí),而且遇到問題學(xué)會分析,思考解決問題的方案,畫流程圖,轉(zhuǎn)換成程序代碼,調(diào)試驗證結(jié)果,理論結(jié)合實踐,用學(xué)到的理論知識解決實踐問題,學(xué)生體會到知識的價值、學(xué)習(xí)的收獲,能積極主動參與,從而培養(yǎng)其分析問題、解決問題的能力。