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

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