邱京偉
(寧德師范學(xué)院 信息與機(jī)電工程學(xué)院,福建 寧德 352100)
C語言具有功能豐富、格式靈活、代碼效率高等優(yōu)點(diǎn),廣泛應(yīng)用于教學(xué)研究、計算機(jī)等級考試、單片機(jī)編程、嵌入式編程等學(xué)習(xí)與生產(chǎn)領(lǐng)域.作為一門廣泛采用的入門級別的編程語言,C語言還是學(xué)習(xí)算法、JAVA編程、嵌入式等課程的基礎(chǔ).學(xué)習(xí)C語言是為了培養(yǎng)學(xué)生結(jié)構(gòu)化的編程思想與技能,為今后的專業(yè)學(xué)習(xí)打好基礎(chǔ)[1].在C語言程序設(shè)計這門課程的教學(xué)中,學(xué)生的編程能力是學(xué)生后續(xù)相關(guān)課程學(xué)習(xí)的重要基礎(chǔ),不僅是檢驗學(xué)生學(xué)習(xí)成果的重要指標(biāo),而且對學(xué)生的實(shí)踐能力和創(chuàng)新能力的發(fā)展有很大促進(jìn)作用,對C 語言教學(xué)而言,其教學(xué)目的是培養(yǎng)和提高學(xué)生的編程能力,使學(xué)生能夠根據(jù)C 語言的算法和命令編寫各種實(shí)用程序,滿足生產(chǎn)生活需要[2].所以培養(yǎng)學(xué)生的編程能力一直是C語言教學(xué)的重點(diǎn)之一.
編程能力是學(xué)生根據(jù)給定問題合理安排命令和步驟解決問題的一種邏輯推理能力,不僅考驗學(xué)生的知識儲備和編程素養(yǎng),更是其動手實(shí)踐能力的體現(xiàn).“C 語言程序設(shè)計”是我校數(shù)學(xué)、機(jī)械電子工程等理工科專業(yè)的基礎(chǔ)課程,教學(xué)活動主要在計算機(jī)基礎(chǔ)實(shí)驗室和軟件工程實(shí)驗室進(jìn)行,作為許多課程的先導(dǎo)課,教學(xué)上除了重視基礎(chǔ)知識和實(shí)踐操作技能的應(yīng)用,還充分考慮到將編程思想培養(yǎng)融入到培養(yǎng)專業(yè)人才方案當(dāng)中,便于學(xué)生在學(xué)習(xí)其他課程的時候通過舉一反三更好地理解新知識.為了在教學(xué)實(shí)踐中更好地提高學(xué)生C 語言編程能力,筆者總結(jié)以往C 語言編程教學(xué)中出現(xiàn)的問題,提出相應(yīng)的解決方法,完善教學(xué)實(shí)踐.
C語言教學(xué)采用以班級為單位進(jìn)行集體授課和實(shí)驗的教學(xué)形式,在具體教學(xué)中,不論是教學(xué)大綱還是實(shí)驗大綱,都強(qiáng)調(diào)對學(xué)生程序設(shè)計技能的培養(yǎng).在實(shí)際教學(xué)中,主要存在的問題如下.
C語言教學(xué)的對象基本是大一新生,他們對計算機(jī)知識了解有限,大部分同學(xué)甚至未接觸過任何編程語言.在C語言一節(jié)課的學(xué)習(xí)過程中,既有關(guān)鍵字、標(biāo)識符等詞匯需要記憶,又有編程格式和編程語法需要理解掌握,對學(xué)生的記憶理解能力都提出了一定的要求.雖然多媒體技術(shù)的使用是對以往教學(xué)方式的很大改善,但其“填鴨式”的教學(xué)實(shí)質(zhì)并未改變[3],一旦教師在教學(xué)方法上有所不足,典型的就是講課進(jìn)度過快,容易和學(xué)生思維脫節(jié),尤其是在講解行數(shù)較多的程序時,往往有不少同學(xué)因跟不上老師的講解速度而無所適從,在走訪的學(xué)生中,有90%出現(xiàn)過這種問題.隨著教學(xué)的深入和內(nèi)容難度的加大,在基礎(chǔ)知識上積累的問題給學(xué)生學(xué)習(xí)新知識帶來非常大的困難,戳傷了學(xué)生學(xué)習(xí)的積極性,在調(diào)查的同學(xué)中,70%以上的同學(xué)表示基礎(chǔ)知識的不牢固影響了課堂學(xué)習(xí)的效率,降低了學(xué)習(xí)興趣.
C語言雖然是一種較為簡單的編程語言,但其語法較為靈活,導(dǎo)致部分同學(xué)在書寫程序時格式不夠嚴(yán)謹(jǐn),主要表現(xiàn)在相關(guān)程序行該縮進(jìn)的沒有縮進(jìn),或是圖方便將幾句程序?qū)懺谝恍?在初學(xué)的1 個月內(nèi)90%以上的學(xué)生有這種問題,雖然編譯器沒有報錯,但容易導(dǎo)致程序理解困難,如果把這個習(xí)慣帶入?yún)R編、Python等的學(xué)習(xí)中,將導(dǎo)致程序出錯,無法編譯,也不利于學(xué)生的進(jìn)一步學(xué)習(xí)和職業(yè)素養(yǎng)的培養(yǎng).
另一方面,在C 語言教學(xué)中不但要教授語言的語法規(guī)則,更重要的是要教授C 語言程序設(shè)計的思想和算法,培養(yǎng)學(xué)生的編程思維能力[4].由于教學(xué)對象的是沒有編程基礎(chǔ)的大一新生,實(shí)驗中題目的難度普遍不高,編寫的程序往往規(guī)模較小,雖然比較適合入門學(xué)習(xí),但這導(dǎo)致這些程序并沒有太多算法上的需求,學(xué)生往往根據(jù)經(jīng)驗就足以應(yīng)付當(dāng)前的問題,使學(xué)生對算法設(shè)計重視不夠,對培養(yǎng)學(xué)生探尋新算法解決問題的能力有一定消極影響.
C語言的學(xué)習(xí)往往要經(jīng)歷從簡單到復(fù)雜,程序難度逐漸加大的過程,學(xué)生在學(xué)習(xí)的過程中只有通過大量的實(shí)踐鍛煉不斷積累編程的技巧和經(jīng)驗,才能在最后擁有較高水平的編程能力.在現(xiàn)階段教學(xué)中,缺乏實(shí)踐機(jī)會一直是妨礙編程能力提高的一大問題.
一方面C語言的教學(xué)一般在大一開展,而大一新生剛跨入大學(xué)校門,絕大多數(shù)同學(xué)都正在努力適應(yīng)大學(xué)生活的過程中,對學(xué)業(yè)的規(guī)劃能力有限,面對海量的信息和知識無所適從,不知道哪些知識對他們的后續(xù)學(xué)習(xí)有幫助,導(dǎo)致學(xué)生學(xué)習(xí)的積極性沒有充分調(diào)動起來,部分同學(xué)甚至把有限的時間浪費(fèi)在一些無用的事情上.另一方面,不論是加強(qiáng)基礎(chǔ)理論教學(xué),還是加強(qiáng)實(shí)驗實(shí)踐,都需要充足的課時作基礎(chǔ),但是C語言程序設(shè)計的教學(xué)受教學(xué)規(guī)劃限制,周課時根據(jù)不同專業(yè)只有3~4課時,而一學(xué)期要學(xué)習(xí)的課程高達(dá)10 個單元左右,這導(dǎo)致不論是課堂教學(xué)還是實(shí)驗教學(xué)都面臨著課時有限的問題,不但限制了教師為學(xué)生講解經(jīng)典范例的數(shù)量,也使學(xué)生忙于應(yīng)付課內(nèi)任務(wù)而缺乏自主探索磨煉編程技巧的時間,不但影響了編程能力的鍛煉,也不利于學(xué)生相關(guān)能力的培養(yǎng).
針對C語言教學(xué)實(shí)踐中出現(xiàn)的問題,筆者解決問題的途徑及效果如下.
課堂教學(xué)是傳授知識和培養(yǎng)學(xué)生能力的主渠道[5].為此,需要在以下幾個方面進(jìn)行改進(jìn):1)根據(jù)學(xué)生的接受情況有針對性地調(diào)整教學(xué)進(jìn)度尤其是程序講解速度,例如在期初適當(dāng)降低講課速度,對順序結(jié)構(gòu)和選擇結(jié)構(gòu)程序這類基礎(chǔ)性質(zhì)的知識在課時上有所傾斜,避免學(xué)生思維跟不上老師講解速度的情況發(fā)生.2)加強(qiáng)教學(xué)反饋,加強(qiáng)與學(xué)生互動交流,及時解決學(xué)生學(xué)習(xí)中遇到的疑難問題,避免學(xué)生的困惑隨時間的推移越積越多,可供選擇的方法除了課堂教學(xué)中留有一定時間為學(xué)生答疑解惑外,還可以引導(dǎo)學(xué)生利用QQ 或是微信向老師提出疑問,甚至在有關(guān)論壇里發(fā)帖尋求幫助,不但可以有效彌補(bǔ)時間的不足,還可以解決部分學(xué)生內(nèi)向不敢在課堂提出疑問的問題,這些方法都收到同學(xué)歡迎.
編程類課程向來重視動手能力的培養(yǎng),針對學(xué)生程序書寫格式不規(guī)范的問題,任課教師一方面要在課堂上向?qū)W生說明,書本上程序的書寫格式和排版是幾代電腦工作者多年工作經(jīng)驗進(jìn)行優(yōu)化的成果,有助于今后的學(xué)習(xí),也是專業(yè)精神的體現(xiàn),另一方面,良好的編碼風(fēng)格應(yīng)當(dāng)從學(xué)生第一次動手編程開始強(qiáng)調(diào)[6].在課程初期就要嚴(yán)格要求學(xué)生按照書本格式編寫,在批改作業(yè)或是檢查實(shí)驗報告的時候,注意糾正書寫錯誤,教導(dǎo)學(xué)生該縮進(jìn)的地方縮進(jìn),沒有必要不要把幾行程序?qū)懺谕恍?,幫助學(xué)生盡快培養(yǎng)起良好的編程風(fēng)格,為以后的學(xué)習(xí)打好基礎(chǔ).此外,在練習(xí)中布置一定量的多重判斷或是循環(huán)與選擇相互嵌套的習(xí)題,通過演示標(biāo)準(zhǔn)書寫格式和無縮進(jìn)或無序書寫格式的區(qū)別,讓學(xué)生了解到標(biāo)準(zhǔn)書寫格式不但易于閱讀,更是避免程序出錯的有效方法.例如,判斷101~200 之間有多少個素數(shù),如果用圖1 的寫法,則可以較容易分辨出每個for 語句和每個if 語句的作用域,而用圖2 的寫法則較難分辨,一旦程序行數(shù)較多,出錯的概率將大大增加.
圖1 程序?qū)懛?
圖2 程序?qū)懛?
另一方面,在實(shí)驗課中應(yīng)加強(qiáng)對學(xué)生的實(shí)驗指導(dǎo)尤其是算法方面的指導(dǎo),每次實(shí)驗前,針對實(shí)驗題目進(jìn)行一定的講解,重在幫助學(xué)生理順?biāo)悸?,引?dǎo)學(xué)生形成正確的編程思想,同時,在講解題目的時候注意融入算法思想的培養(yǎng),尤其在選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)等復(fù)雜編程題目的講授中,例如判斷一個數(shù)能否被3、5、7 中的其中兩個整除時,按常規(guī)方法,先判斷能否被3 和5 整除,再判斷能否被3 和7 整除……這樣編程就比較復(fù)雜,一個簡單的方法是,設(shè)定一個變量a,如果輸入的數(shù)能被3整除,a自加1,能被5整除,a自加1……最后只要判斷一下a是否不小于2(a是為可以被整除的個數(shù),=>2 就表示至少可以被其中兩個整除),就知道這個數(shù)是否符合條件,按這個算法編寫出的程序也簡單.再如雞兔同籠問題,解題方法可以用窮舉法先計算1 只雞(或兔子)是否滿足條件,若條件不滿足就試試2 只雞(或兔子)是否滿足條件……依此直到試到滿足條件或全部為只雞(或兔子)仍不滿足條件為止,也可以將腳數(shù)減去雞兔總數(shù)的兩倍,得到兔子數(shù)量的兩倍,最后推出雞的數(shù)目.
1)引導(dǎo)學(xué)生參加相關(guān)考試與競賽.根據(jù)各專業(yè)學(xué)生情況,調(diào)查篩選合適的計算機(jī)等級考試和比賽推薦給學(xué)生,引導(dǎo)學(xué)生參與自身專業(yè)相關(guān)的項目,學(xué)生在準(zhǔn)備考試或競賽的過程中,不但可以得到教師額外的輔導(dǎo)和幫助,一般情況下還可以得到學(xué)校在場地和設(shè)備方面提供的幫助,這些有利因素對學(xué)生提升自身編程能力幫助很大.
2)借助網(wǎng)絡(luò)資源.隨著網(wǎng)絡(luò)技術(shù)的普及,學(xué)生越來越多的接觸到以網(wǎng)絡(luò)尤其是移動網(wǎng)絡(luò)為代表的新媒體,網(wǎng)絡(luò)作為課堂教學(xué)的補(bǔ)充發(fā)揮了越來越大的作用.網(wǎng)絡(luò)信息來源豐富,種類繁多,僅嗶哩嗶哩網(wǎng)站有關(guān)C 語言的視頻資源就多達(dá)上百個,網(wǎng)絡(luò)信息打破了時間和空間的限制,在不調(diào)整課時的情況下,為學(xué)生的個性化學(xué)習(xí)創(chuàng)造了有利條件,有利于編程技術(shù)的傳播和編程經(jīng)驗的積累.
作為教師,在利用網(wǎng)絡(luò)資源提高學(xué)生編程能力上并不是一個旁觀者,對學(xué)生在網(wǎng)絡(luò)上的活動,要盡到引導(dǎo)員和監(jiān)督者的責(zé)任.學(xué)生的課余時間也是寶貴的,而網(wǎng)絡(luò)上的信息卻是無窮無盡的,這就要求教師對學(xué)生上網(wǎng)的行為進(jìn)行及時的引導(dǎo),對網(wǎng)上學(xué)習(xí)的內(nèi)容進(jìn)行篩選供學(xué)生參考,指導(dǎo)學(xué)生根據(jù)自身情況選擇適合自己的學(xué)習(xí)方式,例如介紹可供學(xué)習(xí)的網(wǎng)站、論壇,查詢資料的方法等等,使他們調(diào)動學(xué)生的積極性,使學(xué)生能夠在論壇、QQ群和貼吧等場所進(jìn)行學(xué)習(xí)交流討論過程中有目的有選擇地交流學(xué)習(xí)信息,解決具體問題,深化理解所學(xué)內(nèi)容,將寶貴的精力時間集中在對提高編程技能有幫助的地方.在引導(dǎo)的同時,加強(qiáng)對于學(xué)生在網(wǎng)上活動的監(jiān)督.作為課堂教學(xué)的補(bǔ)充,將課堂知識融入網(wǎng)絡(luò)實(shí)踐中,讓學(xué)生帶著問題上網(wǎng),可以有效避免學(xué)生不自覺地浪費(fèi)時間和精力.例如布置作業(yè)讓學(xué)生上網(wǎng)查找某個程序的問題,補(bǔ)全某段程序,等等.此外還可以通過不定期通過交流心得體會、提問有關(guān)事項等方法督促學(xué)生的網(wǎng)上學(xué)習(xí).
實(shí)施有關(guān)方法后取得的成效如下.
1)課堂教學(xué)方面,在走訪的幾個班級中,86%左右的同學(xué)表示程序行數(shù)較少時思路能夠跟上老師講解速度,除了課堂提問,有50%的同學(xué)有在QQ、貼吧向教師提問過,線上和線下提出的問題解決率都在95%以上,大部分同學(xué)反映這些方法有效解決了當(dāng)天教學(xué)中遇到的問題,避免了長期“消化不良”對后續(xù)學(xué)習(xí)造成不利影響.
2)實(shí)驗教學(xué)方面,對于規(guī)范書寫格式,根據(jù)有關(guān)班級實(shí)驗報告統(tǒng)計,有目的地進(jìn)行糾正能使學(xué)生程序格式規(guī)范在期末率達(dá)到80%以上,而沒有糾正的班級格式規(guī)范率不到20%.對于實(shí)驗指導(dǎo)與算法指導(dǎo),在對幾個班同學(xué)做的訪談中,幾乎所有的學(xué)生都認(rèn)為實(shí)驗指導(dǎo)有利于更快地解決實(shí)驗中的問題.批改的作業(yè)和實(shí)驗報告也表明,在有力指導(dǎo)下,幾乎所有的編程題目都用到2種或2種以上編程方法來解決,算法的靈活性之一,反映在對同一問題解決方法的多樣性[7].這表明學(xué)生對算法的講解有助于提高學(xué)生的編程水平,學(xué)生接受程度高.
3)增加實(shí)踐機(jī)會方面,通過走訪統(tǒng)計了解到,那些參加過等級考試或比賽的同學(xué)大部分都取得了優(yōu)異的成績,以我校參加多年的福建省大學(xué)生電子設(shè)計競賽為例,每年都有多人獲一等獎、二等獎,如表1所示.在后續(xù)的編程學(xué)習(xí)中往往表現(xiàn)出比其他同學(xué)更好的分析問題的能力,作業(yè)和實(shí)驗報告也顯示,在程序的書寫格式規(guī)范性和解題思路等方面不但優(yōu)于其他同學(xué),與參賽前比也有很大進(jìn)步.
表1 寧德師范學(xué)院2016—2018年參加福建省大學(xué)生電子設(shè)計競賽獲獎情況表
在利用網(wǎng)絡(luò)資源方面,接受調(diào)查的學(xué)生中,90%以上的學(xué)生認(rèn)為老師的引導(dǎo)和推薦大大加快了他們獲取知識的速度,對他們的編程學(xué)習(xí)有幫助,85%的學(xué)生認(rèn)為網(wǎng)絡(luò)上的知識提升了他們的編程水平.對布置的網(wǎng)上任務(wù)完成情況的統(tǒng)計表明,大部分同學(xué)能夠按時完成任務(wù),能將常見的編程模式和技術(shù)融入到自己的編程風(fēng)格中去,提高了自身的編程水平.
在C 語言教學(xué)中提高學(xué)生編程能力,使學(xué)生養(yǎng)成良好的編程習(xí)慣,不僅有利于學(xué)生的全面發(fā)展,也利于教師提高教學(xué)質(zhì)量和教學(xué)效率.為了更進(jìn)一步利于高院人才培養(yǎng)目標(biāo)的實(shí)現(xiàn),符合以人為本的科學(xué)發(fā)展觀.
提高學(xué)生C語言編程能力,除了離不開學(xué)校的在完善獎勵機(jī)制和開放場地等有關(guān)方面提供支持外,作為教師.一方面,教師可以將部分講座、習(xí)題分析等以視頻或文本等形式上傳學(xué)校教學(xué)網(wǎng)站或是有關(guān)論壇和視頻網(wǎng)站,擴(kuò)充教學(xué)內(nèi)容,另一方面,將出現(xiàn)的新情況新問題加入到量規(guī)設(shè)計考慮范圍內(nèi),例如書寫格式的規(guī)范程度,算法的使用、網(wǎng)絡(luò)知識的應(yīng)用等,讓學(xué)生的學(xué)習(xí)成果以成績的形式直觀地表現(xiàn)出來,既便于教師評估教學(xué)效果,調(diào)整教學(xué)計劃和教學(xué)方法,也利于形成長效機(jī)制.