【摘 要】在高中“算法與程序設計”模塊教學中,算法的設計以及運用程序設計解決問題的方法與思路,與學生原有的知識結構和解題經驗有較大差異,使得學生的學習存在較大困難。教師應從生活實例出發(fā),激發(fā)學生的學習興趣;降低編程起點,提高學生的學習信心;引導學生通過程序閱讀,學習他人編程經驗;強化算法的分析與設計,培養(yǎng)學生分析問題與解決問題的能力。
【關鍵詞】算法與程序設計;教學探析
【中圖分類號】G40-057 【文獻標識碼】A
【論文編號】1671-7384(2013)11-0050-03
“算法與程序設計”是普通高中信息技術課程中難度較大的一個選修模塊。照本宣科的講授只能使學生死記硬背程序,這種缺乏理解的學習導致了學生進一步學習的困難,更談不上對所學知識的靈活運用。因此,如何改變學生的思維方式、如何組織教學以使學生真正理解算法并學會運用程序設計解決實際問題,值得我們探索和研究。
從生活實例出發(fā),激發(fā)學生的學習興趣
從教育心理學的角度來說,興趣是一個人傾向于認識、研究并獲得某種知識的心理特征,是可以推動人們求知的一種內在力量。學生對某一學科有興趣,就會專心致志地鉆研它,從而提高學習效果。以下案例正是從學生興趣出發(fā),激發(fā)了學生參與的熱情。
案例1:遙控機器人
圖1 遙控機器人
窗體上是一張機器人圖片以及“向上”、“向下”、“向左”、“向右”四個按鈕。怎樣讓機器人聽從我們的指令動起來呢?以向上為例,我們看到機器人圖片的Top屬性是1000,在“向上”按鈕的單擊事件中,可以寫這樣一句代碼:Picrobot.Top = 900。運行程序,單擊“向上”按鈕,機器人聽從指令向上挪了一部分。再按一次,機器人怎么沒有反應?怎樣修改程序才能讓機器人根據指令不斷地向上移動呢?學生思考,得出程序代碼:Picrobot.Top = Picrobot.Top-50。
對于機器人,學生都有種神秘感,往往覺得不可思議,但是又想探索。在教師的引導下,學生的本能興趣轉化為內在學習動力,在實現對機器人控制的過程中,加深了對控件、賦值語句和變量概念的理解。
降低編程起點,提高學生的學習信心
沒有人在學習程序設計的初始階段就能成為編程高手。然而在程序設計教學中,教師常常一開始就要求學生編寫完整的程序。導致很多學生無從下手,學習的自信心受到了嚴重打擊。因此,我們應降低編程起點,將學生引入門。一方面,在問題的選擇上,盡可能使用學生能夠通過已有知識和經驗分析出解決方法的問題;另一方面,可以采用案例教學法,從模仿典型程序開始,在代碼模板上補充關鍵代碼后即可調試運行,從而體驗成功的喜悅,增強學生學習的信心。下面就是一個使用案例教學法的例子。
案例2:循環(huán)結構 [1]
針對s=1+2+3+……+100問題,引導學生觀察累加求和的過程:s=s+數字。引出如果用變量i表示數字,整個計算過程是在重復執(zhí)行若干個同樣的操作:s=s+i。如何讓計算機自動重復上述過程呢?教師呈現用循環(huán)語句解決問題的程序,接著讓學生模仿累加程序,完善計算s=100+101+……+200、s=1+++……+、s=12+22+32+……+102、p=1*2*3*……*9四個式子程序空白處的代碼。4個任務的難度依次遞增,第1題要求分析出循環(huán)的初值、終值;第2和第3題要求分析出循環(huán)體;第4題要求同時分析出循環(huán)的初值、終值和循環(huán)體。學生完成后,教師展示學生程序,引導學生歸納總結出For循環(huán)結構的一般格式。然后提出“計算s=10+20+30+……+100”的任務,讓學生在一般格式的指導下,獨立編寫程序解決問題。
牛頓說過:我之所以能取得現在的成就,是因為我站在巨人的肩膀上。在案例教學法中,案例和代碼模板就是“巨人的肩膀”,學生通過補充程序模板中的關鍵代碼,逐步認識For循環(huán)結構,并在多個“個”的嘗試中,找出隱藏在“個”背后的規(guī)律性內容,歸納出For循環(huán)結構的一般格式,進而在一般格式的指導下編寫程序,解決重復執(zhí)行“類”問題。在此過程中,學生的編程思維和分析能力獲得了快速的提高,提高了學習程序設計的信心。
通過程序閱讀,學習他人編程經驗
學習程序設計,一個重要而有效的方法就是閱讀。閱讀書中的例題、軟件開發(fā)環(huán)境中的范例、網絡中的開放源代碼以及自己編寫的程序??伺卦f過:通過閱讀他人的程序獲得技巧,是極其重要,但在許許多多的計算機課程中,這樣的訓練卻可悲地被忽視了,因此導致了計算機被極其糟糕地低效使用。通過閱讀大量的“示例”程序,可以加深對各種語句語法和語義的理解,從中發(fā)現、總結別人解決問題的方法,積累編程的經驗以及實現基本算法的代碼段。
怎樣閱讀程序呢?對于一篇文章,通常首先采用粗讀的方式進行整體認知,了解文章主要寫的是什么,留下總的印象;然后再進行精讀,深入到文章的局部,留心遣詞造句,賞析精彩語段,揣摩文章的謀篇布局。閱讀程序和閱讀文章有相通之處,對于一些較為復雜的程序,應該先進行整體分析,從整體上摸清程序的架構,再對各個部分的代碼逐一進行跟蹤閱讀。
1. 整體分析
這一階段,相當于文章的粗讀,需要從整體上把握程序的組成部分、各個部分的大意以及連接方式。
我們如何去了解一個語句塊的作用呢?主要有三種方法:一是依據經驗,也就是我們已經掌握的各種算法和語句的關鍵點來判別;二是看注釋,一個高品質的代碼都會有注釋,對我們理解語義有方向性的指導作用;三是靠猜測,我們根據過程名以及參數名,能對這個過程的作用略知一二。如果有必要,則可以到過程的定義中,找到某些具有特征的操作,以證實自己的猜測。[2]
任何一個復雜的程序都可以分解為三種基本結構:順序結構、選擇結構和循環(huán)結構。每種結構只有一個入口和一個出口,而各個結構之間的連接方式有兩種:積木式連接和嵌套式連接。積木式連接是一個結構的出口與另一個結構的入口連接;嵌套式連接是在一個結構的內部嵌套另一個結構。一般來說,我們應先分析出程序中積木式連接結構,再找出這些結構中的嵌套式連接結構。借助于流程圖、偽代碼等描述算法的工具,可以根據源程序畫出反映程序結構的流程圖,這對理清思路、分析程序結構有很大的幫助作用。[3]
下面我們先用整體分析法閱讀一段代碼:
案例3:
Private Sub cmdGcd_Click()
Dim a As Integer
Dim b As Integer
Dim r As Integer
a = Val(InputBox("輸入a"))
b = Val(InputBox("輸入b"))
Do While b <> 0
r = a Mod b
a = b
b = r
Loop
Print "最大公約數為:"; a
End Sub
從命令按鈕名和輸出提示信息可以知道,這是一個求兩個數的最大公約數的程序,程序結構如圖2所示。
1. 輸入a、b的值
2. 循環(huán)結構 計算b的值 當b=0,退出循環(huán)
3. 輸出結果a的值
圖2 輾轉相除法求最大公約數程序結構圖
2. 跟蹤閱讀
如果要詳細了解各個部分是如何運行的,就要對語句進行跟蹤閱讀,相當于文章的精讀。跟蹤閱讀就是用人腦模擬計算機的執(zhí)行過程。對于順序結構,閱讀不成問題。對于選擇結構,關鍵是要搞清條件和語句的關系,當有兩個選擇結構連接時,要分清楚是積木式連接還是嵌套式連接。對于循環(huán)結構,可以通過對循環(huán)體內的語句逐一跟蹤閱讀,分析循環(huán)結構的執(zhí)行過程。這時,可以借助于紙筆,用列表的方法將循環(huán)執(zhí)行過程中各變量的值一一記錄下來。[4]
在案例3中,當輸入48,28(即a=48,b=28)時,程序執(zhí)行的過程如下表所示:
輾轉相除法求最大公約數循環(huán)結構執(zhí)行過程表
程序閱讀的關鍵是代碼的積累。“讀書破萬卷,下筆如有神”,程序讀多了,自然容易借鑒別人的編程經驗和方法。
強化算法設計,培養(yǎng)學生解決問題的能力
程序設計的核心是算法,語言只是表達工具。用程序設計解決問題,關鍵是要找到解決問題的算法。只要算法正確,就可以用任何一種語言編寫程序。對于初學程序設計的學生來說,接觸的問題并不復雜,相應算法也較簡單。很多學生看到問題后,不進行細致的分析和設計,粗粗一想就開始動手,很簡單的問題往往寫出一大堆代碼,自己也說不清解決問題的方法和過程。
案例4:編寫程序,實現成績統(tǒng)計功能。通過InputBox函數輸入50個學生成績。當成績大于等于85時,為“優(yōu)秀”等級;成績大于等于60且小于85時,為“及格”等級;當成績小于60時,為“不及格”等級。要求統(tǒng)計優(yōu)秀人數、及格人數及不及格人數。
學生解決這個問題的過程,往往只是按照題目的表面意思進行處理,首先執(zhí)行一次循環(huán)輸入數據;然后掃描三次數組,分別統(tǒng)計優(yōu)秀、及格和不及格人數。
俗話說:磨刀不誤砍柴工。我們應該怎樣進行算法設計呢?在這個案例中,重復掃描使得程序效率不高。其實,最簡單的算法是只循環(huán)一次,輸入數據后立即使用多分支選擇結構對輸入的數據進行判斷,分別對優(yōu)秀、及格及不及格人數進行統(tǒng)計。算法分析前,學生為自己編寫的程序沾沾自喜,然而進行算法分析后,學生意識到自己程序的缺陷,較好地體驗了算法對提高程序效率的作用,理解和掌握了隱藏在問題背后的知識,提高了解決問題的能力。
綜上所述,算法與程序設計教學需要我們在教學實踐中不斷地總結經驗教訓,密切結合學生的自身情況,引導學生多閱讀、多思考、多實踐。讓學生在算法的指導下,在不斷完善和調試程序的過程中,潛移默化地掌握相關知識,養(yǎng)成縝密嚴謹的科學態(tài)度,進一步提高邏輯分析能力、發(fā)散思維能力以及發(fā)現并解決問題的能力。[5]
(作者單位:江蘇鹽城中學 江蘇鹽城市教育科學研究院)