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