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