陳丹亞
摘要:本文以《數據與計算》第三章3.4節《分支結構算法實現》的教學過程為例,以“一元二次方程求解”為學習問題,建構問題化學習教學模式,以“呈現問題è分析問題è推進問題è解決問題è總結問題è拓展問題”為實施路徑,讓學生在問題的解決中,層層深入的認識選擇結構,完善程序。旨在讓學生通過對某“個”實例的分析,找出分支結構的規律性問題,歸納出選擇結構的一般格式,實現從“個”到“類”的提升。文中詳細分解問題化學習實施路徑中的每個環節,總結設計意圖和注意事項,以希望對高中信息教學中問題化學習的教學策略的應用提供參考。
關鍵詞:分支結構;問題化學習;課堂建構;實施路徑
本課的授課對象為必修1《數據與計算》的高一學生,大多學生對利用信息技術解決實際問題充滿好奇心,樂于和同學一起進行問題的分析與探討。急切地想編寫程序解決生活中更為復雜的實際問題,但是他們現有的知識結構僅僅掌握Python常量、變量、函數、書寫表達式等基礎知識,僅限于解決順序結構的問題,將實際問題轉化為算法程序的能力也有待提高。經過本課學習后,學生應達到課程標準“計算思維水平2”中的部分要求,在日后實踐中,能認識到分支結構在學習生活中的應用價值,自覺運用分支結構解決問題。
針對這一學情和教學目標,我們以問題為導向,按照問題化學習模式進行如下實施:
一、呈現問題,引入主題
提問1:生活中大家有碰到過哪些選擇性問題嗎?實例應用的選擇結構類型一樣嗎?
師生互動舉例。(略)
提問2:在前面的章節學習中,我們已經分析了“一元二次方程求解”算法的流程圖實現,很明顯也是一種分支結構,那又該如何實現呢?
設計意圖:創設情境,導入主題,聯系生活實例讓學生產生共鳴,讓學生感受到選擇結構是用于判斷給定的條件,根據判斷的結果控制程序執行流程,分為單分支、雙分支及多分支選擇結構。
二、分析問題,抽象建模
提問3:第二章學習時已經分析了“一元二次方程求解”算法的流程圖實現,現在要求輸入a,b,c的值,有解的情況下輸出解,無解的情況下輸出“無解”,程序該如何實現?
自學導學案中的if語句的語法要點,先嘗試用if語句實現兩種情況的求解程序。
1、用流程圖表達分支算法
(1)明確判斷的條件表達式
(2)梳理條件成立和不成立時的執行步驟
(3)畫出算法流程圖
2、Python 語句實現的語法格式歸納:
(1)雙分支結構:有if,也有else,用來處理二選一的情況
If語句的語法格式如下:
if <條件表達式> :
<語句塊1>
else:
<語句塊2>
雙分支if語句的執行過程是:首先計算條件的值,如果條件的值為“真”,則執行語句1后結束if語句;如果條件的值為“假”,則執行else后邊的語句2后結束if語句。
(2)單分支結構:只有if,沒有else
If語句的語法格式如下:
if <條件表達式> :
<語句塊>
單分支if語句的執行過程是:首先計算條件的值,如果條件的值為“真”,則執行語句后結束if語句;如果條件的值為“假”,則立即結束。適合只需要對條件為真的情況做出處理的程序。
設計意圖:學生通過第二章的學習鋪墊,已經理清了一元二次方程求解的思路和求根公式的表達式書寫,所以只要應用合適的if語法結構,就可以完成實踐1的目標設定。
注意事項:因為學生是第一次接觸Python的if語句結構,教師需要總結語法格式書寫的注意事項與要點。特別強調Python中的縮進是強制的,縮進的語句視為代碼塊(以縮進標記程序結構),通過縮進,Python能夠識別出語句是隸屬于if(else)的分支。這也是以后解題劃分結構的重要依據。
實踐1:依次輸入a,b,c的值,有解的情況下輸出解,無解的情況下輸出“無解”,代碼如下:
a=int(input(“a=”))
b=int(input(“b=”))
c=int(input(“c=”))
d= b**2-4*a*c
if d>=0 :
x1=(-b+ d**0.5)/(2*a)
x2=(-b-d**0.5)/(2*a)
print(“x1=”,x1, “x2=”,x2)
else:
print(“無解”)
三、推進問題,提升難度
提問4:如果要實現依次輸入a,b,c的值,程序運行后能分別判斷輸出2個不同的解,2個相同的解,無解的三種情況的算法,程序又該如何實現?
1、Python 語句多重分支實現的語法格式歸納:
(1)塊if語句結構
if <條件1> :
<語句塊1>
elif <條件2> :
<語句塊2>
……
elif <條件N-1> :
<語句塊N-1>
else:
<語句塊 N>
教師總結歸納:首先計算條件1的值,如果條件1的值為“真”,則執行語句1后結束if語句;否則計算條件2的值,如果條件2的值為“真”,則執行語句2后結束if語句;……;條件1至條件n-1的值都為“假”時,最后執行else子句的語句n。
級聯式if語句在語法上是一條語句,只是在else子句中包含了if語句,而該if語句的else子句又包含了if語句,以此類推。
四、解決問題,實踐應用
實踐2:在實踐1的基礎上,優化算法,應用塊if語句結構,實現依次輸入a,b,c的值,程序運行后能分別判斷輸出2個不同的解,2個相同的解,無解的三種情況的算法。
a=int(input(“a=”))
b=int(input(“b=”))
c=int(input(“c=”))
d= b**2-4*a*c
if d>0 :
x1=(-b+ d**0.5)/(2*a)
x2=(-b-d**0.5)/(2*a)
print(“x1=”,x1, “x2=”,x2)
elif d==0 :
x1=(-b+ d**0.5)/(2*a)
x2=x1
print(“x1=x2=”,x1)
else:
print(“無解”)
五、總結問題,探索規律
實踐3:編寫程序:輸入身高和體重,求BMI指數。
要求:輸入身高(米)、體重(千克),求BMI指數(體重除以身高的平方),IBM值低于18.5 時輸出“偏輕”; 18.5-25 輸出“正?!? 25-28 輸出“過重”; 28-32 輸出“肥胖 ”。
設計意圖:實踐3的要求相對實踐2增加為4種情況的判斷,學生在掌握三種情況的塊if語句書寫的前提下應該是很容易完成要求的,進一步提升學生的遷移能力。
提問:多分支結構在哪些生活情景中有應用?大家是否可以應用本節課所學知識編寫程序解決?
【應用一】出租車費計算問題
【應用二】電費計算問題
【應用三】超市打折問題
設計意圖:本課在對學生核心素養的培養重在通過對現實問題的分析、抽象與建模,形成分支結構算法概念,并使用計算機程序解決問題??偨Y利用計算機解決問題的過程與方法,并遷移到與之相關的其他問題解決中。
六、拓展問題,激發思考
提問5:多分支的選擇結構是不是只有塊if語句結構呢?能不能分解為多個雙分支或單分支結構?語法格式又該如何調整?
教師給出嵌套if結構語句實現的導學案,學生自主學習,鼓勵學生思考如何用嵌套if語句將一元二次方程三種情況求解的程序進行結構調整,體驗嵌套if語句格式和塊if語句的區別。
設計意圖:不同的分支結構有不同的語法格式和適用場合。牢固掌握選擇結構程序設計,是學習程序設計的基本要求,是學會編寫結構清晰、易讀易懂的程序的前提。
程序設計的學習主要圍繞環境、語言和應用三個方面的知識和內容展開,語言視圖的學習,其核心主要在于語言規則本身。從教學方式來看,以往的程序設計語言規則的學習往往采用三步走的形式,即“提出問題,給出解答,再加點解釋”,特別是“解釋”,往往過多的糾纏于程序設計語言的語法知識的細枝末節之中,學生較少體驗到解決問題的成功的喜悅。
本節課運用了問題化學習的教學模式,首先選擇學生已有的知識架構貼近的“一元二次方程求解”問題引入,分析解決這個問題的“程序”。遵循學生認知能力的發展規律,從簡單的雙分支逐漸提升到多分支,在嘗試補充程序模板中關鍵代碼的過程中,逐步認識If選擇結構,并引導學生提取出If語句的基本格式,最終得到功能強大If語句的指令集。最后進行拓展應用,將現實生活中各種多分支問題問題歸類,學以致用,讓學生感受編程學習的魅力。
問題化學習的教學模式在有限的課堂教學時間內,聚焦問題,層層遞進,學生通過自主發現問題、持續探索問題、建構問題系統、合作解決問題的過程,完成知識的探究,有助于學生從整體上認識選擇結構,并不斷向縱深發展。這是使用傳統的講授法是無法完成的。這一課堂建構模式與實施路徑值得在后續的章節教學中推廣應用。
參考文獻:
[1]中華人民共和國教育部.普通高中信息技術課程標準:2017年版[S].北京:人民教育出版社,2018.
[2] 徐誼.基于學習方式變革的課堂轉型探索.現代教學,2019(10A):25-26.
[3] 王天蓉.問題化學習的原理和方式.現代教學,2019(10A):27-28