金一民
摘要:圖形化編程在小學(xué)階段開(kāi)展得如火如荼,但初中生學(xué)習(xí)高級(jí)程序設(shè)計(jì)語(yǔ)言(如Python,C++)比較困難。作者認(rèn)為,圖形化編程和高級(jí)程序設(shè)計(jì)語(yǔ)言之間如果能有效進(jìn)行知識(shí)遷移,則能促進(jìn)初中生學(xué)好高級(jí)程序設(shè)計(jì)語(yǔ)言。Mind+軟件在新版本中推出了Python模式,將模塊與Python指令實(shí)時(shí)匹配,做到了圖形化和程序代碼的結(jié)合,即“圖代”結(jié)合。利用“圖代結(jié)合”通過(guò)由淺入深的教學(xué),把遞歸等算法清晰地展示給學(xué)生,加快初中生對(duì)高級(jí)程序設(shè)計(jì)語(yǔ)言的使用和理解,由此發(fā)現(xiàn)“圖代”結(jié)合能夠有效促進(jìn)學(xué)生對(duì)高級(jí)程序設(shè)計(jì)語(yǔ)言的學(xué)習(xí),讓小學(xué)時(shí)期所學(xué)的編程知識(shí)有了更多的用武之地?!皥D代”結(jié)合的作用是趨近于流程圖的圖形模塊與程序代碼形成近似匹配,降低學(xué)習(xí)難度,提高學(xué)習(xí)深度,對(duì)培養(yǎng)創(chuàng)新精神和計(jì)算思維有積極意義。
關(guān)鍵詞:“圖代”結(jié)合;算法;知識(shí)遷移;計(jì)算思維
中圖分類號(hào):G642 ?文獻(xiàn)標(biāo)識(shí)碼:A ?論文編號(hào):1674-2117(2022)03-0000-04
● 始于創(chuàng)客軟件版本更新,深挖“圖代”知識(shí)有效遷移
Mind+軟件是配套于DFROBOT創(chuàng)客設(shè)備的圖形化編程軟件,有使用Arduino C語(yǔ)言的上傳模式,但是在上傳模式中代碼區(qū)域不是隨著模塊增減的變化而變化,同時(shí)也需要硬件的支持否則無(wú)法進(jìn)入該模式,因而它對(duì)學(xué)習(xí)計(jì)算機(jī)語(yǔ)言并不友好。雖然筆者帶學(xué)生參加創(chuàng)客項(xiàng)目比賽,一直用DFROBOT的創(chuàng)客設(shè)備,也持續(xù)使用此款軟件,但在V1.7.0RC3.0版本出來(lái)后,美妙的東西隨之出現(xiàn),筆者腦海中也有了新的編程教學(xué)思維。
Mind+推出了全新的Python模式,它解決了長(zhǎng)期以來(lái)一直困擾筆者的關(guān)于高級(jí)程序設(shè)計(jì)語(yǔ)言學(xué)習(xí)的一個(gè)重要問(wèn)題,即如何讓圖形化編程和程序代碼之間進(jìn)行有效的知識(shí)遷移?對(duì)于計(jì)算機(jī)語(yǔ)言的教學(xué)來(lái)說(shuō),圖形化編程是很棒的入門,很容易被中小學(xué)生接受,學(xué)生只需要拖動(dòng)模塊,不考慮其他太多因素,就能把一個(gè)程序?qū)懗鰜?lái),但在學(xué)習(xí)諸如Python,C++,Java這類高級(jí)程序設(shè)計(jì)語(yǔ)言時(shí),需要記憶許多內(nèi)容,思考抽象問(wèn)題,還要搞清符合規(guī)范的符號(hào)等,否則就會(huì)報(bào)錯(cuò)或存在漏洞。這樣的變化肯定會(huì)極不舒服,但Mind+推出了全新的Python模式,就好像在圖形化編程和學(xué)習(xí)高級(jí)程序設(shè)計(jì)語(yǔ)言之間給出了一個(gè)緩沖地帶,確保兩者間的知識(shí)能較柔和地進(jìn)行遷移。
Mind+推出的Python模式包含模塊方式和代碼方式。以模塊方式舉例,如下頁(yè)圖1所示,可以發(fā)現(xiàn)在界面的左側(cè)部分,Python中能用到的數(shù)據(jù)類型、結(jié)構(gòu)等都有對(duì)應(yīng)的圖形化模塊,當(dāng)拖動(dòng)指令模塊到腳本區(qū)域并連接到“Python主程序開(kāi)始”后,在自動(dòng)生成區(qū)域就能實(shí)時(shí)匹配相應(yīng)的程序代碼,接著可以點(diǎn)擊運(yùn)行按鈕,終端內(nèi)就會(huì)出現(xiàn)運(yùn)行結(jié)果。
● 由淺入深教學(xué),“圖代”共建計(jì)算思維
使用由淺入深的教學(xué)方式來(lái)學(xué)習(xí)計(jì)算機(jī)算法是許多教師普遍的做法,首先做一個(gè)乘法案例,如10*2=20,要求是以加法的方式表示,即使是小學(xué)生也懂得2+2+2+2+2+2+2+2+2+2,用10個(gè)2逐個(gè)相加的方法,這就是遞歸,先展示用模塊搭建符合遞歸的條件的框架,即建立一個(gè)結(jié)構(gòu)框架,如圖2所示。
此函數(shù)調(diào)用自身規(guī)則是在原次數(shù)減一的基礎(chǔ)上加二并連加十次,可以得到F(n)=F(n-1)+2,那么把否則里的返回return None改成return (DiGui((CiShu - 1)) + 2),對(duì)應(yīng)的核心模塊如圖3所示。
接著,調(diào)用這個(gè)遞歸函數(shù)并輸入一個(gè)實(shí)際參數(shù),打印這個(gè)帶有實(shí)參的函數(shù),由于遞歸在Python中受到次數(shù)限制,所以輸入的時(shí)候要注意不要輸入過(guò)大的數(shù)值。參考代碼如圖4所示。
加二案例做完后讓學(xué)生知曉何為遞歸,那就是在運(yùn)行的過(guò)程中調(diào)用自身,且需具備的兩個(gè)條件:①子問(wèn)題與原始問(wèn)題為同樣的事,或更簡(jiǎn)單;②不能無(wú)限制地調(diào)用本身,應(yīng)有出口。
另外,以漢諾塔為例來(lái)加深構(gòu)建,漢諾塔規(guī)則:有A,B,C三根針,將A針上N個(gè)從小到大疊放的盤子移動(dòng)到C針,一次只能移動(dòng)一個(gè),不重復(fù)移動(dòng),小盤必須在大盤上面。根據(jù)實(shí)測(cè)結(jié)果f(1)=1,f(2)=3,f(3)=7,f(4)=15可以得出規(guī)律為f(n)=2*f(n-1)+1。所以,把否則里的返回return None改成return ((2 * HanNuoTa((YuanPanShuLiang - 1))) + 1),從中可以發(fā)現(xiàn)遞歸的結(jié)構(gòu)框架并沒(méi)有發(fā)生改變,改變的只有第二個(gè)返回的值(如下頁(yè)圖5)。
兩次加深對(duì)遞歸算法理解可能還不夠,可以再試著用階乘、斐波那契數(shù)列(其他數(shù)列都可以)、棋盤上的麥粒、楊輝三角等經(jīng)典案例,鞏固遞歸核心認(rèn)知,拓寬算法適用范圍。用了“圖代”結(jié)合的方式,可以把以前未涉及的或大多數(shù)不理解的算法講解清楚,真實(shí)觸及培養(yǎng)學(xué)生計(jì)算思維的基本要素,可能會(huì)成為他們?cè)谖磥?lái)求解問(wèn)題的重要手段。教師跟學(xué)生講解不必先從規(guī)范或格式開(kāi)始,不糾結(jié)于何時(shí)縮進(jìn),寫冒號(hào)、括號(hào)等。
● 用好對(duì)應(yīng)關(guān)系,促編程代碼加速理解
用模塊編寫完程序僅僅是開(kāi)始,還要對(duì)Python進(jìn)行全面描述,這種描述是可以根據(jù)模塊一一對(duì)應(yīng)的,在面對(duì)圖5所示的漢諾塔界面時(shí),學(xué)生肯定會(huì)提出疑問(wèn),前六行代碼帶有#的內(nèi)容沒(méi)有被顯示,無(wú)法找到對(duì)應(yīng)的模塊,這時(shí)可以告訴學(xué)生注釋的知識(shí),因?yàn)樽⑨屖浅绦騿T之間溝通的橋梁,讓學(xué)生先養(yǎng)成好習(xí)慣,即做好注釋。
定義對(duì)應(yīng)def,漢諾塔對(duì)應(yīng)HanNuoTa,圓盤數(shù)量對(duì)應(yīng)YuanPanShuLiang,如果對(duì)應(yīng)if,圓盤數(shù)量=0對(duì)應(yīng)YuanPanShuLiang ==0,返回?cái)?shù)字0對(duì)應(yīng)return 0,else對(duì)應(yīng)否則,返回2*漢諾塔圓盤數(shù)量-1+2對(duì)應(yīng)return((2* HanNuoTa((YuanPanShuLiang - 1)))+1),對(duì)于定義函數(shù)這樣的一一對(duì)應(yīng)是可行的,但也有另外的做法(如圖6),可以更好地解釋。
在“圖代”結(jié)合的方式下,多增加一行語(yǔ)法解釋,從整體上來(lái)理解編程代碼的含義以及符號(hào)的使用,條件判斷也可如圖7所示來(lái)操作。
可以發(fā)現(xiàn),指令模塊和語(yǔ)法解釋之間是好理解的,而指令模塊或語(yǔ)法解釋與Python語(yǔ)句對(duì)應(yīng)經(jīng)過(guò)了許多次匹配后學(xué)生的思維就會(huì)產(chǎn)生有趣的變化,當(dāng)進(jìn)行圖形化編程時(shí)會(huì)聯(lián)想到Python代碼,當(dāng)直接寫Python代碼時(shí)又會(huì)聯(lián)想到圖形化編程,這是一件特別好的事情。眾所周知,右腦思維是一種圖像思維,主要是針對(duì)圖形的感知功能,也可以理解成圖形化編程部分;左腦以邏輯思維為主,主要包括邏輯分類功能、語(yǔ)言功能、數(shù)學(xué)運(yùn)算功能、理性思維功能,也可以理解成Python代碼部分。這樣就意味著學(xué)生的左右腦同時(shí)工作,那么知識(shí)遷移將會(huì)更容易實(shí)現(xiàn)。另外,圖形化編程結(jié)構(gòu)跟流程圖比較相似,把“圖代”結(jié)合者認(rèn)為類似流程圖和高級(jí)程序設(shè)計(jì)語(yǔ)言之間的匹配也未嘗不可。
● 發(fā)揮Mind+軟件優(yōu)勢(shì),推薦庫(kù)深度教學(xué)
再看看Mind+軟件的代碼模式,直接在里面寫出符合Python語(yǔ)法的代碼,必須先建立一個(gè)擴(kuò)展名為.py的文件,然后在編寫區(qū)域內(nèi)輸入程序指令,會(huì)有一些智能提示,熟練后并不比專業(yè)的軟件慢,如果忘了怎么寫,看一下軟件左側(cè)的模塊指令區(qū)域,拖出相應(yīng)的模塊指令會(huì)生成相應(yīng)的Python語(yǔ)句,如圖8所示。
所以,無(wú)論是以拖動(dòng)模塊指令為主的模塊模式還是以代碼輸入為主的代碼模式都降低了編寫程序的難度,對(duì)初中生學(xué)習(xí)高級(jí)程序設(shè)計(jì)語(yǔ)言來(lái)說(shuō)是非常友好的。對(duì)教學(xué)來(lái)說(shuō),不用過(guò)多關(guān)注書(shū)寫是否符合要求,應(yīng)重點(diǎn)強(qiáng)調(diào)提升學(xué)生對(duì)計(jì)算思維的理解。
筆者之所以用Python是因?yàn)镻ython之禪,但更重要的是其豐富的庫(kù),恰巧Mind+也支持這樣的操作,點(diǎn)擊庫(kù)管理,就會(huì)出現(xiàn)熟悉的庫(kù)名,安裝模式可以直接選擇源再點(diǎn)安裝,也可以使用pip模式進(jìn)行安裝,已安裝的會(huì)出現(xiàn)在庫(kù)列表中,使用的時(shí)候只需要import一下(如圖9)。
這里的庫(kù)存量很豐富,雖然大多都是存在,但很多庫(kù)可以導(dǎo)入但并不能真正地使用,雖然目前這個(gè)版本尚無(wú)法對(duì)這些內(nèi)容進(jìn)行全方位支持,但對(duì)于初中生學(xué)習(xí)來(lái)講已經(jīng)是綽綽有余。
● 國(guó)產(chǎn)軟件兼容并蓄,“圖代”迸發(fā)思維火花
從Scratch的缺位到很多類似Mind+的新版本“雨后春筍”般的出現(xiàn)可以看出,國(guó)產(chǎn)圖形化編程軟件正在經(jīng)歷著一個(gè)“百家爭(zhēng)鳴”“兼容并蓄”的階段,這樣的嘗試對(duì)教師和學(xué)生來(lái)講,都是積極的良性的探索。我們擁有著一副“好牌”,當(dāng)然,好牌也存在打爛的情況,所以教師必須堅(jiān)定地走好每一步,讀懂創(chuàng)作者的心意,深挖“圖代”結(jié)合,用好“圖代”結(jié)合,讓學(xué)生小學(xué)時(shí)期所學(xué)習(xí)的編程知識(shí)有更多的用武之地。讓初中生能夠在計(jì)算思維和創(chuàng)造精神方面有更多的探索機(jī)會(huì)。
參考文獻(xiàn):
[1]趣味編程指南(8-1)-自定義函數(shù)與分形遞歸-DF創(chuàng)客社區(qū)-分享創(chuàng)造的喜悅[J/OL] (2017-8-18).https://mc.dfrobot.com.cn/thread-24203-1-1.html.
[2]Python代碼模式- Mind+教程[J/OL](https://mindplus.dfrobot.com.cn/Python-code.2021-5-15).
[3]劉汝佳.算法競(jìng)賽入門經(jīng)典(第2版)[M]北京:清華大學(xué)出版社 2015,6.
[4]董永建.信息學(xué)奧賽一本通[M]北京:科學(xué)技術(shù)文獻(xiàn)出版社,2017,10.