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