◆戴佐倩 張霞 楊偉
C語言是一門常用的計算機語言,它的功能豐富,表達能力強,使用靈活方便,應用面廣,目標程序效率高,可移植性好,兼具高級語言與低級語言的優點,因而特別適用于編寫系統軟件[1]。對于計算機專業學生以及想要在計算機行業工作的學生來說,C語言是必須要掌握的語言之一。筆者在本科院校和大專高職院校教授C語言4年,結合學習以及教授C語言的實踐,談一些經驗和想法。
大學生的抽象思維幾乎全部形成,同時也有著豐富的數學、物理、英語、語文等其他學科知識,在講授新課的時候會相對輕松。但同時C語言對于大學生來說也是一門全新的課程,在講授過程中也存在很多的問題。
筆者通過與學生的交流發現,很多學生在學習C語言課程時,目的僅僅是為了能夠拿到計算機二級等級證書,對于C語言的學習沒有濃厚的興趣。由于一開始學習動機并不是很強烈,大部分學生不能夠做到上課前預習、下課后復習,因此,教師在講課的時候要注意學生學習興趣的培養,并且注重課后作業的布置以及課前的鞏固復習。
C語言語法知識點較多,規則繁雜,相對抽象,相關概念與知識點容易混淆。如:1)位運算符‘&’‘|’與邏輯運算符‘&&’‘||’容易混淆;2)賦值運算符‘=’和‘==’不好區別;3)字符串和字符變量容易混淆;4)i++和++i等;5)字符串和字符的區別;6)getchar()、gets()、fgets()和putchar()、puts()、fputs()。如果一開始學習的時候,學生沒有弄清這些知識點,往往會在C語言后續學習過程中(如編程、運算時)出現問題。因此,教師在講到這些知識點的時候,要注意區分。
受傳統教學模式的影響,教師在授課的時候往往會把課堂完全變成講授型的課堂,采用“填鴨式”的教學模式,學生被動接受知識。同時,教師在講課時過分關注理論知識的傳授,而很少關注學生的實踐練習,即使是在僅有的幾節實踐課上,學生想干什么就干什么,沒有明確的實踐目的和實踐要求。因此,很多學生在做題目的時候還能得心應手,但是涉及相關實踐操作時,就會缺乏思路,無從下手。
在教學中,教師可以舉一些生活中的例子來幫助教學,通過一個個比較形象的例子,幫助學生理解一些難懂的知識點。如在對變量進行賦值時,學生很難理解變量定義后一定要先賦值才能使用。在教學過程中,筆者參照王曙霞老師的方法,向一個空的粉筆盒里放一支粉筆,問學生:“盒子里面有幾只粉筆?”學生都說有一支(0+1)。然后把粉筆盒放在身后增加幾支粉筆,再拿到學生面前,往里面放了一支,問他們:“現在有幾支粉筆?”學生都說不知道,因為不知道一開始有幾支粉筆。同樣,如果變量一開始沒有給其賦初值,在對變量進行相關操作后,變量的值依然不能確定。采用這個簡單的例子,學生就理解了為什么變量一定要賦初值。
再如在學習指針的時候,學生不明白什么是間接存取,筆者認為可以舉如下例子:如果想要打開一扇門,我們可以直接把鑰匙帶在身上,然后直接用鑰匙打開門;也可以為了安全,不把鑰匙放在身上,而把它放在其他柜子里面,當要打開那扇門的時候,我們不是直接去找鑰匙,而是去找柜子,然后把柜子打開取出鑰匙,再用鑰匙打開門,而C語言中的指針就是采用這種間接存取的方式。
奧蘇貝爾在其最有影響力的著作《教育心理學:一種認識觀》的扉頁上寫道:“假如讓我把全部教育心理學歸結為一條原理的話,我會說:影響學習的最重要的因素,就是學習者已經知道了什么。要探明這一點,并據此進行教學。”[2]因此,教師在上課的時候應該充分利用學生已有的知識來幫助他們掌握新的知識。例如,編寫“判斷一個數是否為素數”的C語言程序時,教師可以先提問學生:在數學上什么是素數?(素數又稱質數,指一個大于1的,除了1和它本身外,不能被其他自然數整除的自然數。換句話說,只有兩個正因數——1和本身——的自然數即為素數。)具體怎么操作?根據數學上的計算,就是用1到該數之間的所有自然數(1和該數除外)去除這個數,如果其中出現一個數字能夠除后沒有余數,說明這個數字不是質數;但是如果所有的數字除后都沒有余數,則說明這個數字是素數。這樣,在與學生原有的數學知識相結合之后,這個程序就變得容易理解了。
在教學過程中,教師應將理論講解與實踐操作聯系在一起,可采用“兩節理論課+兩節上機課”的方式安排課程。每講完一章知識點,布置通過不同方法實現相關程序的實踐練習,讓學生在實踐課上完成。有了一定的任務,學生在實踐操作課中就會變得積極,而不再是無所事事。例如,可以在上完第一章中“求兩個數中較大者”的程序之后,布置學生編寫一個程序來完成求三者之間的最大者的程序。再如,可以在完成“求兩個數的最大公約數”的基礎上,讓學生思考如何編寫完成“求兩個或者三個數的最小公倍數”的程序。這樣,學生通過自己的主動積極的思考,不僅可以加深對教師所講程序的理解,還可以促進知識的正向遷移,養成學生積極編程的良好習慣。再者,教師在講完一些習題之后,可以鼓勵學生在上機課上通過計算機來檢驗答案的正確性,培養學生的信息素養。筆者發現,通過自己動手編程后,學生發現編程并沒有想象中那么難,而是很有趣,從而達到培養學生編程興趣的目的。
C語言是一種計算機編程語言,一般院校的學生在學習C語言這門課程之前可能已經有VB語言的基礎,或者計算機的其他簡單的知識。因此,教學時可以利用新舊知識之間的關系來幫助他們理解,利用VB中的原有知識的可辨別性加以區別新舊知識。例如,在C語言中學習選擇語句、循環語句的時候,學生已經有了VB基礎,這個時候可以采用比較組織者,把VB中的if語句和while,for循環語句的格式列在黑板旁邊,通過與C語言中對應語句的相互區別,讓學生知道兩種語言中的語句在格式上存在很大的區別。再如,學習數組的時候,可以讓學生重點區別VB中的數組格式是a(3,4),而C中的數組格式是a[3][4]。并且告訴學生,C語言不能像VB語言那樣定義動態數組。
C語言入門較為簡單,但隨著知識的增加,層次會逐漸深入,內容也會更加難懂。因此,學習的時候適當采用前面所學的知識作為后面知識的一個框架,這樣既利于鞏固前面所學內容,又利于掌握新學的知識。例如,學生很容易掌握字符的內容,但當后面講到字符串時,就會與字符混淆,導致字符知識記不牢,字符串又不理解的情況。這時可以在學習字符串之前,提供一個比較性組織者,采用提問的方式,讓學生先來回顧字符的相關知識,然后在教師提示和個別學生的小聲回答之下,把字符的大體內容在黑板的左上角板書:
1)字符的定義:字符是由單引號括起來的單個字符;
2)字符變量定義的關鍵字:char;
3)字符所需的內存空間的大小:在VC++下所占字節為一個字節;
4)輸入和輸出字符的函數格式:scanf(“%c”,&c)和printf(“%c”,c),以及 getchar()和 putchar()。
利用這個比較性的組織者,可以讓學生鞏固字符的相關知識,使其不會與即將學習的字符串混淆。在這個基礎上,再引入字符串內容,學生才不會混淆。在講授字符串的時候,可以時時和字符進行對比。如講授字符串輸出的時候,引出gets、puts時,回到黑板的左邊讓學生看看字符是采用了什么函數,在這種情況下,利用比較性組織者,對學生掌握知識有很大幫助。
在教授文件知識時,相對于其他課程,大家對文件的概念比較熟悉,但是在C語言中卻沒有涉及過。講授之前可以讓學生想想,平時在計算機上編程時候,一般數據是如何輸入,而數據輸出又是輸出到什么地方?這樣,學生了解平時輸入通常是從鍵盤上輸入,而輸出則是輸出到屏幕上,就不難理解從文件中輸入和輸出到文件里是什么意思了。
概念圖是一種以圖的形式來組織和表征知識的工具,是用帶箭頭的線段對概念進行連接,以示概念間的聯系。在學習中出示一張概念圖,其主要目的是把要學習的概念通過圖示進行組織,這樣可以讓學生預先有一個總括性的框架,從而起到“先行組織者”的作用。C語言的知識點比較多,內容相對來說比較緊湊,因此在教授的時候可以畫出整體的大綱[3]。如在講授課程語法知識的時候,教師可以呈現C語言的知識結構表(圖1),讓學生能夠對整個C語言的知識有一個大體的掌握。

圖1 C語言的知識點
C語言的學習是需要學生自己主動思考和總結的,教師在課堂上應多鼓勵學生對學習的知識點進行精細加工,培養學生自己多加總結的習慣。例如,計算機等級考試的C語言中關鍵字是常考知識點,但是書中只是進行了簡單的羅列,不方便學生記憶。教師可以鼓勵學生采用分類的方式進行記憶:數據類型關鍵字、控制語句關鍵字、存儲類別關鍵字、其他的一些關鍵字四大類來進行歸納總結。
對于程序,教師應該帶領學生多讀程序。講解程序的時候,教師應該把程序編寫的思路解釋清楚,還要告訴學生拿到一個程序應該如何進行閱讀。對于一些平時經常用到的程序,可以讓學生在讀懂的情況下進行記憶。如“判斷素數的算法”“判斷是否為閏年”“水仙花”“字符與數字之間的相互轉換”“將數字進行倒序排列”“對二維數組進行賦值”“從字符串中刪除不需要的元素”“大寫字母如何轉換成小寫字母”“各進制數之間的相互轉換”等比較簡單且易懂的程序,應該鼓勵學生進行簡單記憶,為以后編程起到一個鋪墊作用。
鼓勵學生熟練掌握冒泡法、選擇法、插入法以及折半查找法等不同的算法。對于一些比較難的程序,要幫助學生理清思路,知道程序編程的一個提綱,理清學生讀復雜程序時候的思路。
教師在課堂上講授知識點或者例子的時候應該多提問學生,促進學生積極思考,引起學生的認知不平衡,促進學生去接受新的知識。同時鼓勵學生主動記筆記,保證學生上課思想集中,同時在抄寫的過程中加深對程序的理解以及記憶。
教師應培養學生學習C語言的興趣,引導學生多讀程序,鼓勵學生進行實踐上機練習,采用多種方法編寫程序。同時也要鼓勵學生進行思考、比較,總結C語言中的知識點,提高學生解決問題的能力。雖然學生的學習狀況有所改善,但是隨著教材的深入,知識點的復雜,學生的學習效果仍然不能保證,仍需要教師進一步的探索和改善。
[1]譚浩強.C程序設計[M].3版.北京:清華大學出版社,2005.
[2]奧蘇泊爾.教育心理學[M].余星南,宋鈞,譯.北京:人民教育出版社,1994.
[3]吳良根.化學教學中“先行組織者”呈現方式及其應用[J].教育實踐研究,2010(9):54-56.
[4]范印哲.教材設計導論[M].北京:高等教育出版社,2003.