王文靜 江蘇省南京市中華中學(xué)上新河初級中學(xué)
陳瀾 南京師范大學(xué)附屬中學(xué)新城初級中學(xué)
培養(yǎng)學(xué)生的計算思維是使其掌握信息技術(shù)學(xué)科大概念自動化的必要前提。同時,計算思維作為一種思維方法,可與其他核心素養(yǎng)緊密結(jié)合,促進信息技術(shù)核心素養(yǎng)的全面發(fā)展。筆者根據(jù)多年教學(xué)經(jīng)驗發(fā)現(xiàn),在初三年級學(xué)生的思維活動中,抽象思維已經(jīng)占據(jù)了首要位置,且更多屬于經(jīng)驗類型的范疇,其特點是需要用感性經(jīng)驗為抽象思維活動的開展提供直接支撐。因此,作為計算思維技能的五大要素之一,抽象思維能力的強弱直接影響學(xué)生計算思維的形成和計算思維能力的發(fā)展,所以,教師在開展Python程序設(shè)計教學(xué)時,應(yīng)將源于生活的問題作為課堂教學(xué)的情境,進而為學(xué)生抽象思維的運用和發(fā)展做好鋪墊。
下面,筆者以編寫“猜數(shù)字”游戲為例展開分析。本節(jié)課是基于計算思維視域下的Python程序設(shè)計教學(xué),是以培養(yǎng)學(xué)生計算思維為主要目標(biāo)而開展的課堂教與學(xué)活動。
教師邀請兩位學(xué)生演示“猜1到100之間數(shù)字”的游戲,教師板書猜數(shù)字的過程,其余學(xué)生觀看。教師提出問題:“如何利用Python語言編寫猜數(shù)字游戲的程序?”并進行如下引導(dǎo)。
師:要想用Python編寫猜數(shù)字的游戲,首先要從程序設(shè)計的角度理清問題。所以,這個問題的表述應(yīng)該是:計算機產(chǎn)生一個1到100的隨機整數(shù),然后用戶猜測,直到猜出數(shù)字,程序結(jié)束。為了簡化這個問題,我們能不能分解一下?
生:可以分成兩個部分,一是計算機產(chǎn)生一個隨機數(shù);二是猜數(shù)字。
師:很好,確實可以這樣分解問題。不過,好像還沒有分解到位。第二部分是否還可進行再次分解,讓我們更清晰地知道用戶與計算機之間是如何互動的?
學(xué)生嘗試回答問題。
師:通過同學(xué)們的踴躍回答,再次分解后的結(jié)果已經(jīng)出來了。猜數(shù)字這一部分分解為:①猜測一個數(shù);②當(dāng)猜測的數(shù)大于產(chǎn)生的隨機數(shù)時,計算機提示“大了,請重新猜”,再次猜測;③當(dāng)猜測的數(shù)小于產(chǎn)生的隨機數(shù)時,計算機提示“小了,請重新猜”,再次猜測;④當(dāng)猜測的數(shù)等于產(chǎn)生的隨機數(shù)時,計算機提示“猜對了”,游戲結(jié)束。不過這樣的表述看上去還是復(fù)雜了一點,沒有一目了然的感覺。那么,如何將分解后的問題直觀、清晰地表達呢?
生:刪除一些文字,可以按條目列出來。
師:在數(shù)學(xué)里求解應(yīng)用題的時候,解題步驟是怎樣的呢?
生:刪除不必要的信息,設(shè)未知數(shù),列出表達式。
師:對嘛!其實這就是刪除不必要的細(xì)節(jié),利用符號表達,用符號表達問題的過程就是對問題認(rèn)知抽象的過程。下面,我們嘗試使用符號表達分解后的問題。我先帶領(lǐng)同學(xué)們完成第一部分和第二部分的第一塊,剩下來的請同學(xué)們來告訴我如何抽象問題,以降低問題的復(fù)雜性。第一部分產(chǎn)生一個1到100的隨機整數(shù),可以表述為1<=num<=100;第二部分的第一步可以表述為2.1 guess?。剩下來的,請同學(xué)們告訴我。
生1:2.2 guess>num print(“大了,請重新猜”) again 2.1
生2:2.3 guess<num print(“小了,請重新猜”) again 2.1
生3:2.4 guess==num print(“猜對了”) over
教師板書經(jīng)抽象后問題分析的結(jié)果。
此教學(xué)片段是分析環(huán)節(jié),在此環(huán)節(jié)著重訓(xùn)練學(xué)生對問題分解的能力和分解問題后抽象的能力。為將現(xiàn)實生活中的兩個人玩的猜數(shù)字游戲做成一個人也可以玩的計算機游戲,需要教師帶領(lǐng)學(xué)生進行問題分析,第一步就是要將這個問題分解為不同的組成部分,以方便后續(xù)的問題處理。教師先引導(dǎo)學(xué)生將猜數(shù)字游戲分解成兩大部分,再將第二部分分解成四個小部分,與此同時將分解后的結(jié)果板書。觀察板書發(fā)現(xiàn)不夠一目了然,通過與數(shù)學(xué)中應(yīng)用題的解題策略類比,將解決方案從數(shù)學(xué)的問題情境中轉(zhuǎn)移到程序設(shè)計的問題分析中,刪除不必要的細(xì)節(jié)并使用符號化的表達式來描述問題分解后的過程,進而降低問題的復(fù)雜性。在此過程中,從程序設(shè)計的一般步驟層面來說,學(xué)生完成的是對問題的分析;從計算思維培養(yǎng)的層面來說,學(xué)生重點發(fā)展了分解和抽象的能力。
師:同學(xué)們,按照程序設(shè)計的一般過程,在問題分析后應(yīng)該做什么?
生:算法設(shè)計。
師:同學(xué)們看一下問題分析的結(jié)果,是不是覺得猜數(shù)字游戲的算法已經(jīng)非常好設(shè)計了?請大家告訴我,算法在哪里?再看一下流程圖,思考其是否正確描述了猜數(shù)字游戲的算法?
學(xué)生觀察流程圖,思考并回答問題。
生:流程圖有問題,這個流程圖只能執(zhí)行一次就結(jié)束了。
師:是的,這個流程圖只能執(zhí)行一次就結(jié)束了,也就是說用戶只能猜一個數(shù)字,無論猜測正確與否程序都會結(jié)束。該如何解決這樣的問題呢?在前面的學(xué)習(xí)中,我們已經(jīng)基本了解并掌握了程序設(shè)計中的兩種基本結(jié)構(gòu)——順序結(jié)構(gòu)和選擇結(jié)構(gòu),為了解決現(xiàn)在這個問題,我們需要學(xué)習(xí)程序設(shè)計的第三種基本結(jié)構(gòu)——循環(huán)結(jié)構(gòu)。循環(huán)結(jié)構(gòu)是指在程序中需要反復(fù)執(zhí)行某個功能而設(shè)置的一種程序結(jié)構(gòu),它由循環(huán)體中的條件判斷繼續(xù)執(zhí)行某個功能還是退出循環(huán)。循環(huán)結(jié)構(gòu)可以看成是一個條件判斷語句和一個向回轉(zhuǎn)向語句的組合。循環(huán)結(jié)構(gòu)在程序框圖中是利用判斷框來表示,判斷框內(nèi)寫上條件,兩個出口分別對應(yīng)條件成立和條件不成立時所執(zhí)行的不同指令,其中一個要指向循環(huán)體,然后再從循環(huán)體回到判斷框的入口處。
教師演示循環(huán)結(jié)構(gòu)流程圖動畫,學(xué)生聽講、觀察,完成對循環(huán)結(jié)構(gòu)流程圖的學(xué)習(xí)。
此教學(xué)片段主要描述的是編寫猜數(shù)字游戲的算法設(shè)計環(huán)節(jié)。因為在問題分析完成后此程序的算法已經(jīng)基本清晰,故本節(jié)課的算法設(shè)計部分是教師帶領(lǐng)學(xué)生從評價一個不完整的流程圖開始,學(xué)生通過觀察、思考、評估流程圖執(zhí)行的結(jié)果發(fā)現(xiàn)存在的問題,進而引發(fā)認(rèn)知沖突并激發(fā)求知欲。從教學(xué)邏輯上說,在算法設(shè)計環(huán)節(jié)中,為能夠繪制循環(huán)猜測直到猜出正確數(shù)字的流程圖,學(xué)生需要了解程序中循環(huán)結(jié)構(gòu)的含義并掌握流程圖中循環(huán)結(jié)構(gòu)的表示方法;從計算思維培養(yǎng)上看,能夠評估算法的正確性并發(fā)現(xiàn)算法可能存在的問題是對學(xué)生評估能力第一層次的培養(yǎng)與鍛煉,學(xué)習(xí)繪制循環(huán)結(jié)構(gòu)流程圖并利用流程圖描述問題解決的具體步驟是對學(xué)生算法能力第一層次的訓(xùn)練與鞏固。
師:同學(xué)們,我們已經(jīng)完成了程序設(shè)計一般過程的第一步和第二步,下一步是什么?
生:編寫代碼。
師:不錯,是編寫代碼,但最好這樣表述:按照算法編寫代碼。編寫這個程序?qū)ν瑢W(xué)們來說唯一的難點是如何實現(xiàn)循環(huán)結(jié)構(gòu)。我們本節(jié)課學(xué)習(xí)利用while循環(huán)語句編寫程序?qū)崿F(xiàn)程序的循環(huán)結(jié)構(gòu),這既是本節(jié)課的學(xué)習(xí)難點,也是學(xué)習(xí)重點。我們知道學(xué)習(xí)Python語法的方法很簡單,有著固定的步驟和方法。請一位同學(xué)告訴我,在學(xué)習(xí)if語句時,是按照什么樣的步驟和方法熟悉和掌握if語句的語法的?
生:第一步,認(rèn)真閱讀if語句的語法格式;第二步,閱讀if語句的應(yīng)用樣例,參照樣例程序編寫、修改變量數(shù)值并觀察結(jié)果;第三步,嘗試編寫一個簡單的應(yīng)用if語句的程序,調(diào)試并得到正確結(jié)果。
師:很好!同樣地,為了了解、掌握while的語法格式并能應(yīng)用while語句編寫猜數(shù)字游戲,請同學(xué)們打開學(xué)件參照學(xué)習(xí)if語句語法格式時的過程和方法,盡快了解和掌握while的語法格式。
本教學(xué)片段是概括能力的培養(yǎng)與訓(xùn)練。對“概括”能力的訓(xùn)練需層層遞進,從發(fā)展學(xué)生識別問題共性的能力開始,逐步過渡到幫助學(xué)生能夠修改某一問題的解決方案使之解決類似的問題,最后使學(xué)生能夠?qū)⒔鉀Q問題的方案從一個情境順利轉(zhuǎn)移到其他情境中,并使得問題得以解決。
師:編寫猜數(shù)字游戲的知識儲備已經(jīng)完成了,現(xiàn)在請同學(xué)們按照流程圖編寫代碼,并測試結(jié)果。
學(xué)生編寫代碼。
師:有沒有同學(xué)編寫的程序能夠正確運行?
生:老師,我的程序可以正確運行,不過只能猜一次數(shù)字。
師:思考一下原因是什么?是不是流程圖中的算法有問題?
生:老師,我知道了,流程圖中只有判斷數(shù)字是否相等,但判斷結(jié)束后沒有再次輸入數(shù)字的地方,所有按照這樣的算法編寫的程序只能夠判斷一次。
師:不錯,請大家修改算法,然后編寫代碼,測試程序是否符合要求。如果你認(rèn)為目前的算法不夠簡潔請自行修改、編寫代碼并測試程序。我們可以對while語句想想辦法(提示)。
生:我覺得循環(huán)語句中對輸入數(shù)字大小的判斷用一個雙分支結(jié)構(gòu)就可以了,沒有必要用兩個單分支結(jié)構(gòu),也就是說用一個if…else取代兩個if語句。
師:很好!這樣做精簡了代碼,邏輯上更清晰。還有沒有?
生:我用了另一種更簡單的方法。學(xué)習(xí)材料中有while與break結(jié)合的樣例,所以我的循環(huán)體第一行是while 1:,這樣循環(huán)就可以一直存在;第二行是input函數(shù),這樣整個程序就不需要使用兩個input函數(shù),可以減少代碼的行數(shù);在第三行中使用if…elif…else語句,if用于判斷是否大于,elif用于判斷是否小于,else后直接break一下,因為排除大于和小于這兩種情況后就只能等于了。跳出循環(huán)體后,程序的最后一行直接輸出“猜對了”就可以了。
師:非常棒!你觀察敏銳,活學(xué)活用,用精練的算法解決了這個問題。同學(xué)們在完成自己的代碼后,可以嘗試這位同學(xué)的算法編寫程序并測試結(jié)果。
在此教學(xué)片段中,學(xué)生按照算法設(shè)計環(huán)節(jié)中繪制的流程圖編寫代碼會發(fā)現(xiàn)并不能得到預(yù)想的結(jié)果,需要再次評估原先的流程圖,發(fā)現(xiàn)其中的問題并進行修改以得到正確的結(jié)果。隨后,教師要求學(xué)生觀察已經(jīng)編寫的代碼,結(jié)合選擇結(jié)構(gòu)程序設(shè)計的相關(guān)語法以及本節(jié)課所提供的學(xué)習(xí)材料思考能否優(yōu)化程序,引導(dǎo)學(xué)生借此反推,修改原有流程圖,使得猜數(shù)字的流程圖更加簡潔,同時也使得所編寫的程序更加優(yōu)美。