顏 佳,王泉德,艾 波
(1.武漢大學電子信息學院 湖北 武漢 430072;2.武漢工程大學 湖北 武漢 430205)
目前大多數高校將“C語言程序設計”作為電子信息類專業的專業必修課程,授課對象往往是大一新生。該課程主要介紹了程序設計的基本思想和基本方法,其教學環節主要包括理論教學和實踐教學。課程為后續專業課程的學習和實踐奠定了程序設計的基礎,為培養電子信息類專業人才服務[1-2]。作為具有較強實踐性的課程,該課程的實踐教學環節占有很大的比重,以提高學生的程序設計和編程能力。本文在電子信息類專業C 語言程序設計實踐教學中,探索根據本專業的特點和人才培養要求,以學生為中心,以專業能力為本位,在教學內容的設計和考核的方式上進行研究和實踐,從而在鍛煉學生編程思維的同時提高學生的專業認知度,為后續的專業課學習,學科競賽和科研打下堅實基礎。
目前電子信息類專業的C 語言程序設計課程的教學采用以掌握程序設計的基本概念為基礎,以基本算法實現為指引,以提高使用計算機高級語言設計和實現算法的能力的培養為中心,引導學生掌握程序設計的方法。通過上機實踐培養學生編寫代碼能力,同時使學生具備代碼查錯、簡單調試的能力,培養學生使用計算機解決實際問題的能力。但是,實際的實踐教學環節中存在以下問題:
目前市面上還沒有專門針對某一具體專業背景的C語言程序設計教材。因此,設計實踐教學內容時完全以通識類教材為主,那么實踐內容就往往圍繞著“數據的各種運算和處理”,“字符串的各種處理”等來展開[3-4]。這種傳統內容的反復演練不僅會導致學生失去對本專業的學習興趣和自信心,缺少專業學習的動力,甚至產生對電子信息類專業的“誤解”。不少學生在多次上機后會說他們是“用著Visual Studio,干著Excel 的活”。因此,為了使大一新生迅速了解其專業特點和需要掌握的專業技能,并提升他們對本專業的興趣,在本課程的實踐教學中需要融入更多具有專業特色的案例或問題。這樣,一方面可以讓學生學習更有目標性;另一方面也能夠提早使學生適應專業實踐方式,提升專業的認同感和學習的自信心。
本課程的實踐教學通常在理論教學的某個知識點或章節講授完成后進行。例如,講授完循環結構后會設計若干道編程題目來掌握單層和雙層循環結構和相關控制語句。講授完數組后也會設計若干題目來掌握一維和二維數組的定義和使用。但是,這兩次實驗內容的設計往往是獨立的,或者無相關性。這種形式確實可以鍛煉學生的編程能力,但由于貫穿性不夠,無法使學生深刻體會新知識強相關性的優勢以及培養學生從小問題到大項目的連續性問題解決能力。
目前,本課程實踐教學的考核方式通常是:教師每次為學生布置上機題目,學生在指定時間內完成并根據完成情況獲得分數[5-6]。這種方式的好處是學生分階段完成知識點的學習任務,有助于學生及時掌握知識點并使教師及時了解學生的編程能力。但是這種單一的考核形式有礙于學生綜合素質的培養,對優秀學生的激勵性較差,并且對后續學生參與大學生電子設計競賽,“互聯網+”創新創業大賽等學科競賽和科研項目的能力培養不夠。
針對此類問題已有很多研究,例如課程設計改革,實踐教學手段和教材等[7-12],并取得了一定的成果。但是上述研究大多沒考慮C 語言程序設計與電子信息類其他專業課程之間的關系,而作為一門專業基礎課程,這恰恰是本課程教學中需要重點面對和解決的問題。本文從本課程的實踐教學入手,結合電子信息類專業特色,從實踐教學內容設計和教學考核方式兩個方面進行探索和研究。
本課程的實踐教學按照理論教學的順序共安排8 次。每次上機實踐內容如表1 中所示,所涉及的知識點主要包括C 語言的三大基本結構(順序,選擇與循環結構),數組,函數,指針和結構體等。每次上機題目為10 道左右,難度從易到難,并且每次上機均導入與電子信息類專業某門專業課有關的題目1―2 道。這些題目來自專業課的具體教學內容但是進行了適當簡化,來適應每次上機實踐的要求。例如“單片機原理與應用”“數字信號處理”“數字圖像處理”“語音信號處理”和“通信原理”等課程就是否適合提取出相應的專業問題來給大一的學生嘗試實現。表1 中給出了每次實踐內容中所涉及的專業特色題目(表中僅列出了部分題目)及其來源。從學生角度出發,我們選取的專業課程以信號類課程為主,考量的原因是這類問題中有些知識點理論相對簡單,處理過程及結果直觀,更容易讓還沒有專業知識背景的大一學生所接受。這樣一來,不讓他們產生懼怕心理,能讓學生將C語言知識拓展到實際應用中。

表1 C 語言程序設計上機實踐內容中的專業特色問題
例如,在第一次上機內容中除了常規的順序和選擇結構程序題目外,還增加了RGB 和HIS 顏色空間轉換的題目,該題目來自我院電子信息類專業學生大三所需學習的“數字圖像處理”課程中的“彩色圖像處理”章節。該轉換公式利用選擇結構,輸入和輸出語句即可完成,比常規題目更容易讓學生提前了解到以后專業領域要研究的具體問題;在第二次上機內容中除了常規的“數據求和”等循環結構經典題目外,還增加了“周期信號的產生”這一問題,該問題選自于專業必修課程“數字信號處理”。該題目要求學生設計一個程序能產生正弦和余弦信號,該問題利用循環語句即可完成,并且能夠使學生對數字信號有初步認識,如果配合一些庫函數的使用,學生還能直接將所產生的信號波形繪制出來,形成從代碼到圖形的直觀認識。第三次上機中引入了經典的直方圖均衡化操作處理。直方圖均衡化是一種常用的圖像灰度調整操作,例如可以用來解決圖像的過曝和曝光不足的問題。在這門課中,我們不會過多地講解專業知識,而是給出具體方法,讓學生編程實現均衡化的過程并分析比較處理前后直方圖分布的不同,再進一步地思考這種新的分布對圖像所引起的變化。
目前,在C 語言程序設計的實踐課中,每次的上機題目之間往往沒有相關性和繼承性,即之前練習過的問題在后續上機中并沒有進行深入和延展。這樣的教學安排不利于學生對課程整體性的把握,也不利于培養學生鉆研問題的能力,而這種能力在高年級的專業課學習或競賽科研中尤為重要。因此,我們采用了一種遞進式的實踐教學方式,即對于某一專業問題,我們對問題進行分解和簡化,然后依據教學進度,在若干次上機中難度逐步遞增地讓學生進行思考和設計,最終培養起能解決這一專業問題的能力。
例如,我們幾乎在每次上機內容中均安排了與“信號濾波”相關的題目,經過多次練習,在最后一次的綜合訓練中,學生能真正完成一個圖像空間域濾波程序,包括均值濾波和中值濾波等,并能比較上述兩種濾波方法的處理效果,這一問題正是專業課“數字圖像處理”中的核心教學內容。該案例的遞進式實踐內容安排如表2 所示。從表中可以看出,實踐題目的安排從三個數據的處理可以采用三個變量的方式完成,到十個數據的處理時就必須采用循環結構來完成,到需要保存原始數據時就必須使用數組的知識點來完成,到二維數據時就得借助二維數組來完成,到最后圖像二維數據的綜合處理需要加上函數及指針等章節的知識。從一維信號到二維信號;從在主函數中完成所有工作到將濾波器設計成單獨函數來完成程序。這樣的安排有利于學生逐步了解專業性問題,并且易上手,易實踐,調動了學生的學習積極性。遞進式的實踐教學安排能夠使所學知識點和程序設計方法的練習更有目的性,加深學生對不同知識點之間聯系的理解。

表2 “信號濾波”的遞進式實踐教學安排
C 語言程序設計課程是一門實踐性很強的課程,通常其實踐教學部分的考核方式是每次上機實踐后提交上機報告進行評分。這種考核方式由于不需要學生當場完成編程任務并檢查,導致教師不能準確掌握學生的真實編程能力。我們采用了形式豐富的實踐教學考核方式:平時的現場考核,學生講解問題和小組合作等。多元化考核方式不但能明確地反映學生在學習過程中哪個環節薄弱,及時補漏,而且還能激發學生自主學習的積極性。
每次上機實踐時,為學生布置上機題目,學生在指定時間內完成并根據答題數量和質量實時獲得成績。每次上機實踐的內容不超出已授課的知識點范圍,使得學生能夠反復練習某種編程思想,并熟練應用。這種分階段地完成各個知識點的學習并在規定時間內完成考核任務,不僅有助于學生及時掌握自身編程的不足,也能讓教師及時發現學生上機中的共性問題,在后期教學中進行調整和講授。
C語言的課堂教學過程中往往采用的是“教師講,學生聽”的灌輸式教學法。那么在實踐教學環節中,可以采用“學生講,大家聽”的方式來對課堂教學方式進行補充。對于每次上機中具有代表性的題目,教師可以選取其中完成較好的學生來給大家講解其思考過程,程序框架和實現代碼,并讓其他學生來對其程序進行提問,最后教師來總結。例如每次上機內容的最后1―2 道問題往往涉及一些算法和思維方式的選取,合適的算法才能較快地解決問題。而學生們盡管都會編出程序得到正確結果,但他們的思路是百花齊放的,其中有的程序既簡潔又高效,這種程序就可以拿出來給學生講解。這樣,學生不再只是被動地接受教師傳授的知識,他們能積極與教師配合,主動參與到教學活動中,使自身的學習能力和綜合素質不斷提高。
無論是本專業后續的專業課實踐中,還是大學生電子設計競賽等活動中均需要學生以團隊的形式完成某一項任務。基于此,考慮到前七次實踐均是學生獨立完成所有上機題目的編程,所以在最后一次“綜合訓練”實踐中,鼓勵學生組成小組,自行討論并確定題目,自行分配組員任務,團結合作,共同完成考核任務。例如五子棋游戲設計這一問題,每個小組若由三人組成,那么他們的分工可以采用如下的形式:一人負責整體框架的設計和主函數的編寫及函數參數的設計;一人負責棋盤的繪制函數;一人負責判斷游戲是否結束及下子是否合理函數的設計。這樣的安排,他們就必須以團隊的形式進行合作、討論甚至爭辯,最終形成一個完整的作品。這一考核形式不僅激發了學生的團隊合作精神,也更符合他們未來從事程序開發工作的形式。
我們對我院2015―2017 級三個試點班學生的C語言程序設計基礎期末成績進行了分析與統計,如表3 中所示。其中2015 和2016 級學生采用的是標準的實踐教學形式,2017 級學生采用的是導入了專業特色教學內容和考核方式的形式。從考試成績看,2017 級學生取得優秀(90-100分)的學生成績比例在50%左右,不及格人數僅為1 人。對比可以看出:在實踐教學中引入了專業特色內容后,學生對課堂知識的掌握程度和編程能力提升明顯。

表3 2015―2017 級試點班學生C語言程序設計期末成績分布
我們對2017 級該班學生進行了跟蹤調查,還分析了他們后續專業課學習,學科競賽和科研等情況。從數據可以看出,2017 級該班學生的整體專業能力有了大幅提升,其中專業課平均成績超過90 分的學生占32%,超過30 人主持或參與了國家級及校級大學生創新創業項目,發表論文十余篇,申請專利超過30 項;獲得校級以上學科競賽獎項60 余項。正是由于他們在大一的C 語言程序設計實踐中更早地了解了本專業課程,產生了專業認同感,進而引發了他們對專業課程學習的興趣,參與學科競賽和進入實驗室從事科研活動的熱情。這也證明了本文提出的實踐教學研究的突出效果。
在電子信息類專業學習中,C 語言程序設計課程的學習是為后續課程服務的。針對該專業中C 語言程序設計實踐教學存在的專業特色缺乏,實踐內容貫穿性不夠和考核形式單一等問題,本文分別從多層次的實踐教學內容設計和形式多樣化的教學考核方式兩方面進行了探索和研究。在實踐教學內容的設計上主要采用了專業知識的逐步導入和遞進式的實踐教學實施等方法,在教學考核上主要采用了現場考核,學生講解及小組合作等形式來實現考核的多樣化。這樣的做法能夠使得大一學生在完成C 語言程序設計課程的同時,提高其專業認知度和學習興趣,為后續的專業課學習,競賽和科研打下堅實基礎。