林衛(wèi)中
(景德鎮(zhèn)陶瓷大學(xué)信息工程學(xué)院,景德鎮(zhèn) 333000)
結(jié)構(gòu)化的計(jì)算機(jī)程序設(shè)計(jì)中最重要的思想是“自頂向下,逐步求精”,并且在這一過程中僅使用順序、選擇和循環(huán)三種程序結(jié)構(gòu),并使用模塊化的函數(shù)編程解決問題。分析往年學(xué)生在學(xué)習(xí)程序設(shè)計(jì)入門課程如《C語言程序設(shè)計(jì)》或《Java語言程序設(shè)計(jì)》中的困惑,我們發(fā)現(xiàn)學(xué)生開始學(xué)習(xí)時(shí)重心往往放到繁瑣的語法學(xué)習(xí)上,而對(duì)程序結(jié)構(gòu)和函數(shù)的掌握比較困難。
Python語言是目前最接近自然語言的編程語言,它具有簡(jiǎn)潔、高效和生態(tài)三個(gè)明顯的優(yōu)勢(shì)[1]。它提供了豐富的圖形計(jì)算生態(tài),借助Turtle庫可以簡(jiǎn)單方便地實(shí)現(xiàn)圖形繪制,在Python教學(xué)中引入圖形繪制,可以達(dá)到增強(qiáng)學(xué)生學(xué)習(xí)興趣,培養(yǎng)學(xué)生現(xiàn)代計(jì)算思維的目的[2]。
目前,C語言程序設(shè)計(jì)和Java語言程序設(shè)計(jì)是絕大多數(shù)學(xué)校首選的計(jì)算機(jī)程序設(shè)計(jì)入門語言。對(duì)于初學(xué)程序設(shè)計(jì)的學(xué)生而言,C或Java語言入門比較困難,主要原因如下。
(1)入門語法繁瑣
C(或Java)語言是強(qiáng)類型語言,基礎(chǔ)語法要求復(fù)雜且嚴(yán)格,對(duì)變量的聲明和使用非常嚴(yán)格。另外它們的計(jì)算生態(tài)不如Python豐富,如輸入和輸出的處理,C語言中輸出函數(shù)printf細(xì)節(jié)太繁瑣,而Java中對(duì)輸入和輸出有太多的類之間的封裝也不是初學(xué)者容易理解的。這樣導(dǎo)致學(xué)生在初接觸程序設(shè)計(jì)時(shí)陷入繁瑣細(xì)節(jié)的學(xué)習(xí),無暇深入對(duì)程序結(jié)構(gòu)的理解和學(xué)習(xí)。
(2)教學(xué)案例呆板
在C(或Java)程序設(shè)計(jì)語言課程中大多使用求解數(shù)學(xué)類問題作為例題。很多學(xué)生對(duì)程序設(shè)計(jì)的興趣是來自于一些對(duì)程序的神秘和好玩,他們希望經(jīng)過學(xué)習(xí)后能解決一些實(shí)際的問題,如繪制玫瑰花、網(wǎng)絡(luò)爬蟲等。教材中枯噪的問題求解使大部分學(xué)生迅速地喪失了學(xué)習(xí)興趣,使得他們對(duì)程序設(shè)計(jì)產(chǎn)生了理想和現(xiàn)實(shí)差距的困惑[2]。
Python語言目前被廣泛使用,是面向?qū)ο蟮母呒?jí)通用腳本編程語言,具有語法簡(jiǎn)單,明晰易懂的特點(diǎn)。近年來在各高校開始逐漸普及開始。2017年北京理工大學(xué)舉辦了首屆全國(guó)高校Python語言與計(jì)算生態(tài)教學(xué)研討會(huì),掀起了Python的教學(xué)和教研熱潮。
隨著以計(jì)算思維為切入點(diǎn)的“大學(xué)計(jì)算機(jī)課程改革項(xiàng)目”的開展,一些高校老師在計(jì)算思維視域嘗試引入Python程序設(shè)計(jì)課程。黃靜為非計(jì)算機(jī)專業(yè)學(xué)生開始了Python的計(jì)算機(jī)基礎(chǔ)課程,有助于提升非計(jì)算機(jī)專業(yè)學(xué)生應(yīng)用計(jì)算機(jī)解決問題的能力與水平[3]。王亞萍開展了基于SPOC的翻轉(zhuǎn)課堂的Python程序設(shè)計(jì)課程,并構(gòu)建了基于過程的動(dòng)態(tài)綜合評(píng)價(jià)方式,為高校計(jì)算機(jī)程序設(shè)計(jì)教學(xué)提供了一種可參考的實(shí)踐摸索[4]。
隨著Python教學(xué)實(shí)踐的開展,一些各具特色的教學(xué)案例和課程教學(xué)改革也紛呈出現(xiàn)。嵩天設(shè)計(jì)了“海龜繪圖作品”和“人物出場(chǎng)統(tǒng)計(jì)”教學(xué)實(shí)踐方案,并展示了在北京理工大學(xué)開展教學(xué)實(shí)踐的部分學(xué)生作品[5]。張思楊引入項(xiàng)目案例,以成果導(dǎo)向?yàn)橹笇?dǎo)的教學(xué)模式側(cè)重培養(yǎng)學(xué)生學(xué)習(xí)興趣、解決問題能力和計(jì)算思維[6]。
以上教學(xué)改革或教學(xué)實(shí)踐的開展為我們提供了藍(lán)本,很有借鑒意義。
Turtle庫是Python語言最基礎(chǔ)的圖形繪制函數(shù)庫,它具有如下優(yōu)點(diǎn):首先,它的圖形繪制概念直觀易懂,模擬一只海龜爬行,將其爬行軌跡動(dòng)態(tài)生成圖形進(jìn)行輸出;其次,語法簡(jiǎn)單,只要導(dǎo)入Turtle庫后,然后使用Turtle庫提供的函數(shù)表示海龜?shù)倪\(yùn)動(dòng)軌跡即可;第三,它需要記憶的基本函數(shù)非常少且容易記住,常用的只需記住約10個(gè)的函數(shù)即可(見表1),而且函數(shù)的名字與海龜動(dòng)作名稱的自然語言一致,易于記憶。

表1 Turtle庫常用函數(shù)
在繪圖時(shí),只要計(jì)算好海龜?shù)倪\(yùn)動(dòng)軌跡,無需繁瑣的語法,按運(yùn)動(dòng)軌跡調(diào)用對(duì)應(yīng)的函數(shù)即可。
我們?cè)O(shè)計(jì)一個(gè)簡(jiǎn)單的教學(xué)案例:繪制一個(gè)四邊形,按簡(jiǎn)單的計(jì)算思維,那就是繪制出4條邊,代碼如下:
import turtle as t
t.setup(400,400,20,20)
t.forward(25)
t.right(90)
t.forward(25)
t.right(90)
t.forward(25)
t.right(90)
t.forward(25)
t.right(90)
在本例中設(shè)置圖形窗口位于屏幕左上角(20,20),寬和高均為400像素,海龜先往前爬25個(gè)像素,然后順時(shí)針旋轉(zhuǎn)900,再前爬25個(gè)像素,如此重復(fù)4次直到海龜回到原來位置。圖形繪制的效果如圖1。

圖1 繪制4邊形
程序設(shè)計(jì)結(jié)構(gòu)是計(jì)算機(jī)程序設(shè)計(jì)語言教學(xué)中的重點(diǎn)和難點(diǎn)內(nèi)容,結(jié)構(gòu)化的程序設(shè)計(jì)僅使用3種基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。在Python圖形化的程序設(shè)計(jì)結(jié)構(gòu)教學(xué)中,使用Turtle庫就可以跳過繁瑣的基礎(chǔ)語法知識(shí),引導(dǎo)學(xué)生深入理解程序的三種結(jié)構(gòu)。在解決具體圖形繪制問題時(shí),學(xué)生只要計(jì)算出海龜?shù)倪\(yùn)動(dòng)軌跡,再通過調(diào)用goto()、penup()、circle()和pendown()等函數(shù)就可以實(shí)現(xiàn)圖形的繪制,進(jìn)一步,通過設(shè)置turtle的填充屬性如begin_fill()、pencolor()、end_fill()等函數(shù)就可以為繪制的圖形填充顏色。通過這些函數(shù)可以使繪制的圖形色澤鮮艷、生動(dòng),滿足學(xué)生的興趣,讓學(xué)生直觀理解三種程序結(jié)構(gòu)[2]。
以案例1為例,分析代碼發(fā)現(xiàn):第3行和第4行重復(fù)出現(xiàn)4次,在程序設(shè)計(jì)中,這樣重復(fù)的工作可以使用循環(huán)結(jié)構(gòu)實(shí)現(xiàn),改編后的代碼如下:
t.setup(400,400,20,20)
for i in range(4):
t.forward(25)
t.right(90)
代碼中的range(4)表示計(jì)數(shù)4次。通過這個(gè)案例可以簡(jiǎn)單地把程序結(jié)構(gòu)從順序結(jié)構(gòu)過渡到循環(huán)結(jié)構(gòu)。
繪制一個(gè)如圖2的簡(jiǎn)筆畫的魚。

圖2 簡(jiǎn)筆畫魚
代碼如下所示:
import turtle as t
t.setup(600,500,10,10)
t.fillcolor("yellow")
t.begin_fill()
#畫魚身
t.goto(200,200)
t.goto(200,-200)
t.home()
t.up()
t.goto(200,0)
t.down()
#畫魚尾
t.goto(250,50)
t.goto(250,-50)
t.goto(200,0)
t.up()
t.goto(50,-10)
t.down()
#畫魚眼
t.circle(10)
t.end_fill()
t.done()
通過觀察結(jié)果圖和分析代碼發(fā)現(xiàn),魚身和魚尾都是三角形,再比較對(duì)應(yīng)的代碼8-14行和17-23行,進(jìn)一步發(fā)現(xiàn)海龜?shù)膭?dòng)作是一樣的,僅是一些具體的值不同,那么我們可以把一些相似的動(dòng)作設(shè)計(jì)成一個(gè)函數(shù)模塊,把動(dòng)作不同的值設(shè)計(jì)成函數(shù)的參數(shù),所示的代碼可以改編為函數(shù)實(shí)現(xiàn)方式。
import turtle as t
def drawTriAngle(ax, ay, bx, by, px, py):
t.goto(ax,ay)
t.goto(ax,-ay)
t.goto(bx,by)
t.up()
t.goto(px,py)
t.down()
t.setup(600,500,10,10)
t.fillcolor("yellow")
t.begin_fill()
#畫魚身
drawTriAngle(200,200,0,0,200,0)
#畫魚尾
drawTriAngle(250,50,200,0,50,-10)
#畫魚眼
t.circle(10)
t.end_fill()
t.done()
通過本案例的教學(xué),讓學(xué)生感受到模塊化的過程,理解函數(shù)的作用,整個(gè)程序設(shè)計(jì)過程沒有繁瑣的語法規(guī)則,重點(diǎn)在問題解的本身。
為提高學(xué)生興趣,并進(jìn)行愛國(guó)主義教育,我們還設(shè)計(jì)了繪制國(guó)旗、機(jī)器貓、給老師獻(xiàn)花等案例。案例效果圖見圖5。這些教學(xué)案例通過數(shù)學(xué)計(jì)算得到海龜?shù)倪\(yùn)行軌跡,然后調(diào)用turtle庫函數(shù)實(shí)施繪制,語法簡(jiǎn)單,案例生動(dòng)活潑,貼近生活,極大地調(diào)動(dòng)了學(xué)生的積極性,激發(fā)了學(xué)生的興趣,讓學(xué)生認(rèn)識(shí)到編程是件很好玩的事。特別是在繪制國(guó)旗的教學(xué)過程中穿插介紹巴西里約熱內(nèi)盧奧運(yùn)會(huì)上懸掛的中國(guó)國(guó)旗出現(xiàn)每個(gè)小五角星水平對(duì)著大星的嚴(yán)重錯(cuò)誤。通過這個(gè)故事告訴學(xué)生在計(jì)算位置坐標(biāo)時(shí),小五角星各有一個(gè)尖正對(duì)大星中心點(diǎn),象征圍繞中國(guó)共產(chǎn)黨領(lǐng)導(dǎo)下的人民大團(tuán)結(jié),結(jié)合教學(xué)進(jìn)行愛國(guó)主義教育,讓愛國(guó)主義教育不再空洞,而是落實(shí)在計(jì)算只中,效果反響良好。

圖3 綜合設(shè)計(jì)教學(xué)案例
基于Turtle庫簡(jiǎn)單的圖形繪制函數(shù),我們?cè)谟?jì)算機(jī)程序設(shè)計(jì)教學(xué)中,一改以往純粹地解決數(shù)學(xué)問題作為編程例題和習(xí)題的做法,把圖形繪制引入到程序設(shè)計(jì)教學(xué)中,通過教學(xué)實(shí)踐設(shè)計(jì)了眾多的教學(xué)案例,這些教學(xué)案例不要求學(xué)生掌握負(fù)責(zé)的語言語法,把注意力放回問題本身。實(shí)踐表明,通過生動(dòng)鮮明、貼合生活實(shí)際的教學(xué)案例可以極大激發(fā)學(xué)生學(xué)習(xí)編程的興趣,建立學(xué)習(xí)的信心,能更好地掌握計(jì)算機(jī)程序設(shè)計(jì)中的程序結(jié)構(gòu)設(shè)計(jì)和函數(shù)的概念,程序設(shè)計(jì)能力有很大提升。