林衛(wèi)中
(景德鎮(zhèn)陶瓷大學(xué)信息工程學(xué)院,景德鎮(zhèn) 333000)
結(jié)構(gòu)化的計算機程序設(shè)計中最重要的思想是“自頂向下,逐步求精”,并且在這一過程中僅使用順序、選擇和循環(huán)三種程序結(jié)構(gòu),并使用模塊化的函數(shù)編程解決問題。分析往年學(xué)生在學(xué)習(xí)程序設(shè)計入門課程如《C語言程序設(shè)計》或《Java語言程序設(shè)計》中的困惑,我們發(fā)現(xiàn)學(xué)生開始學(xué)習(xí)時重心往往放到繁瑣的語法學(xué)習(xí)上,而對程序結(jié)構(gòu)和函數(shù)的掌握比較困難。
Python語言是目前最接近自然語言的編程語言,它具有簡潔、高效和生態(tài)三個明顯的優(yōu)勢[1]。它提供了豐富的圖形計算生態(tài),借助Turtle庫可以簡單方便地實現(xiàn)圖形繪制,在Python教學(xué)中引入圖形繪制,可以達到增強學(xué)生學(xué)習(xí)興趣,培養(yǎng)學(xué)生現(xiàn)代計算思維的目的[2]。
目前,C語言程序設(shè)計和Java語言程序設(shè)計是絕大多數(shù)學(xué)校首選的計算機程序設(shè)計入門語言。對于初學(xué)程序設(shè)計的學(xué)生而言,C或Java語言入門比較困難,主要原因如下。
(1)入門語法繁瑣
C(或Java)語言是強類型語言,基礎(chǔ)語法要求復(fù)雜且嚴(yán)格,對變量的聲明和使用非常嚴(yán)格。另外它們的計算生態(tài)不如Python豐富,如輸入和輸出的處理,C語言中輸出函數(shù)printf細(xì)節(jié)太繁瑣,而Java中對輸入和輸出有太多的類之間的封裝也不是初學(xué)者容易理解的。這樣導(dǎo)致學(xué)生在初接觸程序設(shè)計時陷入繁瑣細(xì)節(jié)的學(xué)習(xí),無暇深入對程序結(jié)構(gòu)的理解和學(xué)習(xí)。
(2)教學(xué)案例呆板
在C(或Java)程序設(shè)計語言課程中大多使用求解數(shù)學(xué)類問題作為例題。很多學(xué)生對程序設(shè)計的興趣是來自于一些對程序的神秘和好玩,他們希望經(jīng)過學(xué)習(xí)后能解決一些實際的問題,如繪制玫瑰花、網(wǎng)絡(luò)爬蟲等。教材中枯噪的問題求解使大部分學(xué)生迅速地喪失了學(xué)習(xí)興趣,使得他們對程序設(shè)計產(chǎn)生了理想和現(xiàn)實差距的困惑[2]。
Python語言目前被廣泛使用,是面向?qū)ο蟮母呒壨ㄓ媚_本編程語言,具有語法簡單,明晰易懂的特點。近年來在各高校開始逐漸普及開始。2017年北京理工大學(xué)舉辦了首屆全國高校Python語言與計算生態(tài)教學(xué)研討會,掀起了Python的教學(xué)和教研熱潮。
隨著以計算思維為切入點的“大學(xué)計算機課程改革項目”的開展,一些高校老師在計算思維視域嘗試引入Python程序設(shè)計課程。黃靜為非計算機專業(yè)學(xué)生開始了Python的計算機基礎(chǔ)課程,有助于提升非計算機專業(yè)學(xué)生應(yīng)用計算機解決問題的能力與水平[3]。王亞萍開展了基于SPOC的翻轉(zhuǎn)課堂的Python程序設(shè)計課程,并構(gòu)建了基于過程的動態(tài)綜合評價方式,為高校計算機程序設(shè)計教學(xué)提供了一種可參考的實踐摸索[4]。
隨著Python教學(xué)實踐的開展,一些各具特色的教學(xué)案例和課程教學(xué)改革也紛呈出現(xiàn)。嵩天設(shè)計了“海龜繪圖作品”和“人物出場統(tǒng)計”教學(xué)實踐方案,并展示了在北京理工大學(xué)開展教學(xué)實踐的部分學(xué)生作品[5]。張思楊引入項目案例,以成果導(dǎo)向為指導(dǎo)的教學(xué)模式側(cè)重培養(yǎng)學(xué)生學(xué)習(xí)興趣、解決問題能力和計算思維[6]。
以上教學(xué)改革或教學(xué)實踐的開展為我們提供了藍本,很有借鑒意義。
Turtle庫是Python語言最基礎(chǔ)的圖形繪制函數(shù)庫,它具有如下優(yōu)點:首先,它的圖形繪制概念直觀易懂,模擬一只海龜爬行,將其爬行軌跡動態(tài)生成圖形進行輸出;其次,語法簡單,只要導(dǎo)入Turtle庫后,然后使用Turtle庫提供的函數(shù)表示海龜?shù)倪\動軌跡即可;第三,它需要記憶的基本函數(shù)非常少且容易記住,常用的只需記住約10個的函數(shù)即可(見表1),而且函數(shù)的名字與海龜動作名稱的自然語言一致,易于記憶。
表1 Turtle庫常用函數(shù)
在繪圖時,只要計算好海龜?shù)倪\動軌跡,無需繁瑣的語法,按運動軌跡調(diào)用對應(yīng)的函數(shù)即可。
我們設(shè)計一個簡單的教學(xué)案例:繪制一個四邊形,按簡單的計算思維,那就是繪制出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個像素,然后順時針旋轉(zhuǎn)900,再前爬25個像素,如此重復(fù)4次直到海龜回到原來位置。圖形繪制的效果如圖1。
圖1 繪制4邊形
程序設(shè)計結(jié)構(gòu)是計算機程序設(shè)計語言教學(xué)中的重點和難點內(nèi)容,結(jié)構(gòu)化的程序設(shè)計僅使用3種基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。在Python圖形化的程序設(shè)計結(jié)構(gòu)教學(xué)中,使用Turtle庫就可以跳過繁瑣的基礎(chǔ)語法知識,引導(dǎo)學(xué)生深入理解程序的三種結(jié)構(gòu)。在解決具體圖形繪制問題時,學(xué)生只要計算出海龜?shù)倪\動軌跡,再通過調(diào)用goto()、penup()、circle()和pendown()等函數(shù)就可以實現(xiàn)圖形的繪制,進一步,通過設(shè)置turtle的填充屬性如begin_fill()、pencolor()、end_fill()等函數(shù)就可以為繪制的圖形填充顏色。通過這些函數(shù)可以使繪制的圖形色澤鮮艷、生動,滿足學(xué)生的興趣,讓學(xué)生直觀理解三種程序結(jié)構(gòu)[2]。
以案例1為例,分析代碼發(fā)現(xiàn):第3行和第4行重復(fù)出現(xiàn)4次,在程序設(shè)計中,這樣重復(fù)的工作可以使用循環(huán)結(jié)構(gòu)實現(xiàn),改編后的代碼如下:
t.setup(400,400,20,20)
for i in range(4):
t.forward(25)
t.right(90)
代碼中的range(4)表示計數(shù)4次。通過這個案例可以簡單地把程序結(jié)構(gòu)從順序結(jié)構(gòu)過渡到循環(huán)結(jié)構(gòu)。
繪制一個如圖2的簡筆畫的魚。
圖2 簡筆畫魚
代碼如下所示:
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),魚身和魚尾都是三角形,再比較對應(yīng)的代碼8-14行和17-23行,進一步發(fā)現(xiàn)海龜?shù)膭幼魇且粯拥?,僅是一些具體的值不同,那么我們可以把一些相似的動作設(shè)計成一個函數(shù)模塊,把動作不同的值設(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ù)的作用,整個程序設(shè)計過程沒有繁瑣的語法規(guī)則,重點在問題解的本身。
為提高學(xué)生興趣,并進行愛國主義教育,我們還設(shè)計了繪制國旗、機器貓、給老師獻花等案例。案例效果圖見圖5。這些教學(xué)案例通過數(shù)學(xué)計算得到海龜?shù)倪\行軌跡,然后調(diào)用turtle庫函數(shù)實施繪制,語法簡單,案例生動活潑,貼近生活,極大地調(diào)動了學(xué)生的積極性,激發(fā)了學(xué)生的興趣,讓學(xué)生認(rèn)識到編程是件很好玩的事。特別是在繪制國旗的教學(xué)過程中穿插介紹巴西里約熱內(nèi)盧奧運會上懸掛的中國國旗出現(xiàn)每個小五角星水平對著大星的嚴(yán)重錯誤。通過這個故事告訴學(xué)生在計算位置坐標(biāo)時,小五角星各有一個尖正對大星中心點,象征圍繞中國共產(chǎn)黨領(lǐng)導(dǎo)下的人民大團結(jié),結(jié)合教學(xué)進行愛國主義教育,讓愛國主義教育不再空洞,而是落實在計算只中,效果反響良好。
圖3 綜合設(shè)計教學(xué)案例
基于Turtle庫簡單的圖形繪制函數(shù),我們在計算機程序設(shè)計教學(xué)中,一改以往純粹地解決數(shù)學(xué)問題作為編程例題和習(xí)題的做法,把圖形繪制引入到程序設(shè)計教學(xué)中,通過教學(xué)實踐設(shè)計了眾多的教學(xué)案例,這些教學(xué)案例不要求學(xué)生掌握負(fù)責(zé)的語言語法,把注意力放回問題本身。實踐表明,通過生動鮮明、貼合生活實際的教學(xué)案例可以極大激發(fā)學(xué)生學(xué)習(xí)編程的興趣,建立學(xué)習(xí)的信心,能更好地掌握計算機程序設(shè)計中的程序結(jié)構(gòu)設(shè)計和函數(shù)的概念,程序設(shè)計能力有很大提升。