陳善利
(南通大學 信息科學技術學院,江蘇 南通)
隨著科技的發展和人工智能時代的來臨,計算機程序設計具有越來越重要的地位。C語言程序設計是目前廣泛使用的程序設計語言之一,它除了具有高級編程語言的功用,還具有匯編語言的優點,因此相對于其它編程語言,C語言具有廣泛性、簡潔性、結構完善等特點。C語言不僅是程序設計者的入門語言,它還能幫助我們學習其它計算機語言,如Java語言、VB語言等[1]。因此C語言是程序設計初學者必備的語言。
如今,《C語言程序設計》已越來越普遍地成為高等學校理工科類專業的公共基礎課,全國以及各省市的計算機等級考試都將C語言列入考試范圍。但從筆者這幾年的教學實踐來看,不少學生,尤其是非計算機專業的學生反映,課堂上剛開始學習基本的語法規則時還能聽懂,到中間學習基本結構、數組時開始一知半解,再往后學習函數、指針時完全找不到頭緒,上機編程更是無從下手。一個學期下來,只有少數學生能編寫像樣的程序,大多數學生只學會了皮毛。面對這樣的問題,作為教師應該思考如何提高學生的學習能力,研究怎樣進行C語言程序設計教學方法的改革[2,3]。
不管是中小學還是大學,傳統的教學模式就是教師在課堂講解概念,演算練習題,學生對照課本學習,課后做練習鞏固。C語言程序設計是一門實踐性很強的課程,學生除了課堂上學習理論概念,更重要的是需要上機做編程訓練,把理論知識融入到實際問題中,通過實踐訓練來掌握C語言的編程方法。而傳統的教學模式只注重C語言本身語法知識的講解,忽略了編程實踐能力的培養,而且C語言的各種數據類型、輸入輸出格式等語法知識極為瑣碎,需要花費大量的時間講解、記憶,許多學生在此階段容易失去學習的耐心和興趣,很難繼續后面的學習,即使學生記住了一大堆語法知識,遇到實際問題時還是無從下手,長此以往,學生會越來越失去學習的信心和興趣,最終徹底放棄。由此看來,傳統的教學模式并不適合C語言的學習[4-6]。
筆者所在的學校理工科專業的大一學生在第二學期開設《C語言程序設計》這門課,課時為72學時,其中42學時為理論教學,30學時為上機操作,理論與實踐相結合。對于理論部分的學習,筆者認為可以從以下幾個方面改進教學方法:
(1)培養興趣
對于非計算機專業的大學生來說,學習一門非自己本專業的,而且知識點比較繁復、枯燥的課程,培養興趣是首要的。絕大多數的C語言程序設計教材,在介紹每章節內容的時候首先拋出概念和語法規則,然后給出幾個相關的編程例題,教師上課就是講語法規則和分析例題,學生被動地接收知識點和理解課本上的例題,一旦出現超出了課本范圍的編程問題,很多學生不能做到舉一反三。作為教師,是否可以對這樣的教學方法反其道而行之呢[7,8]?
在學習語法規則之前,首先給學生演示一些案例程序用來解決實際中比較常見的問題,給學生有一個感性的認識,讓學生產生一種“原來這樣的問題可以編程實現,而且并不復雜”的想法,繼而會問:“這是怎么實現的呢?”這時,教師可以就這樣的程序講解語法結構,然后舉一反三,最后通過上機讓學生自己編程實現。教學方法改進前后的流程對比如圖1所示。

圖1 教學方法改進前后的流程對比
要能實現這樣的方法,對教師的要求是比較高的,教師要設計出比較好的案例,既要用到C語言的語法結構,又要簡單實用,還要有擴展性[6]。比如,在講授基本結構中的循環結構時,筆者讓學生當堂抄100遍循環結構的特點并標序號,學生都面面相覷,這時筆者用循環結構中的for循環完成了這個操作,前后只用了不到2分鐘。然后通過這個實例講解for循環的語法規則和執行流程,學生很容易就理解了,然后再舉一反三,循序漸進,逐漸增加循環的難度講解。再比如,講授函數的時候,筆者讓學生編程計算1到10范圍內每一個整數的階乘,求一個數的階乘在前面的課程中學習過,學生會編寫求某一個數的階乘,但是要編寫1到10范圍內每一個數的階乘,而且代碼非常相似,學生覺得重復寫代碼太浪費時間,而且重復的代碼也會帶來存儲空間的浪費,不少學生產生了一種想法:是否有方法可以一次性計算每一個數的階乘?答案是肯定的,通過函數求階乘。這樣引出函數的定義、調用等。
通過這樣的方法,學生在學習每一個知識點的時候都能夠保持一種積極的求知欲,學習語法的時候也不會覺得那么枯燥。
(2)變靜為動
C語言知識點比較多,算法也多,有時同一個問題可以用多個算法實現,學生往往一個算法還沒有理解,更不可能去比較多個算法了。教師在講授這些算法的時候應該考慮如何讓學生更加容易區分和理解這些算法。
比如程序設計中最經典的排序問題,常見的算法有選擇排序、冒泡排序、堆排序、快速排序等,每種算法有各自的特點,其中最容易混淆的是選擇排序和冒泡排序,同樣是兩兩比較,過程相似,代碼相似,學生很難區分。筆者嘗試把這兩種算法的過程做成動態的演示圖,學生很容易就能區分了[9,10]。
圖2所示為冒泡排序法一次比較的動態演示圖。冒泡排序中,每次比較都是相鄰的兩個數兩兩比較,交換位置,比較結束后得到最大的數,剩余的數重復比較的過程,每次得到最大的數,直到所有的數排好序。

圖2 冒泡排序法演示圖
圖3所示為選擇排序法一次比較的動態演示圖。選擇排序中,每次比較是第一個數和其余所有的數兩兩比較,交換位置,比較結束后得到最小的數,剩余的數重復比較的過程,每次得到最小的數,直到所有的數排好序。
土墻日光溫室主要是指以板打墻和機械碾壓土墻為溫室墻體的日光溫室,我省目前數量為13萬棟以上,其中,機械碾壓土墻是現存量最大的日光溫室類型,占土墻溫室90%以上,占全省日光溫室數量總量的55%以上,主要分布在湟水谷地的大通、湟中、湟源、互助、樂都、平安、民和等縣,其次是黃河谷地貴德、共和、尖扎、同仁縣。土墻日光溫室(本文主要指機械碾壓土墻溫室)的好壞直接關系到冬季蔬菜生產狀況,維護保養和升級改造土墻日光溫室對高效利用該蔬菜生產設施具有重要作用。

圖3 選擇排序法演示圖
用語言描述兩種算法非常相似,但是用動態圖演示可以很清楚的比較出來。通過這樣的動態演示使學生能夠更加直觀地理解算法的過程和特點,也加深了記憶,理解了算法了以后再用程序實現學生就容易接受了。
(3)與學生保持一致的思路
現在高校教學絕大多數都是采用多媒體教學,教師通過投影儀講解概念、語法,演示程序,這樣的教學手段極大提高了教學效率,但也會帶來問題[11]。在使用多媒體教學之前,教師多是板書程序,一邊寫程序一邊講解,雖然效率低,但是學生有充分的時間思考和理解。現在教師都是用PPT播放代碼或者用編程工具打開編輯好的程序講解,學生往往首先被程序的復雜度嚇住,對程序產生了抗拒的心理,而且教師在講解的時候不可能一句一句代碼講,總是挑重要的部分講,學生容易跟不上節奏,稍微一走神后面就聽不懂了。兩種教學手段各有利弊,是否可以把這兩種教學手段結合起來呢?筆者嘗試了用多媒體的方式“板書”程序,取得了比較理想的效果。
C語言的編程工具有多種,目前常用于教學與計算機等級考試的有Visual C++、Visual Studio。筆者使用了一種比較快捷方便的編輯器:CodeBlocks。在CodeBlocks里編程,關鍵字只要輸入首字母會自動彈出,大括號也會自動配對,省去了輸入語法結構的時間,還有調試器方便調試程序。筆者在講解程序的時候首先給出問題讓學生思考,然后在編輯器里從定義變量開始輸入,邊輸入邊講解語句的作用,與學生保持一致的思路。有時輸入過程中不小心出錯,學生也能指出錯誤。對于一些復雜的語句結構,還可以用調試器做單步調試,讓學生對程序的運行過程有更加透徹的理解。
C語言程序設計是一門實踐性很強的課,教學過程中除了教師的講解以外,上機實踐也是非常重要的。前面講到的幾種教學方法的改進可以幫助學生從理論上更好地學習C語言,學生自身也需要通過大量的上機訓練來培養操作能力和靈活運用的能力[12]。
C語言程序設計的實踐性非常強,因此在掌握理論知識的基礎上進行實踐訓練尤為重要。因為實踐學習的課時相對較少,怎樣充分利用較少的課時達到實踐訓練的效果是教師需要研究改進的。結合理論教學,筆者認為可以從以下幾個方面嘗試改進[13]:
學生上機操作編什么程序很關鍵,編寫的程序既要與學習的理論相結合,又要難度適中,有代表性,容易舉一反三。實驗教材的題目往往難度偏低,而且有實驗步驟和完整的程序代碼參考,對于不自覺的學生來說,每次上實驗課只是把教材上的代碼錄入運行,起不到練習的作用。筆者嘗試每次實驗課設計一些相關的編程題給學生練習,有難度的題目適當給出一些提示,實驗課結束前給出完整的程序并講解思路算法,學生對照自己編寫的程序修改運行。
(2)實踐方式
編程需要花費的時間比較多,實驗課程安排的時間比較少,如果課上給學生題目讓學生編程調試,往往一次課學生連一個程序都完成不了。筆者的做法是提前把實驗題布置給學生,學生可以利用課后時間編寫代碼,實驗課時用來調試驗證,遇到問題可以相互討論,相互學習[14]。
經過一學期的學習,大部分學生基本掌握C語言程序設計的編程思想,能夠較好地完成實踐教學所要求的教學目標,達到課程學習的要求。
《C語言程序設計》這門課對于非計算機專業的學生來說確實是一門比較難學的課程,對學生的邏輯思維能力有很大的考驗,讓每個學生通過有限的學時掌握好編程語言對教師也是一個考驗。教師如何在教學過程中提高教學質量,提升學生的編程能力,培養邏輯思維能力,并不是一朝一夕的事情,必須要在實際教學中進行反復的實驗、總結和改進,才能獲取寶貴的教學經驗。