張志俊
(中南民族大學 計算機科學學院,湖北 武漢 430074)
C語言應用能力、程序設計能力是對大學工程類本科學生最基本的要求,此要求越來越重要,甚至對眾多的非計算機專業都提出了相對應的教學要求。
將C語言及其程序設計方法的優秀特點——擅長符號化抽象性地描述問題;清晰結構化地求解問題;編輯編譯調試地解決問題;既嚴格規范科學,又不失語言交流性的書寫風格——作為課程學習的主要目標,課堂上詳細講解C語言要素,配以精煉的例程和實驗教學,基本上能較好地完成認知、理解和簡單使用C語言程序設計思想、方法的教學任務。許多高校相關專業,特別是非計算機專業的C語言程序設計課程,采取常規的或者改進的、混合的多種教學模式(如傳統羅列式、問題驅動式、微課/反轉課堂式、線上線下慕課式等)。課程教學內容和達到的教學目標大多如此,在達到的程度上會有一定的差異[1-4]。
通過對非計算機專業高年級和畢業學生的了解,大部分學生的C語言程序設計能力是極其有限的[2-4]:能閱讀一定的程序,但不能理解程序整體意圖;不懂得規劃程序結構、分解問題;對開發環境還比較陌生,只能以控制臺應用模式編寫練習程序;不能通過編譯結果看懂提示,不能通過DEBUG跟蹤流程、查看變量和數據來發現問題、糾正錯誤;甚至對程序設計一片空白等。究其原因,可能是學生投入的精力不夠,但更重要的是教學目標的設定不夠全面,教學內容、方法、考核形式上對學生形成自主學習、自主訓練的動力和壓力不足,教師在教學引導的方式上不夠適合。
不同高校、專業的C語言程序設計課程的教學目標、內容設置、基本知識的教學要求大致相同,只是在應用性、完整型、設計性能力上的要求有些差異。
中南民族大學公共基礎“C程序設計語言”課程(4學分),設置了較多的實驗機時(32學時),要求學生掌握結構化程序設計的一般方法,培養嚴謹的程序設計思想、靈活的思維方式和較強的動手能力;自動化類專業“程序設計語言”課程(3.5學分12實驗機時),要求學生掌握語法規范,了解程序設計基本思想、方法,培養靈活應用思想和方法分析、解決實際問題的能力。
清華大學自動化專業“計算機語言與程序設計”課程(3學分),強調客觀對象與抽象數據變量關系、計算機編程思維,強調編程規范和風格、指針應用訓練,強調DEBUG工具使用,注重培養程序設計思維方法與基本能力,強化解決實際應用問題編程能力的訓練[5]。
美國舊金山州立大學工程學院“工程師C語言程序設計”(Introduction to C Programming for Engineers)3學分,課堂100分鐘/周,實驗165分鐘/周。根據工程認證標準中對學生評價A、B、C、E的要求[6],結合基于微控制器的測量和控制的C程序設計,強調對問題的描述和分析、算法的設計、程序的實現、程序的測試、調試和維護、程序文檔的編輯等[7]。
對于工程應用型專業,將本類課程的教學目標和內容設定在對C語言及程序設計思想、方法的認知、理解和簡單應用上,遠遠不夠,還應該加以擴展,使學生達到三方面的能力要求:①較熟練地應用C語言、常用庫函數、開發環境,編寫、調試、實現完整的、較綜合的應用程序;②將本類課程的學習體驗和收獲作為開啟后續相關課程學習的契機,并觸類旁通地為專業可編程類技術性課程、專業應用軟件類課程、綜合性實踐教學等奠定程序設計和開發的基礎;③熟悉專業領域工程應用系統軟件一般性思路,了解行業對軟件開發、可編程器件程序設計的需求。
教學目的設想和要求:課程教學采取“在編程中學習C語言”的思路和方法,將C語言的學習融入程序設計之中。通過若干例程的詳細講授、操作演示、實際練習、調試實現等過程,達到學生較好地掌握主要編程技術和技巧的目的。學生有了程序設計的能力,從而附帶地學會了C語言的精華,初步具有規范性、專業性、藝術性的意識并得到體現,得到行業人士的認可。
課程不采取傳統課堂知識點傳授的模式,而以安排學習、模仿和練習項目例程的程序設計訓練為主,將C語言基本知識的學習主要交由學生課外自行來完成,教學內容見表1。項目例程由易到難,從趣味、游戲形式開始,逐漸向數據處理、典型工程應用、實時多任務調度、嵌入式應用過渡;涉及三種開發環境,從控制臺文本窗到圖形化窗口界面形式,再到Windows形式,再到虛擬單片機嵌入式應用。

表1 教學內容安排
教學實踐結合網絡教學平臺,通過課堂講解、課堂考核、課后練習作業的網絡提交與批閱、與項目例程混合的實驗演練、實驗報告撰寫與批閱以及在線答疑等環節完成。
采用校園網絡教學綜合平臺,通過平臺發布課程計劃、實驗安排、教學課件、各種資料、各類軟件資源以及每次的作業、實驗內容和要求,并指定提交截止時間。此外,要求學生:①準備個人電腦;②熟練掌握網絡教學平臺的使用;③自行準備和安裝相關軟件;④在實驗中及課后完成每次的編程練習;⑤截取程序代碼及運行效果圖片,按時在網絡上提交作業。
課堂教學采用多媒體手段,教學內容充實,主要內容包括:①演示編程環境搭建、軟件資源的應用;②演示例程運行效果,講解項目目的;③演示講解項目程序設計結構;④演示解釋程序代碼,講解C語言知識、常用系統函數及注意要點;⑤演示編譯、DEBUG調試過程,講解開發環境綜合使用;⑥課堂書面考核與解答;⑦學生作業批閱解釋與解答。
圖1列舉了幾個項目例程的運行效果,從中可以看到綜合性和工程應用性。
根據教學進程安排了若干課堂考核(見表2),每次考核時間10~20分鐘,書面提交,下次課堂上予以解答。這可以幫助學生理解基本知識,同時也起到課堂教學管理的作用。

圖1 項目例程運行效果

表2 課堂考核
教與學是一個互動過程,重要的是以學生為主體,引導他們主動或者被動地動心、動眼、動手、動腦、動口的自行行動起來。教師通過大量的代碼閱讀、模仿編程、綜合性程序修改,補充或自行設計練習、調試運行練習等形式的課后作業和實驗室當場演練,并配合網絡在線交互答疑、及時作業批閱,督促學生按進度完成教學過程,進而在項目演練中完成C語言程序設計工程應用性課程任務。課后作業和實驗內容安排見表3,完成作業和實驗練習,并以代碼截圖、調試運行效果截圖形成文檔,在截止時間前通過網絡教學平臺提交。
學生的課程學習綜合評價,通常是期末書面考試成績與平時成績按比例計算得到總評成績(例如7:3或6:4),平時成績一般由作業、實驗、到課情況等組成,期末書面考核所占比例較重。筆者采取了針對工程應用性的教學設計,加強平時多種學習過程的考核比重。
考慮與以往教學考核方式的銜接過渡,暫時保持期末書面考試(見表4),適當降低期末考試成績比例,按5:5合成總評成績。將學生在學習過程中的所有表現都作為因素計算到平時成績中(課后作業取8次最好成績占比30%,課堂考核取7次最好成績占比7%,課程參與占比3%,實驗效果及實驗報告占比10%)。強化平時的學習過程和效果,也有利于學生重視平時的訓練。
課后作業與實驗報告中的程序設計,除了要求程序運行結果和效果外,還特別要求規范性:目錄管理,用有含義的英文單詞命名,程序頭注釋,函數注釋,變量、代碼注釋,文件結束注釋,標識符、變量名、函數名等以英文單詞大小寫命名,語句縮進與對齊,操作符空格書寫,適當空格、空行等。

表3 課后作業及實驗安排

表4 期末書面考試
課程教學改革實踐探索與學生學習狀態反饋,對教學過程有了一些體驗和體會,值得下一步思考。
(1)課程教學的總體效果。一方面需要結合考試成績對全部因素的分析后加以對比,來進一步深入分析了解;另一方面還需要在將來較長時間段內,調研學生在后續的課程學習與實踐中、畢業階段的程序設計中的能力體現,來進一步深入地分析了解。
(2)期末書面考核的形式和內容可以在下一研究階段考慮改革和探索。工程應用型的教學已經將C語言及程序設計方法的學習,落實到平時過程的項目訓練中完成,通過演練強化了語法、規則、庫函數和技巧的應用,期末書面考試則可以弱化C語言基礎知識和程序設計基本能力的考察,而將重點放在用C語言、算法、C程序結構的思維,來考查學生對實際問題的描述、問題分析、程序設計、求解流程和過程管理等方面。
(3)課程要求學生具有一定的計算機基礎知識,機械專業班級未開設“計算機基礎”課程,軌道專業班級該課程與本課程同步開設,對本課程學習影響較大。筆者在實際教學中補充了相關知識,但省去了“嵌入式應用”環節的教學,留下了遺憾。
(4)開發環境DevCPP對于初學者是不錯的軟件,上手快,小巧易攜帶易安裝。該軟件已停止更新,功能不是非常完善,特別是調試功能相對較差,可考慮采用其他的開發環境。
(5)考慮借鑒舊金山州立大學“工程師C語言程序設計”的教學。在學習C語言基礎后,結合嵌入式微控制器,采用相應開發平臺,提供虛擬或實物運行對象,設計應用性模擬測量控制實際需求,來實現C程序設計過程的教學。
通過對具體實際應用問題的編程求解來設計教學,工程類應用型專業學生可以較好地將C語言程序設計知識、方法的學習融入項目訓練之中,提升自主學習的動力和效率,達到以學生為主體的教學效果。本課程改革針對C語言及程序設計類課程,擴展課程教學目標,采用大程序量的、系統的、綜合性的項目例程設計和實現作為主要教學內容和教學方式,課程教學改革開展了有意義的實踐和探索,積累了較豐富和有益的經驗。