摘要:問題驅(qū)動教學(xué)方法是實踐建構(gòu)主義認(rèn)知理論的重要方法之一,對激發(fā)學(xué)生學(xué)習(xí)興趣、培養(yǎng)主動學(xué)習(xí)能力具有重要意義。本文提出將問題驅(qū)動教學(xué)方法應(yīng)用到C++程序設(shè)計課程的教學(xué)中,改進(jìn)傳統(tǒng)的教學(xué)方法與手段,加強實驗、實踐環(huán)節(jié),增加上機考核。初步實踐表明新的教學(xué)方法能夠有效提高C++程序設(shè)計課程的教學(xué)效果,提升學(xué)生的實際動手編程能力。
關(guān)鍵詞:問題驅(qū)動;教學(xué)方法;C++程序設(shè)計
在高等教育大眾化的環(huán)境下,內(nèi)容陳舊、形式單一、理論與實際脫節(jié)的課堂教學(xué)方法已不能適應(yīng)我國現(xiàn)階段高等教育的教學(xué)要求,也不能滿足當(dāng)代大學(xué)生的學(xué)習(xí)需求。因此,改進(jìn)課堂教學(xué)方法、教學(xué)手段以提高課堂教學(xué)效率,是緩解現(xiàn)階段高等教育中“教”和“學(xué)”矛盾的有效手段和重要途徑,是深入實踐國家高等教育“質(zhì)量工程”的體現(xiàn)[1]。
建構(gòu)主義理論[2]認(rèn)為知識不是通過教師傳授得到的,而是學(xué)習(xí)者在一定的情境,即社會背景下借助他人的幫助(如教師或?qū)W習(xí)伙伴),利用必要的學(xué)習(xí)資料,通過意義建構(gòu)的方式獲得的。在知識獲取的過程中,強調(diào)學(xué)生是信息加工的主體,是意義的主動建構(gòu)者,而不是外部刺激的被動接受者,驅(qū)使學(xué)生不斷學(xué)習(xí)的動力應(yīng)該是逐步解決問題而獲得的成就感,而不是教師不斷地灌輸和填鴨,教師在學(xué)習(xí)過程中起著引導(dǎo)學(xué)生如何發(fā)現(xiàn)問題、分析問題以及解決問題的作用。因此,問題驅(qū)動的教學(xué)方法受到日益重視,在高等數(shù)學(xué)[3]、線形代數(shù)[4]、管理學(xué)原理[5]以及計算機原理[6]、計算機應(yīng)用基礎(chǔ)[7]等課程的教學(xué)中得到廣泛的應(yīng)用。
C++程序設(shè)計語言是貝爾實驗室的Bjarne stroutsup在吸收C程序設(shè)計語言優(yōu)點的基礎(chǔ)上開發(fā)的支持面向?qū)ο蟪绦蛟O(shè)計的計算機編程語言[8]。它既能支持結(jié)
構(gòu)化程序設(shè)計已保持對C語言的兼容,又通過類(class)機制實現(xiàn)面向?qū)ο缶幊?。?dāng)前,C++程序設(shè)計語言成為國內(nèi)外眾多高校計算機專業(yè)學(xué)生學(xué)習(xí)計算機編程的第一門程序設(shè)計課程,該門課程學(xué)習(xí)的好壞對于學(xué)習(xí)其他計算機專業(yè)核心課程(如數(shù)據(jù)結(jié)構(gòu)、操作系統(tǒng)、編譯原理)至關(guān)重要;另外,程序設(shè)計類課程實踐性強,非常適合采用問題驅(qū)動式的教學(xué)方法。因此,本文探討問題驅(qū)動的教學(xué)方法在C++程序設(shè)計課程教學(xué)中的應(yīng)用,對于提高計算機專業(yè)學(xué)生的C++程序設(shè)計能力具有重要的實際意義,對于其他計算機專業(yè)課程的建設(shè)和改革具有一定的借鑒意義。
1問題驅(qū)動的教學(xué)方法在C++程序設(shè)計教學(xué)中的應(yīng)用
1.1問題驅(qū)動的教學(xué)方法簡介
所謂問題驅(qū)動的教學(xué)方法,就是借助現(xiàn)代化的教學(xué)環(huán)境和教學(xué)手段,設(shè)計合適的問題或選擇典型的實際問題,通過引導(dǎo)學(xué)生如何分析問題和解決問題,從而啟發(fā)學(xué)生思維、培養(yǎng)學(xué)生興趣的教學(xué)方法,培養(yǎng)學(xué)生探究學(xué)習(xí)、協(xié)作學(xué)習(xí)、終身學(xué)習(xí)的習(xí)慣,為進(jìn)一步學(xué)習(xí)和深造奠定堅實的基礎(chǔ)。
問題驅(qū)動的教學(xué)過程的實施對教師提出了更高的要求。教師在課程教學(xué)中遵循如下原則:(1)教師
基金項目:天津理工大學(xué)教改基金(2008016)資助,天津市高等學(xué)校科技發(fā)展基金(20071306)資助。
作者簡介:夏承遺,男,副教授,博士,研究方向為計算機應(yīng)用技術(shù)、復(fù)雜系統(tǒng)建模分析等;孫世溫,女,講師,博士,研究方向為計算機應(yīng)用技術(shù)、復(fù)雜系統(tǒng)建模分析等。
需要根據(jù)教材的內(nèi)容、學(xué)生的認(rèn)知規(guī)律和實際情況,以提出問題的方式引導(dǎo)學(xué)生主動學(xué)習(xí)和思考;(2)所設(shè)計的問題要涵蓋課程的主要的知識點,同時又要循序漸進(jìn),有一定的梯度;(3)鼓勵學(xué)生大膽嘗試,勇于在課堂上提出問題,教師在分析答疑過程中幫助學(xué)生提高他們解決問題的能力。
1.2問題驅(qū)動的C++程序設(shè)計教學(xué)案例
基于上述原則,結(jié)合C++程序設(shè)計語言的特點選取一些實際問題和經(jīng)典問題,講解C++編程求解問題的過程,有利于學(xué)生對C++程序設(shè)計的學(xué)習(xí)和掌握,進(jìn)而提高C++程序設(shè)計能力。這里介紹幾個教學(xué)案例。
1.2.1從“Hello World”程序入門
C++程序設(shè)計課程是學(xué)生學(xué)習(xí)編程的開始,如何引導(dǎo)學(xué)生快速入門,并激發(fā)學(xué)生進(jìn)一步學(xué)習(xí)的欲望至關(guān)重要。傳統(tǒng)的教學(xué)方法首先介紹C++語言的語法特點,然后介紹C++程序的基本結(jié)構(gòu),再舉一些程序?qū)嵗?。我們正好相反,首先提出問題要求編程在屏幕上打印“Hello World”字樣;然后,以特定的編譯器(如Visual C++6.0)為基礎(chǔ),課堂上當(dāng)場編寫程序代碼(如圖1所示),同時演示C++程序的編輯、編譯和連接等調(diào)試過程;還可以引導(dǎo)學(xué)生,如何修改程序在屏幕上輸出其他字樣,如“The Great Wall”,等等。這樣的做法,一方面使學(xué)生很快了解真實編譯環(huán)境下C++程序的基本框架;另一方面也可以鼓勵學(xué)生自己動手編程,從一開始就充分調(diào)動學(xué)生的學(xué)習(xí)積極性。
圖1C++結(jié)構(gòu)化程序框架
與此同時,C++語言還支持面向?qū)ο蟪绦蛟O(shè)計,以類為基礎(chǔ)重新編程實現(xiàn)在屏幕上輸出“Hello World”(如圖2),進(jìn)一步使學(xué)生了解C++程序的完整結(jié)構(gòu)。
最后,基于上述實例程序,總結(jié)C++程序的基本結(jié)構(gòu)如下:(1)程序主要由類和函數(shù)組成,圖1所示程序是圖2程序的退化形式(即結(jié)構(gòu)化形式,保持對C語言的兼容);(2)每一個程序有且只有一個主函數(shù)(main函數(shù)),并且是程序的入口點;(3)程序可能會用到一些系統(tǒng)庫函數(shù)或?qū)ο螅藭r使用文件包含預(yù)處理,如#include
圖2C++面向?qū)ο蟪绦蚩蚣?/p>
1.2.2類對象的初始化問題
C++類對象的初始化是C++教學(xué)中的一個難點,很多學(xué)生不理解為什么要引入構(gòu)造函數(shù)進(jìn)行初始化。為此,我們通過梳理C++中各種數(shù)據(jù)類型的初始化過程,循序漸進(jìn)、逐步深入到對象初始化的問題,并在教學(xué)中適當(dāng)設(shè)置問題,要求學(xué)生思考。
對于C++基本類型數(shù)據(jù),初始化是一個相對容易的過程,在變量定義時直接賦初值即可。例如,int a=3;float f[3]={1, 2, 3}。前者給普通變量賦初值,后者給數(shù)組賦初值。
對于結(jié)構(gòu)(struct),由于成員默認(rèn)具有公有(public)的存取權(quán)限,我們也可直接進(jìn)行初始化。
struct Date {
int year, month, day;
};
可以直接給結(jié)構(gòu)變量賦初值,如struct Date d1= {2007, 10, 4};
但是,對于類(class),由于成員默認(rèn)具有私有(private)的存取權(quán)限,試圖直接進(jìn)行初始化,必然是徒勞的。
class CDate {
int year, month, day;
};
給類對象直接賦初值,如CDate d1={2007, 10, 4};編譯出錯。實際上,這相當(dāng)于直接訪問類對象的私有(private)數(shù)據(jù)成員,如D1.year=2007;d1.month=10;d1.day=4;當(dāng)然被禁止。
所以,類對象的初始化依靠直接賦初值的辦法是行不通的,必須另劈蹊徑。另外,對于C++基本數(shù)據(jù)類型的變量,如果沒有初始化,我們還可以有補救的措施,例如,
int a;//定義一個變量,但未初始化
…//其它一些操作
a=3;//賦值
++a;//自增量操作
同樣,這些補救措施對類對象來說也是無濟于事,受到成員的私有(private)的存取權(quán)限所禁止。并且,類對象是對現(xiàn)實世界對象的直接模擬,要求一旦創(chuàng)建就應(yīng)該具有一個有意義的初值,并且是立即和自動完成的。所有這一切,都說明初始化的任務(wù),必然落到成員函數(shù)的身上;但普通的成員函數(shù)需要用戶程序顯式調(diào)用,無法自動完成,必然要一個特殊的成員函數(shù)完成初始化的過程,C++中稱為構(gòu)造函數(shù),類的唯一性和對象的多樣性決定了構(gòu)造函數(shù)名稱與類名相同。然后,通過一些實例程序來演示對象的初始化過程,學(xué)生將更容易理解為什么要用構(gòu)造函數(shù)進(jìn)行對象的初始化。
1.2.3虛函數(shù)與多態(tài)性問題
虛函數(shù)是C++支持面向?qū)ο蟪绦蛟O(shè)計運行時多態(tài)性的基本技術(shù),但程序中有了虛函數(shù)未必就能夠?qū)崿F(xiàn)運行時的多態(tài)性,初學(xué)者經(jīng)常在這里感到費解。在教學(xué)中,我們首先要求同學(xué)分析圖6和圖7所示的兩個程序?qū)嵗绦驁?zhí)行結(jié)果分別是什么?前者在控制臺屏幕上顯示“===BaseClass===”;而后者在屏幕上顯示“===DerivedClass===”。
為什么會出現(xiàn)這樣不同的結(jié)果呢?其實,在圖3所示的程序中,盡管在基類c_Base和派生類c_ Derived中都定義了虛函數(shù)virtual void print(),但將派生類對象賦值給基類對象之后,此時將派生類對象剪切為基類對象,然后再調(diào)用print()只能使用基類中定義的函數(shù)了;而在圖4的程序中,在使基類的對象指針指向派生類對象之后,基類指針代表著一個派生類對象,故能夠調(diào)用派生類中定義的虛函數(shù)。再進(jìn)一步,需要從編譯器底層探討C++中虛函數(shù)的實現(xiàn)機制,現(xiàn)代的編譯器為每一個包含虛函數(shù)的類增加一個虛指針成員(vptr)和一個虛表(vtable),具體細(xì)節(jié)不再詳述,可引導(dǎo)學(xué)生查閱相關(guān)的文獻(xiàn)[9, 10],以培養(yǎng)學(xué)生主動學(xué)習(xí)的能力。
基于上述分析可以得出如下結(jié)論,C++通過虛函數(shù)實現(xiàn)運行時的多態(tài)性必須滿足如下三個條件:(1)公有繼承,即繼承方式為public;(2)在基類和派生類中定義虛函數(shù);(3)通過基類指針或引用調(diào)用虛函數(shù)。
總之,通過上述幾個案例的介紹,為開展問題驅(qū)動的程序設(shè)計課程的教學(xué)起一個拋磚引玉的作用。結(jié)合不同的程序設(shè)計語言特色與相關(guān)知識,設(shè)計合適的問題,并引導(dǎo)學(xué)生對問題進(jìn)行分析和討論,同時在教學(xué)中留給學(xué)生充分的思考空間,發(fā)揮學(xué)生的主觀能動性,進(jìn)而提升課堂教學(xué)的效果。
圖3通過基類對象調(diào)用虛函數(shù)
圖4通過基類指針調(diào)用虛函數(shù)
1.3實驗、實踐與考試環(huán)節(jié)
對于像第二批以及第三批本科的學(xué)生,學(xué)生學(xué)習(xí)主動性相對較差,我們在努力提高課程教學(xué)效果的同時,還必須加強實驗、實踐以及考試環(huán)節(jié)的改進(jìn)和設(shè)計,以提高學(xué)生動手編程的能力。我們采取的主要措施包括:
(1) 高度重
視實驗環(huán)節(jié)。實驗是培養(yǎng)和鍛煉學(xué)生程序設(shè)計能力的一個重要手段。實驗前,必須嚴(yán)格要求學(xué)生做好實驗準(zhǔn)備,對實驗題進(jìn)行認(rèn)真分析、畫好程序流程圖并在紙介質(zhì)上寫好源代碼;實驗中,要求學(xué)生熟練掌握程序的編輯、編譯、鏈接等過程,尤其要認(rèn)真對待程序調(diào)試過程遇到的各種錯誤,排除各種錯誤的過程是提高編程能力的重要環(huán)節(jié),并對程序調(diào)試中的一些共性問題進(jìn)行統(tǒng)一的講評,及時幫助學(xué)生解決實驗中遇到的各種問題;實驗后,要求學(xué)生認(rèn)真撰寫實驗報告,特別要求學(xué)生寫清實驗中遇到哪些問題,又是如何解決這些問題的。
(2) 改進(jìn)考試環(huán)節(jié)。結(jié)合這種問題驅(qū)動的教學(xué)方法,我們也對考試環(huán)節(jié)進(jìn)行了必要的改進(jìn),改變傳統(tǒng)只進(jìn)行期末筆試的方式。我們將考試分成期中考試和期末考試兩個階段,并且每次考試包括筆試和上機編程考核兩個方面,其中筆試主要涉及C++的一些重要的語法知識,以程序閱讀和分析為主;上機主要考核學(xué)生編程和調(diào)試程序的能力。
(3) 增加課程設(shè)計環(huán)節(jié)。平時練習(xí)和實驗主要訓(xùn)練學(xué)生的基本能力以及對重要語法知識的掌握,問題相對簡單,程序規(guī)模也較小。所以,在課程結(jié)束后,結(jié)合數(shù)據(jù)結(jié)構(gòu)中線形表的知識,布置學(xué)生完成一個小型的管理信息系統(tǒng)(MIS),如人事管理系統(tǒng)、工資管理系統(tǒng)以及學(xué)生學(xué)籍管理系統(tǒng)等。一方面,對學(xué)生編制較大規(guī)模的程序有一個綜合的訓(xùn)練;另一方面,學(xué)生在認(rèn)真完成后,實現(xiàn)一個功能相對完善的程序,會有較大的成就感,有利于激發(fā)學(xué)生進(jìn)一步學(xué)習(xí)計算機專業(yè)知識的興趣。
1.4教學(xué)效果的評價
如何科學(xué)合理地評價教學(xué)效果是一件非常困難的事情。但是,我們發(fā)現(xiàn)在我院計算機專業(yè)2007級采用問題驅(qū)動的教學(xué)方法后,學(xué)生的精神面貌、學(xué)習(xí)的熱情和主動性有明顯的改進(jìn),表1給出了2006和2007兩屆學(xué)生期中和期末考試及格率情況,從一個
側(cè)面反映了教學(xué)效果的提升,堅定了我們繼續(xù)改進(jìn)和完善問題驅(qū)動教學(xué)法的信心。
表1采用問題驅(qū)動教學(xué)法前后學(xué)生及格率情況
及格率期中考試期末考試
筆試上機筆試上機
200675.1%50.2%80.2%48.7%
200789.3%65.6%91.8%70.5%
從表1可以看出,采用問題驅(qū)動教學(xué)法之后,學(xué)生在筆試和上機考核方面都有明顯提高,同時,我們也看到學(xué)生上機考試的成績?nèi)圆粔蚶硐?。因此,如何進(jìn)一步提高學(xué)生動手編程能力有待進(jìn)一步的探索和嘗試。
總之,我們在課堂教學(xué)中要注意吸引學(xué)生,努力提高學(xué)生自主學(xué)習(xí)的興趣,在課后布置一定的編程任務(wù),并認(rèn)真檢查,同時對課程的考試環(huán)節(jié)進(jìn)行必要的設(shè)計,增加上機考核,給學(xué)生一定的壓力,從而保持在教學(xué)全過程中對學(xué)生進(jìn)行督促和指導(dǎo),切實提高教學(xué)效果。
2結(jié)束語
努力改進(jìn)教學(xué)模式和提高課程教學(xué)效果是提升高等教育質(zhì)量的一個重要方面,搞好每門課程尤其是一些專業(yè)基礎(chǔ)課程的教學(xué),激發(fā)學(xué)生學(xué)習(xí)專業(yè)課程的興趣,進(jìn)而激勵學(xué)生進(jìn)一步開展研究性學(xué)習(xí),甚至開展創(chuàng)新性的研究工作,為培養(yǎng)高素質(zhì)、適應(yīng)社會需求的計算軟軟件人才奠定基礎(chǔ)。本文以C++程序設(shè)計課程為例討論了在計算機專業(yè)的程序設(shè)計類課程開展問題驅(qū)動模式的教學(xué)方法的嘗試,取得了初步的效果,一定程度上促進(jìn)了學(xué)生編程能力的提高。但是,僅靠程序設(shè)計課程的改革是遠(yuǎn)遠(yuǎn)不夠的,這一新的教學(xué)方法值得進(jìn)一步完善和改進(jìn)以及在其他計算機專業(yè)課程中的教學(xué)實踐中加以推廣和應(yīng)用。
參考文獻(xiàn):
[1] 教育部,財政部. 教育部財政部關(guān)于實施高等學(xué)校本科教學(xué)質(zhì)量與教學(xué)改革工程的意見[Z]. 2007.
[2] 張建偉,陳琦. 簡論建構(gòu)性學(xué)習(xí)和教學(xué)[J]. 教育研究,1999,(5)56-60.
[3] 張奠宙,張萌南. 新概念:用問題驅(qū)動的數(shù)學(xué)教學(xué)[J]. 高等數(shù)學(xué)研究,2004,7(3):8-10.
[4] 趙慧斌. 問題驅(qū)動是線性代數(shù)有效的教學(xué)方法之一[J]. 高等數(shù)學(xué)研究,2008,11(4):91-94.
[5] 吳曉勻. 問題驅(qū)動型教學(xué)模式在《管理學(xué)基礎(chǔ)》課程教學(xué)中的運用[J]. 華南熱帶農(nóng)業(yè)大學(xué)學(xué)報,2005,11(2):88-93.
[6] 李英杰. 問題驅(qū)動教學(xué)法及其在計算機原理教學(xué)中的應(yīng)用[J]. 電腦編程技巧與維護(hù),2008,(12):99-101.
[7] 徐秀珍,徐洊學(xué). 淺談問題驅(qū)動式教學(xué)方法在《計算機應(yīng)用基礎(chǔ)》課程中的應(yīng)用[J]. 內(nèi)蒙古民族大學(xué)學(xué)報:自然科學(xué)版,2008,23(4):462-464.
[8] Bjarne Stroutsup. The C++ Programming Language(Special Edition)[M]. 北京:高等教育出版社,2001.
[9] 夏承遺,董玉濤,趙得新等. C++中虛函數(shù)的實現(xiàn)機制[J].天津理工學(xué)院學(xué)報,2004,20(3):65-67.
[10] 和力,吳麗賢. 關(guān)于C++虛函數(shù)底層實現(xiàn)機制的研究與分析[J]. 計算機工程與設(shè)計,2008,29(10):2705-2707.
(編輯:郭小明)