劉 旭,馬文彬,吳 茜
(陸軍軍事交通學(xué)院 基礎(chǔ)部,天津 300161)
目前大學(xué)計算機程序設(shè)計類課程可供選擇的高級語言種類很多,常見的包括C、C++、C#、Java、Python 等,這些編程語言都各有特點和應(yīng)用領(lǐng)域。當(dāng)然,不同編程語言的學(xué)習(xí)難度曲線也各不相同。對于低年級大學(xué)生,尤其是非計算機專業(yè)的學(xué)生,選擇一門難度低、功能強大、應(yīng)用范圍廣的語言入門十分關(guān)鍵[1]。
當(dāng)今中外高校都困擾的問題是程序設(shè)計語言課程的教學(xué)方法無法達到預(yù)期的教學(xué)目標。美國大學(xué)率先引入Python 語言改革程序設(shè)計類課程教學(xué),取得了明顯的效果。
Python 語言語法簡潔、清晰、易讀,應(yīng)用非常廣泛,是一門非常適合非計算機專業(yè)大學(xué)生學(xué)習(xí)、能培養(yǎng)其計算思維和提高創(chuàng)新能力的編程語言。Python 輕語法、重解決問題,這就決定了學(xué)生在學(xué)習(xí)Python 時,難度起點低,容易入門。
Python 語言的優(yōu)勢還體現(xiàn)在類庫豐富、應(yīng)用廣泛上[2]。目前,Python 語言擁有各類包庫超過10 萬個。這使Python 語言在教學(xué)時適用于各專業(yè)各層次的學(xué)生。其中,網(wǎng)絡(luò)爬蟲既有相對容易的Requests 庫,也有專業(yè)的Scrapy 爬蟲框架;科學(xué)計算有NumPy 庫;中文分詞有jieba 庫;繪圖可以使用相對簡單的、內(nèi)置的turtle 庫,也可以使用知名的二維繪圖Matplotlib 庫等[3]。
在選定理想的編程語言之后,接下來的問題就是如何講授才能讓學(xué)生了解和掌握這門語言。例如,程序設(shè)計類課程都要講解3 種控制結(jié)構(gòu),即順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)。以往的教學(xué)方法大多都采用講授基本語法和編程思路、畫流程圖、例題演示等形式,但教學(xué)效果并不理想。學(xué)生在學(xué)習(xí)初期出現(xiàn)了不理解、沒有思路或當(dāng)時理解而獨立編程又無從下手的現(xiàn)象。這一方面由于學(xué)生剛開始學(xué)習(xí)還沒有形成編程的思維;另一方面則是因為代碼例題講解效果不夠直觀,無法真正幫助學(xué)生理解代碼。那么如何解決這一問題,使實例講解的過程發(fā)揮作用,并由此建立一種規(guī)則意識,把對問題和算法的認識用程序正確地表達出來?
在很多情況下,當(dāng)文字無法表述清楚的時候,人們會想到圖像,比如機械原理的講解配圖、網(wǎng)頁內(nèi)容呈現(xiàn)的圖像輔助等,這些都說明了圖像具有形象直觀、能夠從整體上把握全局的優(yōu)點。
Python 有十分強大的類庫,其中在繪圖方面可以使用內(nèi)置turtle 庫繪出簡單且有規(guī)律的圖形。turtle 庫繪圖這部分內(nèi)容可以放在已經(jīng)介紹完順序結(jié)構(gòu)、選擇結(jié)構(gòu)以及單層循環(huán)結(jié)構(gòu)之后再講解,這樣既可以介紹turtle 庫的繪圖方法,又可以通過修改相應(yīng)代碼觀察生成圖像的變化,以此更直觀地鞏固和深入理解三種控制結(jié)構(gòu),并進一步學(xué)習(xí)復(fù)雜的多層循環(huán)結(jié)構(gòu)。這里介紹3 種控制結(jié)構(gòu)的不同案例圖形。
順序結(jié)構(gòu)的特點是按照解決問題的順序?qū)懗鱿鄳?yīng)的語句,執(zhí)行順序是自上而下,逐條語句執(zhí)行。在講這部分的內(nèi)容時,可讓學(xué)生先熟悉turtle 繪圖的常用命令(畫筆運動命令、畫筆控制命令、畫筆全局命令),邊學(xué)邊試邊練,從最簡單的圖形開始畫起,圖1 中的圖形都是由順序的筆畫完成的。
在連線圖形的基礎(chǔ)上可以嘗試填充顏色,從簡單彩色邊框到畫出指定角度對稱的圖案,讓學(xué)生逐步了解編程的思路,體會其中樂趣。
圖1 順序筆畫繪圖
選擇結(jié)構(gòu)的特點在于判斷給定的條件,根據(jù)判斷的結(jié)果來控制程序的流程,見圖2。使用選擇結(jié)構(gòu)語句時,要用條件表達式if 語句控制線條的走向和轉(zhuǎn)角,繪制出指定的圖案。
該例中用if 語句判定變量x,利用x的值控制線條的走向,當(dāng)x大于0 時則水平方向繪制,否則垂直方向繪制,重復(fù)多個if-else 語句畫出了階梯形狀的圖形。上述這個例子是典型的單分支語句,當(dāng)遇到需要兩個以上分支時,if 語句就不適用了,這時就要用到多分支語句,能使程序根據(jù)具體問題有多個分支。
圖2 下半部分演示了if-elif-else 多分支語句的控制流程,從圖中可看出利用判定變量y值所在的范圍區(qū)域控制線條的轉(zhuǎn)角從而繪制出多折線圖形。單分支與多分支語句是控制語句中的重點,要求學(xué)生理解并靈活運用。
循環(huán)語句的初衷是為了減少源程序重復(fù)書寫的工作量,用來描述重復(fù)執(zhí)行某段代碼的問題,這是程序設(shè)計中最能發(fā)揮計算機特長的程序結(jié)構(gòu)。循環(huán)結(jié)構(gòu)的本質(zhì)就是一個條件判斷語句和一個轉(zhuǎn)向語句的組合,在一定條件下反復(fù)執(zhí)行某段程序的流程結(jié)構(gòu),被反復(fù)執(zhí)行的程序被稱為循環(huán)體。循環(huán)語句由循環(huán)體及循環(huán)的終止條件兩部分組成。
圖2 選擇結(jié)構(gòu)繪圖
循環(huán)結(jié)構(gòu)是程序設(shè)計的3 種基本結(jié)構(gòu)中較難的一種,利用while、for 語句的基本格式及執(zhí)行規(guī)則,采用由簡到繁的教學(xué)過程,體驗循環(huán)語句中如何設(shè)定循環(huán)變量、循環(huán)條件和循環(huán)體。
圖3 用for 循環(huán)結(jié)構(gòu),循環(huán)體中簡單的兩個語句就完成圖形的繪制,大大減少了重復(fù)代碼的工作量。這可使用問題引導(dǎo)、比較法等教學(xué)方法,以便最大限度讓學(xué)生舉一反三,從而掌握循環(huán)語句的簡單應(yīng)用。
掌握了單層循環(huán)之后,通過修改單層循環(huán)代碼變換生成圖形進一步引出復(fù)雜多重循環(huán)。學(xué)生利用這種方式可以在理解簡單循環(huán)的基礎(chǔ)之上,學(xué)習(xí)多重循環(huán)結(jié)構(gòu)并且對其加深理解。
圖3 循環(huán)結(jié)構(gòu)繪圖
通過模仿、遷移、提高3 個階段的學(xué)習(xí)和操作,獲取循環(huán)語句解決問題的基本思想和方法,歸納循環(huán)語句解決問題的共性和適應(yīng)性。
此外,關(guān)于算法的講解,也可以基于繪圖講解,比如在介紹遞歸算法時,可利用繪制分形樹圖案來分步驟講解算法思想,如圖4 繪制不同樣式的二叉樹,我們可以先給出左圖的基本代碼,由學(xué)生在此基礎(chǔ)之上修改循環(huán)體語句中畫筆長度以及轉(zhuǎn)角的值,以實現(xiàn)右邊兩幅圖的效果。以此讓學(xué)生在進一步理解循環(huán)體語句的同時,輔助學(xué)習(xí)遞歸算法。
這一部分知識的學(xué)習(xí)既是對循環(huán)結(jié)構(gòu)的深入理解,又對順序、選擇結(jié)構(gòu)有著很好的鞏固作用。在此類課程的考試中,主要是考察控制語句程序的代碼編寫,應(yīng)指導(dǎo)學(xué)生在課下作相應(yīng)的練習(xí)加以鞏固,這樣才能更好地使學(xué)生理解和掌握,也能加強對這一方面知識的興趣培養(yǎng)。
圖4 二叉樹繪圖
當(dāng)然,文中所述教學(xué)方法的實施還有一些前提條件,比如學(xué)生需要具有預(yù)備知識儲備,在用圖例法講授之前需要學(xué)生已經(jīng)掌握了控制語句簡單例題,可以自行解決一些簡單的計算問題。教師在學(xué)生準備預(yù)備知識的環(huán)節(jié)可以采用多種手段,比如在線觀看教學(xué)視頻、閱讀文檔和教學(xué)案例、小組討論等[4]。這樣用新的教學(xué)法培養(yǎng)學(xué)生自主地、創(chuàng)造地學(xué)習(xí),再用畫圖的形式輔助理解程序設(shè)計中遇到的復(fù)雜問題。在實際授課中,筆者嘗試將此法運用到控制語句的講授過程中,達到了較好的預(yù)期效果。