張雪伍,常晉義
(常熟理工學院 計算機科學與工程學院,江蘇 常熟 215500)
逆向思維是對司空見慣的似乎已成定論的事物或觀點反過來思考的一種思維方式。C++程序設計中的諸多抽象復雜的概念和規則,除了用傳統思維方式去理解外,還可通過逆向思維的方式進行思考,以加深學生對知識的理解,促使其進行創造性、多角度的主動思考,培養其創新能力,增強創新意識。
逆向思維是一種重要的思維方法,具有普適性、批判性和新穎性。它在研究問題時,能突破常規,從常規思維的反向進行探索,除了加深理論知識的理解和活用外,有時還能在常規思維方式無法求解的情況下,獲得出奇制勝的效果。
逆向思維的思考方法主要有:反轉型逆向思維法,即從已知問題的相反方向進行思考;轉換型逆向思維法,即變換問題的思考角度的思維方法。在C++程序設計的教學過程中,對抽象、難理解的概念和問題,在常規思維的基礎上,引導學生通過逆向思維,從反向、側面、缺點利化的角度對問題進行充分理解,通過肯定、否定的思維方式,加深問題理解、增強思維的靈活性,提升學生的創新能力。
C++程序設計課程的主要內容可以分成過程程序設計和對象程序設計兩部分。C++程序設計課程內容多且抽象難懂,因此應根據開課學生專業和基礎知識掌握情況對教學內容進行適當的裁剪。
過程程序設計部分主要是講述C++程序語言的基本語法規則,教學過程中需要強調記憶且很難實施逆向思維教學;面向對象程序設計部分著重強調現實世界的抽象、表達以及基于它們的程序設計,具有較強的思維靈活性,使用傳統的教學方法只能從正面進行講授,若將其與逆向思維相結合,從問題的反面或側面進行教學,會收到更好的教學效果。
反轉型逆向思維,即從事物的相反方向進行思考,從而使問題得到很好的解決。在C++程序設計教學過程中,主要針對較難理解的概念和語法規則,通過與常規教學方法相結合,從問題的反方向來進行思考,加深問題的理解和掌握。
1.類與對象逆向思維教學
類、對象的概念及其相互關系是面向對象程序設計教學中非常重要的概念之一,對其的理解是否透徹直接影響后面內容的繼續學習。
傳統的類與對象的教學思路主要是通過類與結構體的對比來說明類的特性,并對類中的數據和方法進行講授,利用類進行對象構建來演示類與對象的關系、對象的使用方法,如圖1所示。采用傳統的教學方式講授,學生雖能夠掌握類的概念和使用方法,但對現實世界的抽象過程和類的創建過程比較陌生,很難活用。

圖1 傳統的類與對象的教學模式

圖2 逆向思維的類與對象教學模式
基于逆向思維的類與對象教學模式如圖2所示。所采用的教學方式是將現實世界中的同類對象作為教學的起點,分析同類現實對象,并對其進行泛化來構建概念對象,它包含了現實對象的描述屬性和動作;基于封裝思想構建相應的類,將概念對象的屬性和動作轉化成類的數據成員和相應的操作方法,并對類的定義和構建方法進行講授;通過對類進行實例化創建多個對象,通過不同的對象來影射現實世界中不同的現實對象,并通過對象的數據來描述現實對象,利用類方法來模擬現實世界中現實對象的相應動作及其相互關系?;谀嫦蛩季S,以真實對象作為教學的起點和歸宿,在講授概念和語法的同時,還重點強調了類的構建過程,從而加深對概念的理解和語法的活用。
2.靜態數據成員的逆向思維教學
類的靜態成員是C++程序設計語言中一個重要的概念,但由于課時有限,往往采用快速的傳統教學方式,即首先介紹靜態成員的概念,然后結合一個程序示例進行分析。由于概念本身較難懂,學生對其理解不夠深刻,感覺似懂非懂,更談不上合理的應用。對于此種情況,可以采用逆向思維教學模式進行教學,采取實例—理論—實例的教學方式,即首先通過實例展示靜態成員與普通成員的區別,然后結合實例介紹概念和相應的理論,最后再給出一個適合運用靜態成員解決的實際問題,并對其進行分析,最后通過靜態成員高效地解決問題,進而在傳授學生靜態成員知識的同時,也教會了學生如何獨立地分析問題和解決問題,具體過程如圖3所示。
圖3給出了基于逆向思維的靜態數據成員的教學過程。在CTestClass類中分別定義了靜態數據成員和普通數據成員,并給出了相應的操作方法,在main函數中分別創建a和b兩個對象,并在設置數據成員前后分別對靜態數據成員和普通數據成員進行輸出,比較它們的差異;然后結合示例講授靜態數據成員的概念;最后結合倉庫管理員統計貨物重量的實際問題,對靜態數據成員的應用進行分析,并解決問題。

圖3 逆向思維的靜態數據成員教學模式
轉換型逆向思維是指在研究某一問題時,由于正常解決問題的方法受阻而轉換思考角度,從而使得問題得以順利解決的思維方法。
1.冒泡排序的逆向思維教學
通用的教材中,無論是遞增還是遞減的冒泡排序均是自頂向下進行的,首先對排序的數列中的第1對數進行沉底交換操作,直至第n對數,完成第一趟;第二趟,仍然從第1對數開始,直至第n-1對數據;如此下去,重復以上過程,直至最終完成排序(n為數的個數)。基于逆向思維,將傳統的冒泡排序的操作方法進行逆轉,即從底向上的操作順序,先從第n對數進行冒泡交換操作,然后是第n-1數進行冒泡排序交換,直至第n對數。傳統與逆向思維方式的冒泡排序過程如圖4所示。

圖4 傳統與逆向思維方式的冒泡排序
逆向思維的冒泡排序代碼:

在實施冒泡排序教學時,先使用傳統的冒泡排序方法講授,在學生掌握了該方法后,對其進行逆向啟發,啟發他們從另一個角度思考冒泡的操作方向,并結合示例程序對其進行介紹。通過不同思維方式的冒泡排序,可以活躍學生的思維方式,加深其對排序本質的理解,更重要的是可以培養其創新能力。
2.數組篩選的逆向思維教學
對于給定的一個整數數組arr[n],數組中不包括0和1,n為數組元素的個數,輸出數組中的所有的合數。常規的思維方式是通過循環對數組中的各個整數進行合數判斷,若是合數則放在構建好的臨時數組中,最后將其作為計算結果返回。
可以啟發學生采用逆向思維進行如下思考:問題要求尋找出數組中的合數,可以從問題的反面來操作,找出數組中的非合數,即素數,并把這些素數從數組中剔除出來,那么原始數組中剩下的數組元素就是問題的解。由于素數有著清晰的定義和算法,實現起來較為容易。
對數組的訪問是通過數組下標進行的。常規的循環篩選方向是從第一個元素向最后一個元素進行循環,由于在篩選過程中會刪除部分數組元素,致使數組個數發生變化,但循環次數的結束條件和訪問數組元素的遞增的下標沒有變化,當前被刪除的元素的下標指示位置會被其后的元素占據,而下標在下一次循環后依然會遞增,從而漏掉該元素,數組元素的數目也會減少但循環結束的條件未變,訪問數組元素時會產生數組越界的問題?;谀嫦蛩季S,將循環方向進行逆轉,即從最后一個數據元素向第一數據元素進行循環,訪問元素的下標是遞減的,篩選過程中刪除的元素位于循環的后面,且循環結束的條件是止于第一個元素,因此不會出現遺漏數據元素和數組越界的問題。
基于逆向思維的數組求合數的代碼如下:


從教學過程來看,教學內容和問題是思維的對象,學生應該是思維主體,教師是學生思維的引導者。教師思維不能代替學生思維,又不能讓學生在別人思維途徑上進行模仿,因此要把握好引導的度,在講授知識的同時,啟發學生的逆向思維,引導學生主動地逆向思考,尋找問題的解決方法。
逆向思維教學是比較靈活的教學方式,旨在傳授知識的同時,提高學生的思維能力,因此必須針對學生的知識、思維能力和教學內容,做到因材施教,按學生的認知規律,遵循可接受原則,使學生的思維能力得以自然形成。
教師要充分認識到逆向思維對提高計算機類專業學生素質和技能的重要性。在常規教學方式中,要盡可能多地穿插逆向思維訓練,提高學生的思維能力。
逆向思維的思考方式具有很好的啟發性,在拓寬學生的思維方式、調動學生的學習積極性、提升其分析問題解決問題的能力、培養學生創新思維等方面具有較大的優勢。但是逆向思維教學也存在一定的弊端,主要有:(1)備課時間較長;(2)要求教師對問題有深刻的理解,并具備較強的思維能力;(3)課程的課時要比較充分。逆向思維是一種異于常規思維的思考方式,在將其運用到教學中時,需要根據問題本身的難易程度,與常規的思維教學方式相結合,取長補短,從而在活躍學生思維方式的同時,使教學內容更易理解和掌握,將教學效果提升一個層次。逆向思維教學方式何時、以何種方式與其他教學方法進行有機地結合,取長補短、相得益彰,是一個值得深入研究的課題。
[1]肖明.案例教學法在“C++語言程序設計”教學中的應用[J].計算機教育,2010(6):83-86.
[2]夏承遺,李文杰,孫世溫.問題驅動的“C++程序設計”教學方法研究[J].計算機教育,2010(1):122-125.
[3]杜少武,張毅,黃海宏,等.電力電子技術課程的逆向思維教學法研究[J].電氣電子教學學報,2007,29(4):94-97.
[4]向華.如何在C++教學中引入初步的設計模式思想[J].長江大學學報(自然科學版),2009,6(2):388-389.