鄭 征,吳云潔
(北京航空航天大學(xué)自動(dòng)化科學(xué)與電氣工程學(xué)院,北京100191)
C語(yǔ)言功能豐富、表達(dá)能力強(qiáng),而且使用靈活方便。目前,“C語(yǔ)言程序設(shè)計(jì)”課程已經(jīng)成為自動(dòng)化專業(yè)的必修課。然而,如何將C語(yǔ)言程序設(shè)計(jì)的教學(xué)原則和方法有效地融入自動(dòng)化專業(yè)相關(guān)背景和問(wèn)題中,進(jìn)而對(duì)“C語(yǔ)言程序設(shè)計(jì)”課程教學(xué)進(jìn)行改革是迫切需要研究和實(shí)踐的。
在自動(dòng)化專業(yè)中開(kāi)設(shè)“C語(yǔ)言程序設(shè)計(jì)”課程和在計(jì)算機(jī)專業(yè)中開(kāi)設(shè)相比,有以下特點(diǎn):①學(xué)生此前沒(méi)有學(xué)過(guò)其它程序語(yǔ)言;②在“C語(yǔ)言程序設(shè)計(jì)”課程結(jié)束之后,后續(xù)課程通常不開(kāi)設(shè)“數(shù)據(jù)結(jié)構(gòu)”和“算法理論”等;③和計(jì)算機(jī)專業(yè)學(xué)生相比,本專業(yè)學(xué)生參加程序設(shè)計(jì)和編碼等實(shí)際項(xiàng)目的機(jī)會(huì)較少。
在自動(dòng)化專業(yè)中開(kāi)設(shè)“C語(yǔ)言程序設(shè)計(jì)”課程,由于教材編寫(xiě)、課程自身特點(diǎn)、教學(xué)培養(yǎng)體系和學(xué)生知識(shí)結(jié)構(gòu)等原因,目前教學(xué)工作面臨如下諸多問(wèn)題。
很多學(xué)生誤認(rèn)為C語(yǔ)言是一種老語(yǔ)言,以后根本用不上。然而,有的學(xué)生在學(xué)習(xí)后發(fā)現(xiàn),在實(shí)際環(huán)節(jié)中對(duì)于常用的C++,C#等編程語(yǔ)言還未掌握,對(duì)于新的編程環(huán)境(例如Visual Studio 2010等)仍然不會(huì)使用。學(xué)生平時(shí)在使用電腦時(shí)面對(duì)的都是成熟的商用程序,看著教材中及自己在實(shí)驗(yàn)中編寫(xiě)的簡(jiǎn)陋的命令行程序,缺乏成就感。
(1)部分課程內(nèi)容脫離實(shí)際。C語(yǔ)言教學(xué)中語(yǔ)法知識(shí)非常多,課本上的實(shí)例講解和上機(jī)實(shí)驗(yàn)也都是在驗(yàn)證一些語(yǔ)法知識(shí),不能使學(xué)生認(rèn)識(shí)C語(yǔ)言的實(shí)用性。
(2)對(duì)于實(shí)際程序編寫(xiě)中一些重要的內(nèi)容缺乏講授。例如,較少講授正確的編程風(fēng)格和思想。比如:保持代碼的可讀性(自解釋的變量名、縮進(jìn)、注釋和不過(guò)分依賴運(yùn)算優(yōu)先級(jí)等)、模塊化思想及代碼重用等等。另外,對(duì)于編碼中最重要的調(diào)試過(guò)程也僅作一般性介紹。
(3)缺乏對(duì)經(jīng)典的算法和數(shù)據(jù)結(jié)構(gòu)的介紹,導(dǎo)致學(xué)生在了解了基本的語(yǔ)法之后,面對(duì)實(shí)際問(wèn)題往往不能取得較好解決方案。
現(xiàn)有的“C語(yǔ)言程序設(shè)計(jì)”教材沒(méi)有區(qū)分不同專業(yè)的特點(diǎn)和需求。大多是為計(jì)算機(jī)專業(yè)設(shè)計(jì)的,導(dǎo)致非計(jì)算機(jī)專業(yè)學(xué)生在學(xué)習(xí)過(guò)程中產(chǎn)生很多問(wèn)題。因?yàn)樽詣?dòng)化專業(yè)中沒(méi)有設(shè)置“數(shù)據(jù)結(jié)構(gòu)”、“算法設(shè)計(jì)”和“編譯原理”等課程。而目前C語(yǔ)言教材中對(duì)于編譯和鏈接等過(guò)程沒(méi)有提及或僅做簡(jiǎn)單介紹,因此讓學(xué)生對(duì)于程序的產(chǎn)生過(guò)程比較模糊。特別是當(dāng)編程鏈接過(guò)程出錯(cuò)時(shí),學(xué)生不知道如何修改程序來(lái)解決。
在非計(jì)算機(jī)專業(yè)中對(duì)于“C語(yǔ)言程序設(shè)計(jì)”計(jì)劃的學(xué)時(shí)相對(duì)較少,內(nèi)容多和實(shí)驗(yàn)環(huán)節(jié)要求高等矛盾比較突出。
除此之外,目前的考試更關(guān)注于在紙上寫(xiě)代碼或者考察語(yǔ)法知識(shí),對(duì)于調(diào)試、測(cè)試以及缺陷檢測(cè)等實(shí)踐中更重要的內(nèi)容缺乏檢查,而實(shí)際上很難寫(xiě)出可以運(yùn)行的程序。
C語(yǔ)言中的定義和語(yǔ)法比較多,學(xué)生難以理解和記憶。因此,教師在備課中要注意由這些定義和語(yǔ)法所構(gòu)筑的知識(shí)體系結(jié)構(gòu)性,在授課過(guò)程中隨時(shí)引導(dǎo)學(xué)生關(guān)注它們的核心概念和基本構(gòu)建思路。同時(shí),通過(guò)查閱不同版本教材中對(duì)同一定義的不同敘述方式,找出一種最能使學(xué)生接受的定義方式。對(duì)于一些比較難且未來(lái)使用較少的知識(shí),例如進(jìn)制轉(zhuǎn)換、補(bǔ)碼表示和指針運(yùn)算等,建議省略。
“C語(yǔ)言程序設(shè)計(jì)”的教學(xué)目的是使學(xué)生掌握C語(yǔ)言的基本語(yǔ)法、語(yǔ)句、控制結(jié)構(gòu)以及結(jié)構(gòu)化程序設(shè)計(jì)的基本思想和方法,使學(xué)生認(rèn)識(shí)到算法、良好的程序設(shè)計(jì)風(fēng)格以及實(shí)踐在本課程學(xué)習(xí)中的重要性,培養(yǎng)學(xué)生熟練使用高級(jí)語(yǔ)言分析和解決問(wèn)題的能力。更重要的是通過(guò)它作為嚴(yán)謹(jǐn)?shù)剡\(yùn)用公理系統(tǒng)進(jìn)行演繹思維訓(xùn)練與普通數(shù)學(xué)相平行的另外一種思維方法的訓(xùn)練,這能從根本上提高學(xué)生解決問(wèn)題的能力。
“C語(yǔ)言程序設(shè)計(jì)”課程內(nèi)容抽象,多樣化教學(xué)方式非常重要。雖然目前針對(duì)C語(yǔ)言的教學(xué)平臺(tái)有很多[1-3],但大多局限于教學(xué)管理、試題庫(kù)和講義庫(kù)等層面,難以實(shí)質(zhì)上提高教學(xué)效果。
國(guó)外對(duì)于類似計(jì)算機(jī)語(yǔ)言教學(xué)平臺(tái)的建設(shè)頗為有效。美國(guó)斯坦福大學(xué)有一個(gè)基于Java的教學(xué)平臺(tái),用于講授“編程方法學(xué)”[4]。這個(gè)平臺(tái)里,有一個(gè)叫Karel的機(jī)器人。學(xué)生可以給機(jī)器人編寫(xiě)Forward和Right等命令,控制機(jī)器人在地圖上的行動(dòng),整個(gè)行動(dòng)過(guò)程由一個(gè)窗口顯示出來(lái)。在地圖上,設(shè)有各種各樣的障礙。在編程過(guò)程中,教師帶領(lǐng)著學(xué)生,用if,for,while等語(yǔ)句,加上基本的移動(dòng)命令,可以幫助機(jī)器人克服障礙到達(dá)終點(diǎn)。這樣,學(xué)生不僅從一個(gè)較高的層次展示了編程的魅力,而且還順便學(xué)會(huì)了各種分支語(yǔ)句。
我們也計(jì)劃建立一個(gè)類似的教學(xué)平臺(tái),展露出一些高層的應(yīng)用程序編程接口(API),在課堂上進(jìn)行調(diào)用,和學(xué)生互動(dòng)解決一些問(wèn)題。這樣一個(gè)平臺(tái)能暫時(shí)掩蓋底層那些繁瑣的細(xì)節(jié)(如繪制窗口等),關(guān)注于編程思想本身。
為了培養(yǎng)學(xué)生的學(xué)習(xí)主動(dòng)性和學(xué)習(xí)興趣,很重要的一條是讓學(xué)生知道所學(xué)到的知識(shí)怎么應(yīng)用。因此,教師在課程的講授過(guò)程中應(yīng)該穿插一些相關(guān)知識(shí),例如軟件開(kāi)發(fā)的基本過(guò)程、用計(jì)算機(jī)求解實(shí)際問(wèn)題的基本過(guò)程、常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)以及算法的概念和描述方法等。除此之外,要注重讓學(xué)生掌握結(jié)構(gòu)化程序設(shè)計(jì)的基本思想和方法,而不需要過(guò)多的注重具體的語(yǔ)法。
我們認(rèn)為在“C語(yǔ)言程序設(shè)計(jì)”課程的教學(xué)過(guò)程中,在講解分析語(yǔ)法的基礎(chǔ)上結(jié)合本學(xué)科應(yīng)用非常重要的,適當(dāng)穿插介紹一些知識(shí)點(diǎn)在自動(dòng)化專業(yè)中的應(yīng)用,讓學(xué)生充分認(rèn)識(shí)到C語(yǔ)言程序設(shè)計(jì)與自動(dòng)化科學(xué)的密切關(guān)系。例如在部分章節(jié)的講述中,通過(guò)比較引入對(duì)Matlab及其相關(guān)語(yǔ)言的介紹。同時(shí),適時(shí)地將最新研究成果引入教學(xué)過(guò)程(例如機(jī)載軟件自動(dòng)化調(diào)試技術(shù)),將授課內(nèi)容與實(shí)際的科研項(xiàng)目緊密聯(lián)系,既可以使授課內(nèi)容更加全面。
“C語(yǔ)言程序設(shè)計(jì)”課程中有很多定義、語(yǔ)法以及程序片段,對(duì)學(xué)生而言,很容易產(chǎn)生畏難情緒。因此在講課時(shí),我們要用啟發(fā)式教學(xué),要多使用例子來(lái)講解和分析復(fù)雜多樣的概念和規(guī)則,從計(jì)算機(jī)存儲(chǔ)或者編譯等角度來(lái)解釋為何需要這樣的語(yǔ)法格式。同時(shí),通過(guò)課堂和課后練習(xí)讓學(xué)生漸進(jìn)地掌握這些概念和規(guī)則,領(lǐng)會(huì)它們與所學(xué)專業(yè)的關(guān)系。
我們?cè)谡n堂上,對(duì)于抽象的東西應(yīng)該形象、直觀地進(jìn)行講解,對(duì)于關(guān)系復(fù)雜的內(nèi)容應(yīng)注意其條理性,對(duì)于易于混淆的內(nèi)容宜盡量采用對(duì)比法加于區(qū)別,作到化難為易。例如,在主流的程序語(yǔ)言中僅需要利用分支語(yǔ)句、循環(huán)語(yǔ)句和函數(shù)調(diào)用再輔以結(jié)構(gòu)體就可以解決大部分問(wèn)題。因此,這些基本內(nèi)容應(yīng)當(dāng)作為重點(diǎn)來(lái)介紹語(yǔ)法規(guī)則和設(shè)計(jì)思想,而對(duì)運(yùn)算符的優(yōu)先級(jí)等細(xì)節(jié)問(wèn)題應(yīng)當(dāng)盡量縮減課時(shí)。
“C語(yǔ)言程序設(shè)計(jì)”課程內(nèi)容抽象,在教學(xué)過(guò)程中,多樣化教學(xué)方式非常重要。部分授課內(nèi)容可以編寫(xiě)實(shí)際運(yùn)行的程序,有助于知識(shí)的消化和理解。此外,要注意圖示化方法在教學(xué)過(guò)程中的使用。
學(xué)習(xí)“C語(yǔ)言程序設(shè)計(jì)”的目的是為了讓學(xué)生遇到實(shí)際問(wèn)題時(shí)具有良好的程序設(shè)計(jì)和編碼能力。因此,在C語(yǔ)言程序設(shè)計(jì)課程的部分章節(jié)中,應(yīng)該由項(xiàng)目引出教學(xué)內(nèi)容,在學(xué)習(xí)基礎(chǔ)理論知識(shí)的同時(shí),講解項(xiàng)目實(shí)施過(guò)程。
雖然C,C++和C#三種語(yǔ)言語(yǔ)法基本上是一樣的,不過(guò)具體的內(nèi)容差別較大。此外還有很多像Python和Perl等高級(jí)的腳本語(yǔ)言,其本質(zhì)內(nèi)容和C語(yǔ)言也是一致的,所不同的是語(yǔ)法規(guī)則上的細(xì)微差異以及語(yǔ)言自身所實(shí)現(xiàn)的基本庫(kù)不同。因此,在授課過(guò)程中,我們應(yīng)該注意介紹這些新的知識(shí)及將其和C語(yǔ)言進(jìn)行比較。此外,還要培養(yǎng)學(xué)生養(yǎng)成查找手冊(cè)和幫助的習(xí)慣與能力,從而更好地適應(yīng)當(dāng)前編程語(yǔ)言迅速發(fā)展的要求。
教師要把自動(dòng)化專業(yè)的“C語(yǔ)言程序設(shè)計(jì)”這一門(mén)課教好,就要結(jié)合本專業(yè)特點(diǎn)不斷研究新的教學(xué)方法,認(rèn)真掌握教學(xué)規(guī)律,并借助于現(xiàn)代化教學(xué)手段,提倡啟發(fā)式教學(xué)。我們只要具有扎實(shí)的理論功底,并具有對(duì)學(xué)生高度負(fù)責(zé)的精神,就一定能夠找到較好的方法調(diào)動(dòng)學(xué)生的學(xué)習(xí)積極性,從而達(dá)到良好的教學(xué)效果.
[1] 盧峰,高春穎.基于網(wǎng)絡(luò)化教學(xué)平臺(tái)的C語(yǔ)言實(shí)踐教學(xué)[J] ,廣州:現(xiàn)代計(jì)算機(jī),2011,3:71-73。
[2] 梁志劍.計(jì)算機(jī)語(yǔ)言類課程網(wǎng)絡(luò)教學(xué)平臺(tái)的建設(shè)[J] .北京:中國(guó)電力教育,2009,4:74-75。
[3] 彭金蓮.基于WEB的C語(yǔ)言程序設(shè)計(jì)網(wǎng)絡(luò)教學(xué)平臺(tái)的實(shí)現(xiàn)[J] ,儋州:華南熱帶農(nóng)業(yè)大學(xué)學(xué)報(bào),2004,10:56-60。
[4] 斯坦福大學(xué)公開(kāi)課:編程方法學(xué),http://v.163.com/special/sp/programming.html