姚佳俊 曹恒來
● 學習者分析
本課的教學對象是高二年級的學生,他們思維活躍,具有一定的邏輯思維和推理演繹的能力,但歸納總結能力較弱。在前面的課程中,學生已經掌握了VB的常量、變量、表達式、Let語句、Print方法等基本知識,了解了程序設計的一般過程,急切地想編寫程序解決生活中更為復雜的實際問題,但他們現有的知識結構僅限于解決順序結構的問題,而且將實際問題轉化為VB程序的能力也有待提高。
● 學習內容分析
本課是教育科學出版社出版的《算法與程序設計》(選修)第二章“程序的基本結構”中第三節第二部分的內容。任何規范的程序都可以分解為三種基本結構,即順序結構、選擇結構和循環結構,教材的前一節介紹了順序結構程序設計。選擇結構是用于判斷給定的條件,并根據判斷的結果控制程序的執行流程,它分為單分支、雙分支及多分支選擇結構,而不同的分支結構有不同的語法格式和適用場合。牢固掌握選擇結構程序設計,是學習程序設計的基本要求,是學會編寫結構清晰、易讀易懂的程序的前提。
● 教學目標
知識與技能目標:掌握選擇結構的基本格式,理解選擇結構的執行過程。
過程與方法目標:能根據問題建立合適、正確的條件,利用選擇結構解決實際問題。
情感態度與價值觀目標:領悟選擇結構的思想,體驗選擇在生活中的應用。
● 教學重點、難點
重點:選擇結構的基本格式,利用選擇結構解決實際問題。
難點:選擇結構的嵌套。
● 教學策略
本課教學采用了案例模擬教學法。筆者通過呈現問題、觀察代碼、模仿嘗試、歸納小結、問題解決、拓展應用、總結提升等課堂教學環節,設計了遞進式的學習活動。學生通過“比較兩個數的大小”“出租車計費器”“月餅促銷”“計算三角形面積”“BMI等級的判斷”等程序的完善,在解決一個個問題的同時,層層深入地認識選擇結構。學生在模仿中,通過對多個“個”的嘗試,找出“個”背后“類”的規律性問題,歸納出選擇結構的一般格式,實現從“個”到“類”的提升。這樣的設計有助于學生從整體上認識選擇結構,并不斷地向縱深發展。同時,真實的問題情境能有效地激發學生的學習興趣,讓他們積極思考、主動建構,獲得程序設計的成就感。
● 教學過程
1.代碼呈現
運行上節課編寫的“計算兩個數的商”程序,代碼如下:
Private Sub cmddiv_Click()
Dim x As Single ' 被除數
Dim y As Single ' 除數
Dim q As Single ' 商
x = Val(InputBox("請輸入被除數:"))
y = Val(InputBox("請輸入除數:"))
q = x / y
Print q
End Sub
學生運行上述程序,分析程序的漏洞:當除數為0時,程序提示出錯,說明這樣的程序是不完善的。實際上,在除數不為零的情況下,學生才能計算它們的商,否則應提示“除數為零”。
用VB程序來描述如下:
If y <> 0 Then
q = x / y
Print q
Else
Print "除數為零"
End If
教師小結:根據條件判斷的結果,選擇執行不同語句的結構,稱為選擇結構。
設計意圖:教師從上一節課的順序結構程序引入,讓學生通過觀察、分析,發現其中的If語句結構起著引導程序走向的作用。這樣的設計使學生的學習不是被動接受,而是一個以已有知識經驗為基礎的主動建構過程。
2.模仿嘗試
活動1:模仿上例完善程序,嘗試解決下面兩個問題。
①輸入兩個數x和y,比較它們的大小,使x大于y。
Private Sub cmdxy_Click()
Dim x As Single,y As Single,t As Single
x = Val(InputBox("輸入x的值:"))
y = Val(InputBox("輸入y的值:"))
If _________ Then
t = x
x = y
y = t
End If
Print "x的值為:"; x
Print "y的值為:"; y
End Sub
②出租車計費程序,三公里以內(含)起步價9元,超出三公里的部分每公里2.4元。
Private Sub cmdtaxi_Click()
Dim s As Single,y As Single
s = Val(InputBox("輸入里程數:"))
If s <= 3 Then
y = 9
Else
___________
End If
Print y
End Sub
設計意圖:學生通過模仿完善兩個半成品程序,進一步深化對選擇結構的認識。教師有目的地將部分核心代碼留空,讓學生將有限的注意力集中到核心問題的解決上,做到有的放矢;另外,關鍵代碼的填寫可以為學生理解程序提供支架,降低活動難度。
3.歸納提升
選擇結構根據條件判斷的結果控制程序的走向,不同的問題可能有不同的條件判斷,但If語句的基本格式是固定的。
單分支選擇結構(如圖1),代碼如下:
If 條件 Then
語句塊
End If
雙分支選擇結構(如圖2),代碼如下:
If 條件 Then
語句塊1
Else
語句塊2
End If
教師小結:單分支的選擇結構,當條件為真時才執行指定語句,否則跳過;雙分支的選擇結構根據條件是否成立,程序選擇執行相對應的語句,然后執行End If后面的語句。
設計意圖:教師通過適時地歸納總結,讓學生在對選擇結構有了感性認識的基礎上,系統地認識單分支和雙分支選擇結構的一般格式,并借助流程圖分析選擇結構的執行過程,幫助學生建構清晰而完整的知識框架,這將為他們后面的學習打下扎實的基礎。
4.問題解決
活動2:利用單分支和雙分支選擇結構,完善程序,解決問題。
①中秋節前夕,商店月餅促銷,購滿3盒(含)即可享受八折優惠。請根據輸入的購買盒數,計算出應付金額。
Private Sub cmdmk_Click()
Dim qty As Integer ' 購買 盒數
Dim price As Single ' 應付 金額
Dim sum As Single
price = 80
qty = Val(InputBox("購買盒數:"))
' 如果購買盒數低于3盒,不打折
' 購滿3盒(含)享受八折優惠
_______________
Print "應付金額:"; sum; "元"
End Sub
②已知三角形的三條邊a、b、c,求三角形的面積(判斷三條邊是否構成三角形的條件為:任意兩邊之和大于第三條邊)。
Private Sub cmdsquare_Click()
Dim a As Single,b As Single,c As Single
Dim p As Single,s As Single
a = Val(InputBox("input a:"))
b = Val(InputBox("input b:"))
c = Val(InputBox("input c:"))
p = (a + b + c) / 2
' 如果輸入的三邊值(a,b,c)能夠構成三角形則計算其面積
' 否則提示用戶"不能構成三角形"
_______________
End Sub
教師小結:條件一般為關系表達式,如活動1中的兩個程序,以及活動2中的程序①;也可為邏輯表達式,如活動2中的程序②。
設計意圖:活動2能使學生對雙分支If語句有了較為清晰的理解之后實現完整的應用,學生要考慮的不再只是選擇結構中各個分支的內容,而是站在一個更高的層面考慮整個選擇結構的設計,在思維深度上與前面的活動呈遞進關系。同時,此活動的兩個問題分別通過關系表達式和邏輯表達式實現條件判斷,幫助學生進一步拓展對條件表達式的認知。
5.拓展應用
活動3:身體質量指數(BMI)是目前國際上常用的衡量人體胖瘦程度的標準,WHO組織設定中國人的參考標準為:BMI<18.5表示偏瘦;BMI介于18.5~23.9表示正常;BMI>=23.9表示偏重。學生借助數軸(如圖3)分析問題,形成算法:①先判斷x<18.5是否成立,成立則輸出“偏瘦”;②否則判斷x<23.9是否成立,成立則輸出“正?!保駝t輸出“偏重”。
Private Sub cmdbmi_Click()
Dim w As Single,h As Single,bmi As Single
w = Val(InputBox("輸入體重(公斤):"))
h = Val(InputBox("輸入身高(米):"))
bmi = w / h / h
If bmi < 18.5 Then
Print "偏瘦"
Else
_______________
End If
End Sub
教師小結:在第一次判斷的基礎上,進行再次判斷。這種在一個If語句的內部又出現了另一個If語句,稱為If語句的嵌套。實際上,VB對程序有多個分支的問題,有一種專門的If語句形式簡化嵌套的問題。
多分支選擇結構:
If 條件1 then
語句塊1
ElseIf 條件2 then
語句塊2
Else
語句塊3
End If
多分支的If語句實現BMI值判斷,代碼如下:
Private Sub cmdbmi_Click()
Dim w As Single,h As Single,bmi As Single
w = Val(InputBox("輸入體重(公斤)"))
h = Val(InputBox("輸入身高(米)"))
bmi = w / h / h
If bmi < 18.5 Then
Print "偏瘦"
ElseIf bmi < 23.9 Then
Print "正常"
Else
Print "偏重"
End If
End Sub
教師小結:多分支選擇結構首先測試條件1,如果它為假,就測試條件2,依此類推,直到找到一個為真的條件,并執行相應的語句塊;如果條件都不為真,執行Else后的語句,然后再執行End If后面的代碼。
設計意圖:學生通過“數軸分析法”分析出第二次判斷“BMI<23.9”是以第一次判斷“BMI<18.5”為前提,是在第一次條件判斷為“假”的基礎上再次進行判斷。教師在完善程序的過程中,幫助學生理解嵌套的緣由,理清嵌套的脈絡,并在此基礎上提出多分支If語句,分析其執行過程。這樣的設計既重過程又重結論,讓學生在問題解決的過程中,輕松愉快地完成知識的建構。
6.思維導圖,復習鞏固
筆者用思維導圖對知識點進行鞏固(如圖4)。
點 評
傳統的編程學習總是與編寫代碼、設計算法和生成可運行的程序緊密聯系在一起,教師常會選擇一些“經典”的數學題作為例題,如雞兔同籠、百錢百雞、找素數、求水仙花數等,內容缺少趣味性和綜合性。本節課設計的例題和練習與學生的學習和生活息息相關,把解決“真實”問題作為編程學習的首要任務,這樣既能使學生有一個愉快的學習過程,又能激發他們加倍投入到編程學習中。
程序設計的學習主要圍繞環境、語言和應用三個方面的知識和內容展開,語言視圖學習的核心主要是語言規則本身。從教學方式來看,以往的程序設計語言規則的學習常采用三步走的形式,即提出問題,給出解答,再加點解釋。特別是“解釋”,往往過多地糾纏于程序設計語言的語法知識的細枝末節之中,學生很少能體驗到成功解決問題的喜悅。本節課姚老師運用了案例教學法,先為學生提供了一個需要解決的生活中的具體任務——計算兩個數的商,讓學生在分析解決這個問題的程序、嘗試補充程序模板中關鍵代碼的過程中,逐步認識If選擇結構,并引導他們提取出If語句的基本格式,再應用到類似問題的解決中,最終得到功能強大的If語句指令集。
同時,程序設計是一種高強度的腦力勞動,學生不是聽會的,也不是看會的,而是自己練會的。在這節課中,學生通過模仿嘗試、獨立解決等方式,完成了6個以上的程序,在有限的課堂教學時間內,較好地達到了“量”的要求。
(點評人:江蘇省鹽城市教育科學研究院 曹恒來)