摘要:從計算機專業(yè)課程體系角度出發(fā),結(jié)合高校高級程序設(shè)計語言的現(xiàn)狀和本校計算機與通信工程學(xué)院“卓越工程師計劃”的實施,以及在本校計算機與通信工程學(xué)院和軟件學(xué)院對本課程體系結(jié)構(gòu)進行的改革創(chuàng)新,提出C語言與計算機相關(guān)課程的融合教學(xué)和融合實踐理念。經(jīng)過4年的檢驗與論證,新的融合教學(xué)和融合實踐兩個環(huán)節(jié)都取得非常好的效果,加強計算機各課程之間的聯(lián)系,對培養(yǎng)學(xué)生的自學(xué)與綜合能力有積極作用。
關(guān)鍵詞:C語言;課程體系;融合教學(xué);融合實踐;卓越工程師計劃;ACM/ICPC
C語言程序設(shè)計既是高等學(xué)校一門重要的公共基礎(chǔ)課程,也是計算機專業(yè)的一門專業(yè)基礎(chǔ)課。由于邏輯性和實踐性強,使該課程的教學(xué)和實踐存在一些誤區(qū),主要表現(xiàn)如下。
1) 學(xué)生不清楚本專業(yè)的特點。多數(shù)高校將本課程安排在大一的第一學(xué)期,由于對于本專業(yè)的課程體系了解不夠,導(dǎo)致新生對各專業(yè)特點混淆不清,有的學(xué)生去報考計算機等級考試,結(jié)果有的還不如非計算機專業(yè)的學(xué)生,致使一些學(xué)生學(xué)習消沉。我們通過和學(xué)生談心,得知不只是大一有這種現(xiàn)象,大二的學(xué)生甚至也存在這種心理[1]。
2) 學(xué)生學(xué)習本課程目的不明確,興趣不高。在教學(xué)中,有不少學(xué)生問,既然C#和Java是現(xiàn)在的主流編程語言,為什么還要讓我們學(xué)習C語言?所以我們在第一堂課介紹計算機語言發(fā)展時,將C語言和其他語言作比較,強調(diào)C語言是當前程序員共同的語言,它使程序員互相溝通,比流行語言都更接近機器。C語言更適合解決某些小型程序的編程,在編寫底層的設(shè)備驅(qū)動程序和內(nèi)嵌應(yīng)用程序時,往往是更好的選擇。有了C的基礎(chǔ),在需要時進一步學(xué)習其他語言,也是很容易過渡的。當然,第一堂課上,我們把重點放在培養(yǎng)學(xué)生的興趣上,所以會用1個學(xué)時去展示歷年實訓(xùn)的優(yōu)秀作品,這些作品都是完整的系統(tǒng),除了包涵基礎(chǔ)知識,還有高級技術(shù)。我們向?qū)W生灌輸學(xué)習這門課程的境界:Beginner—Advanced—Professional。
3) 任課教師對課程的定位、理解和把握不夠。老師只有有一桶水,才能教給學(xué)生一碗水,教得了學(xué)生不等于教得好學(xué)生,學(xué)生的評教正說明了此問題。
通過實踐,我們對計算機專業(yè)本課程教師的要求是:“復(fù)合型”的教師——既要精通這門課程,還要有3年以上實際項目開發(fā)經(jīng)驗,并且非常熟悉計算機其他學(xué)科的知識,而“教師的成功在于培養(yǎng)出值得自己崇拜的人[2]”。
因此,我們對本課程的定位是,以程序設(shè)計為中心,掌握語法,了解算法,重在算法的實現(xiàn)——編程。算法是靈魂,語法是基礎(chǔ),編程是中心。處理好三者的關(guān)系,直接決定了教學(xué)的成敗。
算法盡管重要,但本課程不是算法設(shè)計課程,不可能過多地介紹算法,更不是在研究算法。我們要在學(xué)生學(xué)習編程的過程中,介紹相關(guān)的典型算法,引導(dǎo)學(xué)生面對問題去思考如何構(gòu)造算法,編寫程序的過程本身就是設(shè)計算法的過程。
為此,我們對本課程體系進行了改革,并將本課程與計算機其他學(xué)科進行了融合教學(xué)與實踐,取得了非常好的效果。
1課程體系的改革
1) 修改教學(xué)環(huán)節(jié)。
我們把原計劃一學(xué)期的教學(xué)時間調(diào)整為一學(xué)年。第一學(xué)期進行C語言程序設(shè)計基礎(chǔ)的教學(xué),第二學(xué)期進行C語言程序設(shè)計的進階教學(xué),在學(xué)年末進行該門課的實訓(xùn),接著的暑假進行校外實習。根據(jù)不同專業(yè),我們還開了小學(xué)期,在小學(xué)期里有連續(xù)12周的實驗環(huán)節(jié)。
2) 修訂培養(yǎng)計劃和大綱,改革考核方式。
我們把本課程的教學(xué)改革與本學(xué)院的“卓越工程師計劃”相結(jié)合,組織教師外出考察、研討,然后重新修訂了培養(yǎng)計劃、教學(xué)大綱、實驗大綱、實訓(xùn)大綱、實習大綱。相應(yīng)地,考核方式也作了調(diào)整:基礎(chǔ)教學(xué)由筆試轉(zhuǎn)向機試,試題難度高于非計算機專業(yè)的等級考試,每次考試的題庫都將重新命題和審閱。進階教學(xué)由考試轉(zhuǎn)向完成3 000行以上大作業(yè)形式的考查,實訓(xùn)由過去的全班一個模擬題目轉(zhuǎn)向提供多個實際驗收簽定過的項目,進行C版本的再次開發(fā),實習由過去的只是到實習基地參觀調(diào)整為直接進企業(yè)拜師跟班學(xué)習。
3) 豐富配套的教學(xué)資源。
我校組織編寫了《C語言程序設(shè)計基礎(chǔ)及進階教程》,被評為“十一五”國家級規(guī)劃教材,已于2010年由清華大學(xué)出版社出版發(fā)行。我們還配套編印了上機實驗的實踐教程(將在今年教材的第二版時一并出版),以及實訓(xùn)時的實訓(xùn)教材和實習的實習教程,并建設(shè)了精品課程在線學(xué)習平臺,供師生討論和交流。制作了與教材配套的課件與教案,供教學(xué)參考。
我們專門搭建了學(xué)校ACM/ICPC在線測評平臺,并組建了容納120人的競賽專用機房,成立了ACM/ICPC競賽班。2008年起,河南省計算機學(xué)會主辦一年一次的河南省大學(xué)生程序設(shè)計競賽,我們每年都組隊參加,在過去的三屆競賽上,共獲得4枚金獎、2枚銀獎、1枚銅獎。2009年參加亞洲區(qū)賽現(xiàn)場賽獲得優(yōu)秀獎。2010年參加第35屆亞洲區(qū)賽,通過預(yù)賽,獲得天津賽區(qū)、杭州賽區(qū)和成都賽區(qū)的決賽資格,并在成都賽區(qū)獲得1枚銅牌,排名第59名,是河南省該項賽事最好成績,為學(xué)校爭得了榮譽。在學(xué)校內(nèi)部,我們從2009年開始每年組織兩次全校程序設(shè)計競賽,至今已經(jīng)主辦了四次校級競賽。
4) 轉(zhuǎn)變教學(xué)理念。
我們提出了C語言與計算機相關(guān)課程的融合教學(xué)與實踐的教學(xué)理念。
5) 采用新的教學(xué)方法。
在課堂教學(xué)中,我們使用任務(wù)驅(qū)動、課堂討論、3W1H教學(xué)法、現(xiàn)場編程教學(xué)法、課堂陷阱教學(xué)法、任務(wù)分解教學(xué)法、任務(wù)貫穿教學(xué)法、分散集中教學(xué)法、兩段教學(xué)法、實訓(xùn)優(yōu)秀作品展示激勵法、融合教學(xué)法等多種教學(xué)法,在課外使用網(wǎng)上在線討論與答疑、競賽輔導(dǎo)撥高法、課題組觀摩討論法。我們打破大學(xué)考試試卷不評講的一貫做法,在第二學(xué)期的進階課程第一堂課評講上學(xué)期期末試卷[3]。
(1)3W1H教學(xué)法。即:What——解決什么問題,Why——通過實際生活例子引入為什么要解決這個問題,Where——在什么條件下能夠解決,How——如何運用學(xué)到的方法、技術(shù)來解決問題。
(2) 現(xiàn)場編程教學(xué)法。在講授有代碼編寫的理論課時,當一個理論知識介紹完后,教師出一個難易程度適當且有代表性的題目,讓學(xué)生隨堂寫代碼,并抽學(xué)生到黑板上寫,或者抽幾份學(xué)生作業(yè)當場點評。
(3) 課堂陷阱教學(xué)法。在期中檢查座談會上,有的老教師說學(xué)生很難發(fā)現(xiàn)自己程序的錯誤,而課堂上即使是老師手下的一個筆誤,學(xué)生也能發(fā)現(xiàn)并喊錯了。我們正是可以利用學(xué)生這種“容許自己范錯,不許老師失誤”的習慣,對于學(xué)生書寫代碼時容易出錯,或者上機碰到的共性問題,我們在課堂上演示時設(shè)下陷阱,故意把代碼寫錯,有的學(xué)生當時就能發(fā)現(xiàn),而有的學(xué)生在編譯時才發(fā)現(xiàn)有錯,我們用自己的錯誤來吸引學(xué)生注意力,加深學(xué)生的印象。
(4) 課題組觀摩討論法。我們組織本課題組教師每兩周進行一次教學(xué)觀摩討論,取長補短,相互學(xué)習,推廣好的教學(xué)方法。
(5) 實訓(xùn)優(yōu)秀作品展示激勵法。我們在第一學(xué)期基礎(chǔ)課程的第一堂課上展示往屆的優(yōu)秀實訓(xùn)作品,讓學(xué)生覺得既好奇又深奧,極大地激勵了學(xué)生的興趣。臨到畢業(yè),大部分學(xué)生還能對這堂課記憶猶新。
2與計算機相關(guān)課程的融合教學(xué)
通過近5年的實踐與總結(jié),我們認為如果把C語言程序設(shè)計與計算機相關(guān)課程進行融合教學(xué),必將促進學(xué)生對該門課程的理解,同時凝聚專業(yè)特色,促進其他課程的學(xué)習,對于學(xué)生的自學(xué)與綜合能力的培養(yǎng)都有積極的作用。
1) 與數(shù)據(jù)結(jié)構(gòu)融合。
在講到C語言中的基本數(shù)據(jù)類型與構(gòu)造類型時,圍繞數(shù)據(jù)結(jié)構(gòu)的一條主線——四種結(jié)構(gòu)兩種存儲,聯(lián)系數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)類型,在抽象數(shù)據(jù)類型ADT中只定義了基本操作,復(fù)雜的操作是通過基本操作實現(xiàn)的。在抽象數(shù)據(jù)類型中定義的操作與C語言中的各種類型的運算,比如取余運算符“%”,在C語言中僅限整數(shù)。在講到查找與排序時,對照數(shù)據(jù)結(jié)構(gòu)中的查找與排序,介紹一些經(jīng)典和效率高的算法。在講到遞歸函數(shù)調(diào)用時,用數(shù)據(jù)結(jié)構(gòu)中的遞歸調(diào)用時棧的進棧出棧變化過程講解。在講到scanf函數(shù)和其他讀取字符函數(shù)時,將內(nèi)存與鍵盤輸入緩沖區(qū)結(jié)合,使學(xué)生更容易理解數(shù)據(jù)的輸入格式。
2) 與操作系統(tǒng)融合。
在講到變量的數(shù)據(jù)類型及變量的存儲類型時,結(jié)合操作系統(tǒng)的內(nèi)存結(jié)構(gòu),講解內(nèi)存區(qū)域分為6個不同的部分來存儲不同的數(shù)據(jù),使學(xué)生了解內(nèi)存組織的有序性。特殊地,寄存器變量不占內(nèi)存,而字符串常量存放在符號常量區(qū),通過講解內(nèi)存結(jié)構(gòu),學(xué)生就明白靜態(tài)變量為什么第一次使用時會初始化,以后再使用時用的是上一次的值。在講解數(shù)組的連續(xù)存儲、鏈表的動態(tài)存儲時,結(jié)合內(nèi)存就會理解得更透徹些,甚至可補充內(nèi)存中堆與棧使用的知識[4]。
3) 與計算機組成原理融合。
入學(xué)時,教師介紹計算機發(fā)展,一般都會講到馮?諾依曼原理,那么為什么要學(xué)習語言呢?還得從計算機組成原理來講,從電腦城裝配電腦介紹起,首先運用BIOS程序,然后再啟動操作系統(tǒng),最后再運行用戶的應(yīng)用程序。而BIOS程序、操作系統(tǒng)和應(yīng)用軟件都是用語言開發(fā)出來的軟件,之前都曾經(jīng)有過C語言版本,BIOS現(xiàn)在還是C語言編寫的,而操作系統(tǒng)的一些內(nèi)核也還有C語言的許多代碼。因為大一第一學(xué)期的計算機科學(xué)導(dǎo)論與本課程是同步開設(shè),學(xué)生對計算機的了解還是有限的。同樣地,在講到C語言的三種進制數(shù)、位運算、指針時,與計算機的字長、補碼運算、指令加以對照,就容易理解些。
4) 與面向?qū)ο笳Z言融合。
掌握好一門語言,可以自學(xué)其他語言。做到這點不容易,因為大學(xué)專業(yè)課的特點是學(xué)一門結(jié)一門,沒有哪所大學(xué)或哪個專業(yè)開設(shè)了所有語言,所以在語言課之間融合對照學(xué)習,會收到非常好的效果。比如講到結(jié)構(gòu)體時,與面向?qū)ο笾械念悓φ?,將結(jié)構(gòu)體變量與對象對照,就比較好理解數(shù)據(jù)類型和類不占內(nèi)存,對象與變量占內(nèi)存了。講到函數(shù)時,與方法對照,講到函數(shù)參數(shù)時,補充面向?qū)ο笾幸玫氖褂?,對將來學(xué)習面向?qū)ο笳Z言和數(shù)據(jù)結(jié)構(gòu)非常有益。
5) 與數(shù)據(jù)庫原理融合。
程序所需數(shù)據(jù)從哪兒來?運行結(jié)果保存到哪兒去?在講到文件操作時,將C語言中用到的文件與數(shù)據(jù)庫中數(shù)據(jù)文件作比較,再聯(lián)系結(jié)構(gòu)體成員與數(shù)據(jù)庫中的字段、記錄,使學(xué)生對程序的理解更完整一些。
6) 與編譯原理融合。
在演示程序開發(fā)過程、多文件的操作、編譯預(yù)處理時,均可以聯(lián)系編譯原理中編譯器的詞法/語法分析,教師可以演示單步編譯,鼓勵學(xué)生思考編譯的過程。
7) 與高等數(shù)學(xué)、線性代數(shù)、概率論、離散數(shù)學(xué)、數(shù)值分析、運籌學(xué)等融合。
如果能將學(xué)習C語言與離散數(shù)學(xué)中的集合論、代數(shù)系統(tǒng)、圖論結(jié)合,再解決高等數(shù)學(xué)、線性代數(shù)、概率統(tǒng)計、幾何、數(shù)值分析和運籌學(xué)中的數(shù)學(xué)問題,能夠極大提高學(xué)生的興趣,也鞏固了所學(xué)的知識。
8) 與網(wǎng)絡(luò)融合。
使用C語言可以開發(fā)C/S結(jié)構(gòu)的客戶端與服務(wù)器端程序,在實訓(xùn)和實習時可以分層次進行一些高級的練習,比如C/S結(jié)構(gòu)的網(wǎng)絡(luò)編程。再提出一些問題,比如如何實現(xiàn)抓圖和打印等,培養(yǎng)學(xué)生的自學(xué)習慣。
9) 與軟件工程融合。
結(jié)合專業(yè)特點,講解軟件開發(fā)不僅僅是寫代碼,還是一個模型的開發(fā)過程,對于學(xué)生將來畢業(yè)做好畢業(yè)設(shè)計與寫好畢業(yè)論文有指導(dǎo)意義。特別是軟件工程和軟件測試專業(yè)更是需要了解。
其實,我們在講授C語言程序設(shè)計時,幾乎可以和所有計算機專業(yè)課程聯(lián)系起來,比如選修課算法分析與設(shè)計,還可以和ACM/ICPC結(jié)合,通過ACM/ICPC競賽的題目尋找合適的教學(xué)切入點,有時也可以引入離散數(shù)學(xué)中的邏輯推理知識,或者構(gòu)造一種教學(xué)情境,讓大家感興趣,能被吸引住,使學(xué)生一步步跟著往前走,比如抽幾名學(xué)生排隊講排序算法。
也可以和非計算機專業(yè)課程聯(lián)系起來,比如計算機英語。同樣地,在教學(xué)過程中,融合一些新的技術(shù),比如物聯(lián)網(wǎng)、CPS計劃等,學(xué)生會更感興趣。如何融合比較教學(xué),既能深入淺出地完成教學(xué)任務(wù)又不拖延學(xué)時,需要把握好這個度。
3與計算機其他課程的融合實踐環(huán)節(jié)
除了做到融合教學(xué)外,在實踐環(huán)節(jié)上如何融合也至關(guān)重要。
1) 搭建ACM/ICPC校內(nèi)在線測評平臺。
我們采取競賽輔導(dǎo)拔高法,成立競賽班,采取“講-幫-帶”的方式,建立了鄭州輕工業(yè)學(xué)院在線測評平臺,如圖1所示。豐富了題庫,組織校內(nèi)選拔賽,教師帶隊參加競賽。
自2009年開始,我們每年舉辦兩次全校性質(zhì)的大學(xué)生程序設(shè)計競賽:12月舉辦新生程序設(shè)計競賽(個人賽)、5月舉辦一次全校程序設(shè)計競賽(組隊賽)。均有IT公司贊助,并有開幕式和頒獎儀式,極大地提高了學(xué)生的編程熱情。
參加ACM/ICPC競賽,有助于培養(yǎng)學(xué)生的抽象思維、邏輯思維、心理素質(zhì)、團隊合作和協(xié)同能力[5]。
2) 與考研結(jié)合。
我們從大一第一學(xué)期就讓學(xué)生思考自己將來的出路:工作或考研。如果工作就必須學(xué)好知識,重視實踐,提高動手能力。
3) 與操作系統(tǒng)、C++融合實訓(xùn)。
在后續(xù)的操作系統(tǒng)和C++的實訓(xùn)時,安排我們C語言程序設(shè)計課題組的教師參與實訓(xùn),使得C語言程序設(shè)計課程的學(xué)習更加長期有效。
4) 把等級考試當做門檻。
我們把全國和河南省歷年計算機等級考試的題目穿插到平時的教學(xué)中,讓學(xué)483uGuLn2kmyJpHgTLgamw==生把握每個知識點。
5) 介紹學(xué)生參加教師的項目。
我們在授課的同時,也有心培養(yǎng)一些勤于思考用心的學(xué)生,介紹他們參與到教師的應(yīng)急系統(tǒng)、嵌入式、GIS、網(wǎng)絡(luò)等實際項目開發(fā)中,引導(dǎo)學(xué)生自學(xué)C++和Java、JSP等工具,讓他們從實踐中得到鍛煉,積累經(jīng)驗。
6) 跨學(xué)科實訓(xùn)并總結(jié)。
在第二學(xué)期期末的實訓(xùn)環(huán)節(jié),我們讓學(xué)生分組去做一些稍微大一點的題目。比如C語言語法分析模擬器、BIOS模擬器、科學(xué)型計算器、TC模擬器、Windows小游戲、信息系統(tǒng)等。在實訓(xùn)結(jié)束后,我們安排優(yōu)秀實訓(xùn)作品展示總結(jié)會,也是對一學(xué)年課程學(xué)習的總結(jié)。有很多外專業(yè)的學(xué)生自愿來參加。通過展示交流,學(xué)生看到了別人的成績,也看到了自己的差距。
4結(jié)語
通過對C語言程序設(shè)計存在問題進行思考和分析,我們結(jié)合學(xué)校實際,提出了C語言程序設(shè)計與計算機相關(guān)課程的融合教學(xué)與實踐。經(jīng)過4年的教學(xué)與實踐檢驗,取得了較好的教學(xué)效果,對C語言程序設(shè)計,以及其他程序設(shè)計語言的教學(xué)都有一定的指導(dǎo)意義。
參考文獻:
[1] 李玉梅.“C語言程序設(shè)計”課程的“教、學(xué)、做”一體化的探索與實踐[J]. 科技創(chuàng)