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