胡金錦
摘要:讓學生學習編程,引導學生深度思考算法及其工作流程,親歷問題建模、算法設計、程序實現及優化的完整過程,引領學生從計算機科學家視角分析問題、解決問題,對于學生而言,無疑是一種觀察世界的全新視角。
關鍵詞:算法;程序;計算思維;冒泡排序
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2017)35-0126-03
伴隨面向對象程序語言的興起,算法思維與建模能力的培養在高中信息技術課堂中一度被弱化,原因是編程環境的可視化和控件的事件響應,以及追求程序課堂的趣味性,讓算法與程序設計課向多媒體技術方向發展。這樣的課堂雖然沒有拋棄程序基本語言的學習,但是漂亮的程序代碼、嚴謹規范的語言風格、計算思維的訓練卻被忽視。我們在程序教學的路途中,常有茫然失措、忘了初心的感覺。
著名的計算機科學家、圖靈獎得主艾茲格·迪杰斯特拉說:“我們所使用的工具影響著我們的思維方式和思維習慣,從而也將深刻地影響著我們的思維能力。”計算機給我們提供了一種全新的思維方式——計算思維。美國卡內基梅隆大學周以真教授認為:計算思維是人們運用計算機科學思想與方法進行問題求解、系統設計,以及人類行為理解等涵蓋計算機科學廣度的一系列思維活動。新課標將“計算思維”引入課堂,使信息技術課程教學從注重實踐操作的技術素養層面上升到注重思維素養培養的層面。
下面,我們以《冒泡排序》為例來談如何在程序設計課中落實計算思維的養成,以期拋磚引玉,與同行們一起努力建構更好的算法與程序設計教學模式。
1 第一層次思維:實際問題的抽象與量化
計算機思維的本質是以“0”和“1”為基礎的數字量來反映真實世界。“模”“數”的轉換是人類與計算機建立聯系的紐帶。因此,實際問題的抽象與量化是計算思維形成的第一層次。下面是我在課堂中引導學生體驗實際問題抽象量化的一個課堂片段:
師:生活中,我們經常碰到排隊的情況,比如:操場上排隊做操、醫院里排隊看病。
我邀請第一排6位同學上來,要求學生按身高進行排序。“不對不對,生一應該排在生二后面……”,下面學生囔囔著。6位學生前前后后調整了幾次總算排好了位置。
接著,我讓后面一排6位同學先用記號筆把身高寫在A4紙上,然后到上面排隊,大家互相看看身高,不一會就排好了。
師(指著其中一位換到前面去的同學):請這位同學說說為什么第二次排隊效率比較高。
這時學生一般會提到數字標明比較明確,方便比較大小。
(學生體驗到了抽象與量化,在問題處理中的優勢。)
師:學生身高抽象為數學量以后,使問題簡潔明確,方便我們處理,所以下面的同學一看就知道順序了。排隊是一種排序——通過調整位置,把雜亂無章的數據變成有序數據。
師:當學生數量比較多,比如在操場上,我們就沒法一眼看出誰身高第一、誰第二、誰第三……。其實,我們人腦的計算力是有限的,當隨之人數的增加,數據規模就會擴大,人腦處理就會越來越困難,這時我們可以借助計算機。要讓計算機幫我們排序,我們首先要記錄6位同學的身高數據。我們用哪種變量類型比較適合?
生:數組。
師:嗯,數組。但計算機生活在“01”世界里,有它自己的布爾智慧,我們生活中的排序思維方法不能直接移植給計算機,而需要通過計算機的布爾邏輯特性進行算法設計以做到人機互適。計算機排序算法的類型很多,這節課我們來學習一種比較典型的排序算法“冒泡排序”。
2 第二層次的思維:基于模型建構算法
計算思維源自數學思維,像所有的科學一樣,其基礎建筑于數學之上。計算思維又源自工程思維,基本計算設備的限制迫使計算機學家必須考慮計算機的特性。在教學中能突破簡單問題的求解,挖掘人機共存算法思維顯得尤為重要。教師可以通過模擬執行法、自頂向下逐步求精法,特殊到一般歸納總結法等,給學生展示與剖析算法的原理與思想。
2.1 模擬執行,體驗計算機處理數據的過程。
教師通過PPT展示冒泡排序數據存儲結構:
表1
[下標 1 2 3 4 5 6 數組a() 49 97 65 13 76 38 ]
教師模擬計算機完成第一趟數據的比較和交換過程后:
師:數據兩兩比較一共比較了幾次?
生:5次。
師:第一趟完成后數據有什么特征?
學生交流討論得出結論,最大數97被交換到了最后。
師:第二趟比較需要比較幾次?
學生交流討論,得出結論第二次比較只需比較4次,因為最大數已經排定。
教師再演示第二遍的過程讓學生印證自己的想法。
第二遍排序結束后,讓學生寫出第三趟排序結果,了解學生的掌握情況。之后教師進行適當的總結,讓學生繼續觀察第四、第五遍的排序結果。總結出冒泡排序的規律:
(1) 從一端開始,逐對進行相鄰元素比較
(2) 如果前一個數比后一個數大,則進行交換
(3) 重復(1)、(2)步驟直到得到一個最值(位置右端)
(4) 重復(1)、(2)、(3)步處理n-1趟,完成排序
2.2 畫流程圖,感悟自頂相下逐步求精的思想
教師以具體的6個數升序排序為例,由最簡單的流程圖1開始,讓學生回顧冒泡排序的特點,每趟比較可以確定一個最數(最大或最小),確定完成6個數排序需要5趟,得出流程圖2。
得出流程圖2后,教師讓學生思考:這種結構實際上屬于什么結構?(循環結構)引入變量i進行計數,使用循環結構流程圖進行進一步細化,得到流程圖3。后拓展到n個數的情況,得到流程圖4。
這里需要引入一個j變量來標識正在參加比較的數組元素。確定第i趟j的取值范圍為:1到n-i,得到圖6。
在分析相鄰數據比較交換模塊時,可以描述為a(j)與下一個數a(j+1)比較大小。如果a(j)>a(j+1)就交換數據位置,得到圖7。
再將“a(j),a(j+1)數據交換位置”流程細化為:t=a(j):a(j)=a(j+1):a(j+1)=t得到圖8。數據交換需結合變量賦值原理進行講解:變量名的實質是申明內存單元,賦值的過程是數據寫入變量名所指內存單元的過程,新數據寫入會覆蓋原來的數據,造成數據丟失。
至此,所有問題、難點自頂向下逐一解決后,用自底部向上的思路形成下面總流程圖,如圖9。
3 第三層次思維:從算設計到代碼實現
要讓計算機解決問題,需要將算法用計算機“語言”表示并告知計算機,這個過程稱為“代碼實現”或“編程”。學生若缺乏上機編程,就無法充分理解變量定義、邏輯運算、循環嵌套、形參實參等運行機制,無法深度思考算法及其工作流程。本環節通過關鍵代碼引導的方式讓學生動手編寫程序,旨在讓學生通過編寫代碼、調試程序,親歷完整的編程過程,加深對算法的理解與應用,同時培養學生認真、嚴謹、堅韌的優秀品質,教學環節如下:
首先,講解關鍵程序段實現方法。
1) i:控制冒泡排序的趟數,由1到n-1
for i=1 to n-1
每趟確定一個最大數
next i
2) j:控制每一趟的處理過程,控制數組下標,由1變到n-i
for j=1 to n-i
a(j)與a(j+1)進行比較判斷是否互換
next j
3) a(j)與a(j+1)互換
t=a(j):a(j)=a(j+1):a(j+1)=t
接著,讓學生對照流程圖,自下往上,寫出主要參考代碼:
for i=1 to n-1
for j=1 to n-i
if a(j)>a(j+1) then
t=a(j):a(j)=a(j+1):a(j+1)=t
end if
next j
next i
在編程實現環節,學生遇到的錯誤五花八門,一般我們可以分為三類:編譯錯誤;運行錯誤;邏輯錯誤。錯誤是課堂的生成性教學資源,是教師進一步展開教學的依據:如運行錯誤往往與數據溢出有關,可以加深學生對變量存儲的理解,如邏輯錯誤,往往與學生對算法理解不到位有關,可以引導學生正確理解算法。教師要引導學生用分類的思想判別錯誤,用模塊化的思想縮小錯誤范圍,用逐步調試的方法鎖定錯誤,最終達到預期效果,使學生分析問題,解決問題的能力得到提升。
4 第四層次思維:逐步養成“迭代”的思維
學習的最高層次是應用,即解決實際問題。當我們面對實際問題,通常通過觀察弄清問題,抓住問題的特征進行廣泛的聯想、檢索和回憶,制定選擇最優解決方案。能否找到合適的策略與觀察問題的角度及聯想范圍有關,受學生已有知識與經驗的制約。在學生思維受阻時,我們應引導學生調整思維方向,變換角度進行分析思考,直到產生新的思路,對培養學生解決問題的能力與創新能力十分有益。
在程序與算法模塊的實際教學中,可以通過對算法變形、優化及情境模擬,培養學生聯想、檢索、回憶等解決問題的能力。教學環節設計需要注意以下幾點:第一要有目的性,要明確通過拓展是使學生掌握算法的哪些外延與內涵,還是滲透一些算法思想與方法,第二要有適度性,過于簡單易陷入簡單的重復,無法提高學生思維品質,過于復雜會挫傷學生學習積極性。第三要學會放手,靜待花開。通過教師的信任與等待,以及必要時機的釋疑,最終厚積薄發,學生會成為獨立自主、敢于質疑、有創造力與創新精神的學習資者。
在冒泡排序教學中,可以安排一系列遞進的教學任務,如同質化任務:將“升序冒泡排序程序”改為“降序冒泡排序”,加深了學生對相鄰元素比較判斷的理解;優化任務:讓學生討論當某趟比較過程中沒有數發生交換,是否需要在進行下一趟比較交換,給學生灌輸流程優化的思想;變形任務:將“從前向后冒泡排序”改為“從后往前冒泡排序”,綜合檢驗學生對冒泡思想的掌握與編程實現的能力;應用任務:評委打分,去掉最高分、最低分的實現,提高學生解決實際問題的能力……
正式在這種算法不斷優化的“迭代”過程中,學生的計算思維才能獲得不斷的提升。
5 結束語
當“程序驅動”的數字化工具滲透到人們生活、學習和工作的方方面面,甚至成為人們生活的一部分時,人們不僅需要具
備操作這些技術工具的技能,同樣需要深層次理解這些技術工具,知道它們的工作原理和工程思想,并學會運用這些思想,優化我們的工作與生活,即發展計算思維。讓學生學習編程,引導學生深度思考算法及其工作流程,親歷完整的編程過程,學會像計算機科學家一樣思考,對于他們的意義可謂一種觀察世界的全新視角。
參考文獻:
[1] 李鋒,熊璋.面向核心素養的信息技術課程:數據與計算”模塊[J].中國電化教育,2017,1(360).
[2] 邵紅祥.基于計算思維的高中信息技術選修課程設計與開發[J].中國信息技術教育,2016(17).
[3] 任樟輝.數學思維論[M].南寧:廣西教育出版社,1996.