黎利輝 黃海 王聯芳
摘 要: 針對普通高等院校C語言程序設計課程的教學,提出了三個具體的教學問題:①對于語法與算法的關系處理;②對編程實踐的引導;③教學過程中的趣味性。對這些問題分別提出了具體、有針對性的解決辦法,在實際的教學過程中采用這些方法收到了較好的效果。這些方法對普通高校C語言程序課程的教學來說具有普遍意義。
關鍵詞: C語言; 語法; 算法; 教學; 編程實踐; 趣味性
中圖分類號:G424 文獻標志碼:A 文章編號:1006-8228(2013)08-58-03
0 引言
目前幾乎所有普通高等院校(本文指一般本科院校或高職高專院校)的理工科專業都開設了C語言程序設計這門課程,在有的學校,這門又叫高級語言程序設計。在學習這門課之前,學生基本上都沒有編程知識,對他們來說這門課程學習難度較大。普通高等院校的學生學習素質整體偏低,主要表現在兩點:①學習的主動性較差;②沒有足夠的毅力來戰勝學習過程中所遇到的困難。在這樣的背景下,很多講授這門課程的教師不能因地制宜地組織教學,出現了一些問題,本文歸納了這些問題,并提出了相應的解決辦法,與各同行商榷。
1 對語法與算法的關系處理不當
C語言程序設計這門課有兩個主要教學目標:①掌握C語言的基本語法;②掌握一些基本的算法。“算法是對特定問題求解步驟的一種描述,它是指令的有限序列,其中每一條指令表示一個或多個操作”[1]。“算法是靈魂,不掌握算法就像是無米之炊。語言是工具,不掌握語言,編程就成為空中樓閣”[2]。這兩個目標都很重要,但相對來說,第一個目標難度偏低,第二個目標難度偏高。
我們對普通高等院校C語言程序設計課堂進行訪查發現,有些教師將語法和算法孤立開來進行講解,其結果是,單純地講語法,學生會覺得知識點零散,并且枯燥無味;單純地講算法,學生不知道算法如何用語言來實現。
在教學過程中,為了能體現教學的趣味性,將零散的知識點有效地組織起來,以吸引學習主動性和學習能力都不強的學生很好地參與到學習過程中來,采用的方式是以程序設計為主線,將算法和語法結合起來講授。先提出問題,再分析解決這個問題的思路與步驟,即算法分析,然后再用C語言來實現,在實現的過程中將重點語法進行講解。比如在開始講解循環這一章時,針對“輸出50000個星號”這一問題,首先進行算法分析:一條輸出語句輸出一個星號,把這個操作重復50000次,重復的操作需要利用循環來控制,這樣算法分析就到此為止。接著教師要現場編寫程序,通過具體的程序代碼,來講解for語句的語法細節:①三個表達式各自的作用及執行流程;②三個表達式省略的情況(要簡單地講解,不能讓學生陷入語法的泥潭中)。
在教學過程中,很多教師過于側重于語法細節的講授,而忽略了對學生基本算法思維的訓練。比如花很多時間來講解各種數據類型在不同的編譯環境中所占的存儲空間,其實數據類型只需要掌握最常用的幾種,并且知道每一種數據類型的數值范圍有一定限制即可,不必深究具體的數值范圍是多少和每種編譯環境下每種數據類型各占多少個字節。一旦教師把學生的學習精力導向這些繁瑣的語法細節,就會使學生感覺這門課枯燥無味,對于普通高校的學生,這樣的授課方式會消磨他們的學習積極性。
從整體來說,語法細節的講授應當盡量弱化(弱化的程度以編程基本夠用為標準),要將主要精力放在培養學生用C語言來解決實際問題的能力上(即對算法的訓練),學生有了一定的基礎后,可以自學所需的語法細節。在語法與算法結合的教學過程中,語法與算法側重點的選擇,在不同的時期是不一樣的。如果以一個學期為周期,在學期初教師要花主要精力來引導學生熟悉C語言的語法,比如在什么時候打逗號、分號、空格,如何進行代碼縮進等,這一過程約花四分之一個學期。學生熟悉了C語言的常見語法規律和開發環境后,教師應當有意識的側重于算法教學。如果以每一章的教學過程為周期,語法與算法的側重點也是不一樣的。在一章的教學初期,應當以語法為主,后期應當以算法為主。
2 對學生編程實踐引導不足
C語言程序設計是一門實踐性非常強的課程,對于入門者最好的學習方式就是多動手編寫程序和調試程序,可是很多教師對學生入門階段的編程實踐引導不足,主要表現在兩個方面。
2.1 授課時過于依賴課件,現場編程示范不足
筆者曾經就這門課的教學情況調查了廣西崇左市的兩所高校——廣西民族師范學院和廣西理工職業技術學院,發現在43名教師中,有39位教師授課時主要依賴課件(如PPT)來講授,很少動手寫代碼,所占比率為90.7%,而這些教師普遍反應這門課教學難度大,學生難以理解。這其中一個重要的原因是教師授課時過于依賴課件,導致學生預習和復習鞏固時,下意識地去翻閱課件而不是動手編程實踐。普通高等院校的絕大部分學生即使動手實踐,也只是簡單的把教師的代碼復制粘貼到編程環境下進行運行,僅滿足于基本看懂并且運行通過這一層次,這一層次離真正掌握所學知識還差的很遠。
教師在上課時,如果能脫離課件,將主要代碼當場編寫出來,并結合代碼與注釋講解語法細節,這樣做既可以加深學生的記憶,又可以無形中培養學生動手編寫程序的意識。那么,學生在預習與復習鞏固時,就會以編程實踐為基礎進行學習,達到事半功倍的效果。
筆者做過一次實驗,在兩個學生人數與整體素質相當的班級講授這門課,其中A班依據課件進行講解,很少現場編程示范,課后把課件發給學生進行鞏固復習。在B班以現場編程的方式來講解,在關鍵的地方用注釋的方式來說明,課后將代碼與課件都發給學生。期末兩個班在同一個考場測驗,A班的平均成績為67.8分,B班的平均成績為73.6分,相差5.8分。在對教師授課滿意度反饋這一項,A班對教師的平均授課滿意度為89.2分,B班為93.6分,相差4.4分。
2.2 對學生編程錯誤處理能力的訓練不足
C語言初學者,困擾他們最多的是編譯與連接時出現的錯誤;在入門后的提高階段,困擾他們最多的是運行時出現的邏輯錯誤。如何解決這兩類錯誤,對他們來說這是兩個很大的挑戰。因為錯誤提示都是英文,普通高等院校的理工科學生英語水平普遍不高,很多同學對英文的錯誤提示有畏懼心理,不能堅持讀懂這些錯誤提示進而解決錯誤。故C語言的教師,幫助學生消除對英文錯誤提示的畏懼心理,提高學生解決錯誤的能力,是一個非常重要的教學目標。但是很多教師忽視了這一點,他們一般在上課前把代碼寫好,上課時把代碼復制到編程環境下執行,在整個編譯、連接、運行過程中避免出現錯誤,忽略了對一些典型錯誤的講解。并且有些教師在學生動手編程的過程中,不進行有效地監控,對學生的錯誤不進行指導,這時相當一部分意志薄弱的學生,就會有挫敗感,不斷積累的挫敗感會擊垮他們學習的信心。
如何達到這一目標值得我們思考,對于編譯與連接時的常見錯誤,首先,教師在編程示范時,可以在特定情景下故意寫錯,然后帶著學生查看錯誤提示,教會學生解決這一類錯誤。比如在第一節課時,在程序正確運行后,教師可以故意將一個英文標點改為中文標點并遺漏一個分號,帶領學生看錯誤提示時,讓他們把其中常見的英文單詞熟記于胸,通過這種方式教會學生解決這兩類錯誤。對于學生普遍遇到的錯誤,可以把學生遇到的錯誤代碼針對全班同學進行講解。對于學習后期經常遇到的邏輯錯誤,應當教學生使用輸出語句和斷點調試這兩個非常有用的方法來排除錯誤。
教是為了達到不需要教[3],授人以魚不如授人以漁,在教師的引導下,如果學生具備了C語言的基本知識和基本的解決錯誤的能力,就代表學生具備了自學的能力,這時教師就可以多引導學生自學了。
3 教學過程中對學生趣味性體驗的重視不足
教學過程中,教師對學生趣味性體驗的重視不足主要表現在兩個方面。
3.1 教態語態不夠活躍,教學氣氛沉悶
很多教師教學設計不嚴謹,對教學過程中的起承轉折和教學內容重點難點沒有很好地設計;而為體現教師的尊嚴和課堂的嚴肅性,教態過于嚴謹,缺失生動性,語言表述過于學術化和專業化。這門課程內容本身并不生動,如果以這樣的教態進行教學就更容易出現教學氣氛沉悶,學生聽課疲倦的情況,如果學生學習主動性較差,其內在的學習驅動力不足,他們很容易對這門課失去興趣。
成功的課堂應該是:教學設計嚴謹,教態語態生動。教師在教學前要進行嚴格的教學設計,實施教學環節時,應當在教態語態上放松,盡量用生動形象的口語來教學,現舉一例如下。
變量對于C語言初學者是一個比較難掌握的概念,學生應當理解變量的如下幾層含義:變量是用來保存值的,變量里的值是可以隨時改變的;變量里只能保存一個值;變量有類型的區別;變量的地址與名字的區別。通過教學前的嚴格設計,在教學過程中可以這么來講授:一個變量就像教室里的一個座位;變量是用來保存值的,座位上坐的人就相當于變量里保存的值;一個座位上只能坐一個人,變量里只能保存一個值,教師來給你調試錯誤時,你就得讓座,第二次給變量賦值時,新值就把原來的值替換了;每一個座位有一個編號,如01,02等,每一個變量有一個內存地址,如oxfff1,0xfff5等;這些地址不好記憶,我們再給變量取一個容易記憶的名字,比如sum、max等,對應地我們可以把這個座位叫做“龍椅”、“太師椅”等。此時,學生往往就會哄堂大笑,但學生的歡笑聲并不代表他們已經真正理解了這個概念,這時教師要把學生的情緒由興奮引導到平靜,思考變量與座位之間的關系。學生放松過后,一般愿意去思考,并且能深刻地理解變量這一概念。
3.2 教學過程中對學生學習成就感的體驗關注不足
所謂學習成就感,實際上是學習者在學習過程中的一種積極的情緒體驗,是在取得成功,達到愿望,實現自我價值,得到認可時產生的滿足感和喜悅感。這種發自內心的滿足感與喜悅感,是他們感受學習趣味性的一種最強烈的方式。當前絕大部分普通高等院校的教學評價機制不完善,很多教師認為,教師只需簡單地將所要講授的知識講解清楚就可以了,學生學與不學,學得好與不好與己無關,有時候學生根本聽不懂,但教師還是一成不變地按教學計劃實施教學。C語言程序設計課程內容的連續性,決定了如果前面的知識沒有理解,后面的課程內容將更加難以掌握,這樣,學生就會感受到更多的挫敗,而不是成就,在挫敗感籠罩下,學生很難體會到本門課程的趣味性。
那么在普通高等院校針對這門課程,教師如何幫助學生獲得成就感呢?除去普通意義上的提高教師授課水平外,筆者還摸索出以下兩點思路。
在學習初期,教師可以要求學生用抄寫原代碼的方式來熟記C語言的語法細節。記憶是任何一門學科學習的必要手段。普通高等院校的學生,大部分在課后不會主動去記憶語法格式,教師可以通過這種方式來強迫學生去記憶,讓他們盡快地去熟悉語法格式。這樣在上課時,學生就會大大降低因為語法細節不熟悉而產生的挫敗感,相反成就感會大大增加。
學生間的學習素質是有差異的,面對這種差異,很多教師都提出了因材施教策略,這固然是對的,但關鍵是在同一個課堂里如何因材施材。比較可行的方式是:教師在設計學習目標時,根據難度級別分為幾個教學要求,教學時先從低難度的要求開始講授,這一要求的內容,絕大部分的學生能夠掌握,極個別學習較差的學生,多花一點精力也能掌握,通過降低難度,讓所有學生都能獲得成功的體驗,這種內在的學習成就感會賦予他們繼續學習的動力;接著教師把要求適當提高,難度級別也相應加大,注意難度提高的梯度不可過大,還是得保證絕大部分的學生可以掌握;課后可以把這個問題的要求繼續提高、難度繼續加大,讓學習成績好的學生去鉆研。
例如在講授C語言冒泡排序時,可以先按第一層要求來講解,在黑板上分析從前往后進行比較這種思路,這一思路是非常簡單的,每個同學都可以掌握;再提出第二層要求,將這種冒泡排序用C語言來實現,通過對這層要求的分析,讓學生明白為什么要用數組,兩層循環各自的作用是什么等關鍵知識點,這兩層要求要讓每一個學生都能達到,讓學生獲得學習成就感;接著提第三層要求,冒泡排序如果從后往前進行比較,那么應該如何實現,這時需要教師指明思路,簡單講解后交給學生自己去實現程序,培養學生的學習能力,因為有前面的成就感作為自我獎勵,學生一般愿意去研究第三層要求;最后提出第四層要求,當全部數據已經按要求排好時,如何提前結束排序過程。在實施教學的過程中一定要注意表揚學習成績差但是已經達到第一層和第二層要求的學生,讓他們也能獲得久違的學習上的贊美與肯定。
4 結束語
筆者在多年的實踐教學過程中,采用以上辦法收到很好的效果,教學中氣氛融洽,學生學習的積極性高,都能較好地掌握本門課程的主要知識。凡是計算機語言類教學的課程,都有共同的特性,本文提出的教學中的問題,在普通高等院校的其他計算機語言類課程的教學中也同樣存在,所以,本文提出的教學思想也同樣適合于其他計算機語言類課程的教學。
參考文獻:
[1] 嚴蔚敏,吳偉民.數據結構(C語言版)[M].清華大學出版社,2011.
[2] 譚浩強.C程序設計(第四版)[M].清華大學出版社,2011.
[3] 葉圣陶.葉圣陶語文教育論集[M].教育科學出版社,1980.