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

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

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

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