方星星 史國川 施寧 陸軍炮兵防空兵學院
C語言作為一種面向過程的高級語言,能夠使學習者更好地建立起程序設計的基本概念,掌握程序設計的基本理論和常用算法,形成用計算機分析問題、處理問題的能力和科學的思維方法。因此,很多高校至今仍將C語言作為程序設計基礎類課程的教學語言。
由于C語言知識點很廣且分散,在教學過程中筆者發現,不少學生對C語言的概念、程序執行過程一知半解,不能有效區分數據類型、三種循環語句、數組排序、指針概念等,不能全面深入理解字符串處理、遞歸調用、指針引用等難點內容,導致不能熟練掌握它們的應用。同時,C程序設計的學習是循序漸進的過程,章節內容之間是層層遞進的關系,如果學生前期的基礎知識掌握不牢固,會導致后期學習難度加大,從而降低學生的學習興趣。
“聽、說、讀、寫”廣泛應用在語文、外語類課程的教學中,是語言學習必須掌握的四項基本技能,也是語言學習必須遵循的路徑。其實,利用作為一種“語言”的C語言,教師同樣可以培養學生的“聽、說、讀、寫”四種能力,讓學生能聽懂知識點、說得出含義及執行過程,會分析閱讀程序,能熟練編寫程序,以切實打牢學生的編程語言基礎,提高其編程應用能力,從而更好地調動學生學習積極性以及提升課堂教學效率。接下來,筆者分別闡述C語言教學中“聽”“說”“讀”“寫””的含義及實施過程。
在C語言教學中,“聽”是指聽懂知識結構,聽透徹知識點之間的內在聯系,明白基本概念、基本語法、語句執行流程、算法設計等,所以聽懂是學好C語言的前提。為使學生聽懂聽透,首先要求教師會“說”:①要結合初學者的認知規律,遵循“化復雜為簡單、化抽象為具體”的教學原則,優化教學內容,揭示教學主線;②要提煉重難點,對重難點知識一定要講深講透;③要講清章節內容的內在聯系,不僅要告訴學生知識點是什么,而且要介紹C語言中為什么有這些知識,以及如何應用;④要靈活運用案例式、類比式、互動式等教學方法,以提升教學內容的實用性和趣味性;⑤要精簡教學用語,要求學生必須認真傾聽,時刻關注學生課堂聽課效果。
例如,“數據類型及運算”章節中的知識點較多,涉及標識符、常量與變量、數據類型、類型轉換、運算符及表達式等,這些知識點之間內在聯系不緊密。在教學過程中,教師首先要優化內容設計,補充內存結構的內容,并將其提煉為教學主線,通過層層遞進來講解章節內容之間的聯系,重點介紹數據類型及字符常量表示。
“說”指的是讓學生說出C語言的基本概念、執行過程、算法設計過程等,以強化學生對C語言語法、語義的理解。在教學中,筆者發現不少學生課堂中能聽懂知識點,但課后容易忘記,編程時不知從何處下手,更不會靈活應用。通過了解學生會不會“說”,能“說”多少,教師可以從中判斷出學生對知識的理解和掌握情況、學習的成效等,以便及時調整教學策略。在課堂教學實施中,應多強調一些概念,總結一些知識規律,鼓勵學生開口“說”,讓學生加深對知識點的記憶和理解。
例如,在函數教學中,在介紹完參數傳遞的特點后,讓學生“說”出函數調用前、函數調用時、函數調用結束后參數的變化,并結合內存描述出變量的分配過程,以使學生強化對參數種類及參數傳遞的理解。
另外,教師要發揮學生學習主體地位,要求學生在線下定期開展研討交流,鼓勵學生開口“說”出對內容的理解和“說”出自己的學習體會。需要注意的是,C語言中的“說”不等同于背,教師要正確引導學生,切不可讓學生死記硬背語法知識,否則會使課程的教學枯燥無味。
“讀”不同于“說”,“讀”指的是分析程序的能力,需要綜合運用語法知識和程序結構來分析程序,搞清楚程序的結構、程序的輸出以及程序涉及的算法等,其最終目的是深化學生對概念原理的理解和掌握。程序設計過程是問題求解的過程,C語言作為一種面向過程的高級語言,能夠很好地訓練學生的編程思維,因此課程教學目標中需要強調培養學生具備較強的分析問題、解決問題的能力。
因此,在課程教學中,一是要打牢學生在程序結構、語法等方面的基礎,使其具備閱讀程序的能力;二是要讓學生主動思考,能正確分析出程序的運行結果,厘清問題求解的思路和程序本身涉及的算法等,并能創新設計思路;三是要讓學生大量閱讀課外參考書以拓寬知識面,明白知識的由來;四是要鼓勵學生相互閱讀、分析各自編寫的程序,在分享設計思路的過程中提升思維能力,并讓學生多讀經典程序,大量調試程序,要理解他人的解題思路并借鑒吸收。
要強化學生對程序結構和執行過程的認識,使其能快速識別出語句類別和結構,如復合語句、循環嵌套、函數模塊等,便于學生準確、快速閱讀程序。例如,選擇結構中if語句有if、if-else、if-else-if三種形式,在學生理解了語法基礎和執行流程基礎上,引導學生分析三種形式能解決哪些問題,用if-else替代if-else-if會有什么結果,再通過單步調試讓學生直觀感受到冗余的判斷,從而讓學生更好地理解選擇結構的作用,尤其是嵌套if語句結構及執行過程。
同時,程序設計的本質是對內存的分配、輸入、求解和輸出操作。要讓學生結合程序設計的本質,重點分析程序設計的每一個過程,養成畫內存結構圖的習慣,從而形成正確的分析程序方法。例如,在數組學習章節中,通過分步畫出內存結構圖來理解元素在內存中的存儲情況,以及元素的插入、刪除和排序等動態操作。在指針學習章節中,通過不斷分析內存結構圖,來深刻理解變量值和地址的區別,以及指針變量如何間接引用其他變量等,從而加深對指針本質的理解。
另外,要讓學生注重思維層次的訓練,在閱讀程序中逐步提升算法設計能力,理解問題求解的每一個過程。例如,素數的判斷存在多種解法,通過對比分析這些解法,總結出素數判斷的求解思路,加深對for、if、break語句執行流程的理解,提升自身的邏輯思維和計算思維能力。又如,數組的排序有冒泡、選擇、插入等各種排序算法,要求學生理解每一種排序的過程并編程調試,以便深入、全面掌握知識點的應用、程序執行過程和算法的設計,提升自身的計算思維。
“寫”指的是編寫程序,通過編寫程序來解決實際問題。通過學生的作業及課后反饋可以看出,學生能看懂教材內容,也能聽懂課堂教學內容,但不能熟練編寫程序。歸結其原因,是學生沒有充分重視平時的編程訓練,程序編寫量過少。編寫程序的能力能直接體現學習效果,教師可根據學生寫程序能力的高低,及時對學生進行幫扶指導,給出針對性的學習建議,切實提高其編寫程序能力。
實踐教學要圍繞理論知識點展開,并要及時開展課內、課外的編程實踐,以鞏固理論知識點的學習。在課內教學中,教師可采取任務驅動式教學法開展實踐教學,結合在線實踐教學平臺設置5~7道編程實踐題,設計好教學環節,安排好每一個實踐任務時間,再讓學生動手編程實踐和分組討論學習。教師還要及時解決學生在調試程序中遇到的各類問題,要對每一個實踐任務進行總結點評,指出存在的共性問題,總結出問題求解的不同思路。例如,在循環嵌套和輔助控制語句課內實踐教學中,針對性布置九九乘法表、圖形輸出、素數判斷、求區間內素數累加、求十個正數平均值等實踐任務,要求學生編程解決并提交程序源碼。
另外,在教學過程中,教師要提煉各類編寫技巧,總結程序設計的四大步驟——定義、輸入、求解(函數調用)、輸出,要求學生必須按I-P-O過程編寫程序。在教學環節中設置課前測,讓每一名學生都參與程序編寫,以檢驗編寫程序的能力。加強學生平時的訓練,增加編程題的題量,每一章安排5~8道編程題,讓學生課后編程調試,并在OJ平臺(或在線實踐教學平臺)提交運行情況。教師及時在線指導學生,指出程序編寫中的各類問題及注意事項,增強學生寫好程序的信心,使其養成良好的程序設計風格,提升動手實踐能力和創新設計能力。
程序設計基礎課程作為一種“語言”類課程,在教學過程中同樣可以采用“聽、說、讀、寫”教學法。“聽、說”是為了打牢學生C語言基礎,強化對C語言語法、語義的記憶和理解。“讀”是為了拓寬學生的知識面和思維,提高分析問題的能力?!皩憽笔菫榱遂`活運用知識結構,進一步提高分析、解決問題的能力。在教學過程中,教師可采取優化教學設計,讓學生研討交流,讓學生大量分析調試程序、閱讀源代碼和參考書,強化編程實踐等措施來實施“聽、說、讀、寫”教學法,并將其貫穿于教學全過程。