摘要:本文從優化教學內容、改進教學方法、完善教學環節這幾個方面對程序設計基礎課程提出了一系列新的教學改革思想,力爭提高程序設計基礎課程的教學質量和教學效果,為今后的專業課程打下良好的基礎。
關鍵詞:程序設計;c++;面向對象;實例化教學
文章編號:1672-5913(2010)08-0072-04
中圖分類號:G642
文獻標識碼:B
作為第一門計算機專業課,程序設計基礎課程應該定位在培養學生良好的程序設計素養和對計算機科學的濃厚興趣上,為后續的專業課程奠定良好的基礎。本文就如何提高教學效果、培養學生的理論知識掌握能力和實踐編程能力,對程序設計基礎課程教學改革提出了一些切實可行的探索方法。從教學內容,教學方法和教學環節這幾個方面論述了新的教學模式改革思想,力爭提高程序設計基礎課程的教學質量和教學效果。
1 優化教學內容
1,1教學語言的選擇
以往的程序設計基礎課程選用c語言作為編程語言,c語言是單純的面向過程的程序設計語言。但隨著程序設計的發展,面向過程的編程方式在實際應用中越來越顯示出它的不足之處,隨之出現面向對象的高級編程語言。所以光學習c語言跟不上時代發展的潮流,必須在程序設計基礎課程的學習中引入面向對象的概念,所以c語言必定會被一種高級語言所代替是時代發展的潮流。
c++語言和Java語言是兩種典型的面向對象編程語言,具有相似的特性,也具有各自的優缺點。c++語言是從c語言發展起來的,它作為一種過渡性編程語言,既有面向過程的特性,又有面向對象的特性,既具有與計算機底層打交道的能力,又有許多和其它高級語言一樣的高級特性,并且學習起來更易理解。Java語言作為一種嚴格的完全的面向對象語言,在很多方面與c++語言是相同或類似的,但是與C/C++語言相比,它的靈活度要差了許多。曾有調查表明,學生在熟練掌握C/C++語言之后,基本上只需要數周的時間就可以熟練掌握Java語言的開發技巧。而反過來,要求一個只熟悉Java語言而沒有任何C/C++知識的學生掌握c++語言往往要耗費數月時間,因此選取c++語言作為程序設計的先行語言會比選用JAVA語言更有優越性。
目前,有些高校的程序設計基礎課程仍然講授c語言,第二學期或者更高年級再來講授C++程序設計語言。但這兩門課程的內容很多重復,導致的直接后果是學生經過兩學期的學習,對于結構化程序設計和面向對象程序設計仍然沒有形成概念,也沒有很好掌握基本程序設計方法。當學生進行一個c++程序設計題目時,經常會沉浸在先前的c語言解題思路里,使用在c++中已經不再適用的方法和語法,編寫出來的程序不僅在程序運行效率還是在程序的健壯性上都有所欠缺。所以直接講授c++語言教學效果會更好。
1,2教學內容的組織
c++是從面向過程的c語言發展而來的,并非是純面向對象的語言,因此在講授過程中,如果將面向過程和面向對象教學完全分離,將不利于學生掌握先進的面向對象程序設計方法。雖然使用c++主要是進行面向對象程序設計,但在進行面向對象類的設計過程中,對其成員函數的設計,是離不開面向過程的設計思想的,因此,面向過程的設計是貫穿于面向對象設計中,也是一個不可忽視的環節。
教學內容上要正確處理編程細節與總體構架的關系:建議本課程一學年完成,在第一學期注重面向過程程序設計方法的講解,在教學中對算法的描述,側重于采用c++語言編程細節的講解。比例,講解數組知識點時,對未排序的數列進行排序,我們主要講解經典的冒泡排序算法和選擇法排序算法。這兩個算法在今后講解別的知識點時會經常用到,所以要求學生對此算法的思路要理解和掌握。建議在第二學期的教學中,注重面向對象程序設計方法的講解,主要講解程序整體框架結構和實現機制,而不再注重內部細節的實現。怎樣從一個現實問題抽象出其屬性和行為封裝成一個具體類;在代碼復用的問題上,采用的是組合還是繼承,以及程序是否用到多態機制,這些是我們第二學期學習的重點。
由于教學內容的組織先講授面向過程的思想,再講授面向對象的思想。一旦講述到面向對象的思想時,以前用向過程的方法所能解決的問題都不應該提倡用面向過程的思路來解決,而應該提倡用面向對象的方法來實現。
2 改進教學方法
有了適當的教學內容組織,加上好的教學方法,可以使教學難度大大下降,更有利于學生接受和掌握。以下從4個方面來談一下教學方法的改革思路。
2,1學習計算機系統的基礎知識,做好課程入門前的準備工作
對于剛接觸程序設計的學生來說,程序設計語言入門之前相關知識的掌握是至關重要的。程序設計語言的教學應與計算機系統緊密結合。對計算機系統有足夠的認識和深刻的理解,才能掌握程序設計語言的精髓和充分發揮程序設計語言的潛能。因此,教師本人應該對計算機系統的一些特性和原理理解深刻,對程序設計語言的背景理解透徹,如果教師僅僅從純語言的角度講授語言,一系列類似問題得不到正確解釋,致使學生不能知其所以然,會直接影響教學質量。
所以,在正式開始講解程序設計語言之前,應該先講授與編程相關的計算機基礎知識,讓學生對計算機運行機制產生一個初步的認識,尤其對于那些在開設程序設計基礎課程之前沒有開設過計算機文化基礎課程的院校是極其必要的。計算機基本組成部分、計算機運行的基本原理、計算機怎樣運行程序,組成程序的指令代碼、機器代碼是二進制形式、各種計算機數值進制種類以及之間的換算方法、計算機中數據的存儲,以及內存分配的問題,這些都屬于基本的計算機系統知識,理解了這些相關知識,對于學生以后理解程序設計語言的語法和基本概念以及各種其實現機制都會達到事半功倍的效果。
比如,如果學生已經理解了內存分配的相關知識,那就更容易明白為什么定義變量或對象的時候必須要指定類型,因為不同的類型決定了為此變量在內存中開辟空間的大小,內存空間的大小同時也限定了表數的范圍。“為什么兩個正數相加有時在計算機中會顯示負數的結果”,就此問題從語言角度是無法解釋的,但從計算機系統角度看,數的表示是有一定范圍的,超過范圍就會產生溢出,所出現的負數實際上就是溢出后的錯誤數據。同時,C++中的動態內存分配和釋放符new和delete的應用,都與內存分配問題分不開。
再如,學生已經理解計算機程序的運行機制,那么學生更容易理解為什么一個程序從編寫到運行必須要經歷:編輯-編譯-聯接-調試-運行這幾個基本步驟,這和計算機不能直接運行高級語言,只能直接運行機器代碼這點基礎知識是分不開的,從而理解為什么每個c++程序都需要編譯這個重要環節。
2,2采用同一例題不同的實現方法進行知識點的分析對比,培養學生的創新精神
教師要啟發學生自己去發現和擴展知識,這對于程序設計課程尤為重要。程序設計本身就是“活”的,任何一個問題都不僅只有一種解法,教師要經常鼓勵學生充分發揮自己的聰明才智,啟發學生通過自己編程的實踐分析對比不同的算法,提高自己的實踐能力,培養他們的創新精神。
由于程序設計思路的不唯一性,一個題目可運用不同的知識點來進行設計,運行出相同的正確結果。那么在講解問題的過程中,可以采用同一例題題目,但用不同的語法、算法實現。例如,函數參數傳遞,分別用變量名傳值、指針傳值、引用傳值這三種不同的傳值機制來完成兩個數的交換:再如,對于多個字符串的排序,我們可以利用字符數組,字符指針,指向字符數組的指針,指針數組,二級指針以及用運字符串類對象都能實現:再如比較經典的例題——Josephus問題,它的設計可以利用數組,結構體數組或鏈表這種面向過程的程序設計方法解決,也可以通過設計成一個Josephus類這種面向對象的程序設計方法來完成。它們的分析思路、解題難度和運行效率都是不同的,通過比較它們各自的優缺點,使學生能夠對不同知識點進行比較分析,并且更有利于學生理解和掌握所運用的知識點,有助于他們在將來的程序設計工作中,不禁錮思路,有創新精神。
2,3注重教學實例的選擇,將抽象的理論變得通俗易懂,注重新舊知識的融合
實例教學法是教學過程中根據每章每節的具體教學要求、教學內容選取恰當的程序實例。
c++語言中增加了許多抽象的面向對象的機制,這些機制是面向對象思想的精華,卻又是c++語言中的難點,相對面向過程的思想來說,面向對象的思想更加抽象難理解,所以在實例的選取方面要精,要有代表性和典型性,同時更要考慮到學生的認知特點,好的通俗易懂的教學實例能幫助學生對抽象概念的理解。
同時要注意到新知識總是舊知識的組合或擴展,針對這個特點,在教學實施中,通過某一實例,以舊知識為基點,提出在問題解決上存在的缺陷和不足,而這些缺陷和不足又是即將學到的新知識點能解決的問題,從而使學生在較為連貫的基礎上達到新知識點的擴展。
在講解封裝、繼承、多態這一系列抽象概念時,應該從一個小的類例子逐步擴展。例如在講解封裝的概念時,我們可以舉人類這個例子,對于抽象的人,我們應該抽象出它的共性,設計成具體的類,實現人的屬性和行為的封裝,由于封裝性還體現在私有數據的安全性上,我們可以為人類增加一些隱私信息,不被外界所隨便訪問,c++類由訪問控制符來限定成員的訪問屬性。在講解繼承的概念時,我們仍然以人類為例,派生出一個父類,然后根據父親類再派生出一個兒子類,兒子可以繼承一些父親的共有財產,可是卻不能繼承父親的一些隱私信息,這就體現了派生類對基公有成員和私有成員的訪問權限問題;對于多態,我們可以在父親類和兒子類的這個例子上繼續,由于父親類和兒子類都是以人類為最初的基類的,所有我們可以給他們發送同樣的消息來讓他們執行行為,因為他們又是不同的具體類,所以即使發送的消息都是相同的,可是執行的結果并非相同,這就體現了一個多態的概念。
2,4采用多媒體教學課件、黑板、教學網站等多種教學媒體的有機結合
在教學上采用黑板教授、多媒體教學課件以及教學網站手段的緊密結合,相互補充,發揮各自的長處,能夠促進教學效果的改進和教學質量的提高。
教學課堂上講授程序設計時,如果只用語言和文字表述會比較平淡,也比較抽象,讓學生抓不住重點,理解起來有一定的難度;而用多媒體課件進行課堂輔助教學,尤其是利用其圖示、圖例的方式來輔助講解,會使知識的表述的更加清晰易懂,利于學生理解和記憶。尤其是一些經典算法,如查找、排序、鏈表、遞歸,用學生感興趣的Flash來進行動態的展示,可以很好的激發學生的學習興趣,也能幫助他們很好的理解和記憶算法,同時,多媒體課件可以幫助學生進行課下自學和復習。
教學網站借助互聯網的優勢,能及時發布更多新的教學內容和學習資源,在突破傳統課程教材封閉性的同時,更為實施研究性學習等探究活動提供了便利,從以下四個方面得以體現。
(1)通過教學網站能方便教師展示與課程相關的結構化知識,把課程學習內容相關的文本、多媒體課件等進行知識結構化重組,方便學生課后參考。
(2)教師可以將與課程相關的、擴展性的學習素材資源進行收集管理,教師可以將一些經典的算法以及以往學生好的作品進行保存和展示,提供進行程序設計的各種編程工具的下載和提供相關資源網站的鏈接。
(3)通過教學網站為師生提供了交流的平臺,例如論壇、聊天室等等構建網上協商討論、答疑指導,以及進行作業和上機實驗任務的發布和進行網上作業提交等。
(4)教師收集與本課程相關的思考性問題、形成性練習和總結性考查的評測資料供學生網上學習或下載,讓學習者能定期進行自我學習評價,檢查自己的學習程度。
3 完善教學環節
程序設計是一門實踐性很強的課程,僅僅滿足“老師講清、學生聽懂”是不夠的,學生的實際編程能力是更重要的培養目標。教學改革的重點是培養學生對計算機科學的興趣,強調實踐課程的重要性,著重培養學生的實際動手能力和協作開發能力。具體到程序設計這門課程上,教學環節應注重以下幾個方面。
3,1課堂教學環節
教師要培養學生的邏輯思維能力、程序設計能力和綜合解決問題的能力,自身要不斷提高程序設計的能力,積累開發經驗和編程技巧。有實踐經驗的教師,才能真正保證課堂教學的授課質量,把理論上先進的思想付諸實施,同時把實踐中的體會用于教學,才能把程序設計語言課程講解得更生動、更貼近實際應用,更能培養學生的學習興趣,積極開展啟發式、互動性教學工作,保證教學質量,提高教學效率。
3,2實驗環節
要強化實驗教學,注重實驗內容和教學內容的配套。實驗內容要有針對性,就必須安排好基本內容、提高內容、綜合內容三個層次的設計。對重點知識要加強訓練,要求學生按照一定的規范完成上機實驗。具體要求為“明確實驗目的,完成實驗內容”。
實驗輔導過程中,由具有豐富實際軟件開發經驗的青年教師擔任實踐課程輔導教師,并且配備能夠使用c++熟練編程的指導學生輔助主講教師輔導學生,確保每個學生都可以得到一對一的實踐指導。在指導過程中,教師和指導學生會針對學生提出的程序問題進行相關講解,保證學生知道問題出在哪,為什么出錯,應該怎么修改,以保證學生得到甚解,從而達到對所學知識的理解和掌握。
實驗課后,教師應該及時對上機情況進行總結,對學生上機存在的普遍問題進行歸納,在理論課上進行強調,因為這些問題是在學生學習過程中普遍忽視或出錯的問題。
3,3課程設計環節
在課程學習結束,安排學生進行一個周或者更長時間的課程設計,來培養和檢驗學生對本課程的綜合掌握能力、具體編程能力以及創新能力。實踐中能夠激發學生的創新思維,使學生的創新活動貫穿于整個學習過程,使創新成果通過程序設計更好的體現出來。
3,4課程考核環節
科學的課程考核方法可以有效地評價學生的學習情況。單一方面的考核是不能真實檢驗出學生對課程的真正掌握程度。筆試考試只能考核學生的理論知識,不能考核出學生的實際編程水平、綜合分析能力及創新能力。因此,考核的方面要相對全面,主要包括三方面:筆試、上機實踐、課程設計三大塊。教師通過筆試考試考查學生對程序設計理論知識的掌握:教師通過每次上機實驗檢查學生的程序并且提問與此程序相關的問題來了解學生的程序設計能力;通過課程設計,可以考查學生的綜合解決問題的能力、實際編程能力和創新能