程啟幫
高中信息技術(shù)“算法與程序設計”是鍛煉學生計算思維的重要課程,其中以“冒泡排序、選擇排序”為核心內(nèi)容的排序算法是該門課程的重難點,是信息技術(shù)高考必備內(nèi)容,也是學生最感到疑難的易丟分內(nèi)容。筆者在教學實踐中得出“舉一反三”的教學思想與訓練方法,現(xiàn)與大家分享。
例如,在教學“選擇排序”時,我們往往只介紹書本中提出的思路,其核心的程序結(jié)構(gòu)如下:
讓i從1到n-1循環(huán)(共n-1遍加工)
k=i(k用來保存第i位置上最終放置元素的下標)
讓j從i+1到n循環(huán)
如果d(k)>d(j),就把j的值保存到k中
循環(huán)尾
如果k≠i,那么
交換d(k)和d(i)的值
條件尾
循環(huán)尾
相應的程序代碼:
For i=1 To n-1
k=i
For j=i+1 To n
If d(k)>d(j) Then k=j
Next j
If k<>i Then
t=d(i):d(i)=d(k):d(k)=t
End If
Next i
上述代碼是教材中介紹的算法,思路清晰,經(jīng)過教學后,學生能夠理解。教學是否就到此結(jié)束呢?筆者是繼續(xù)拓展,引導學生不要局限于書本的思路,嘗試去改進算法,啟發(fā)學生“變量能否再少一點?目前代碼中有k、t兩個中間變量,可否嘗試減少一個?”筆者在教學中,發(fā)現(xiàn)課堂上有學生馬上想到了如下改進方法:
For i=1 To n-1
For j=i+1 To n
If d(i)>d(j) Then
t=d(i):d(i)=d(j):d(j)=t
End If
Next j
Next i
無獨有偶,竟然在2016年4月信息技術(shù)高考試題第11題中出現(xiàn)了類似題目,有如下程序段:
For i=1 To 2
For j=5 To i+1 Step -1
If a(j)>a(i) Then
t=a(j):a(j)=a(i):a(i)=t
End If
Next j
Next i
數(shù)組元數(shù)a(1) 到a(5)的值依次為“33,24,45,16,77”,經(jīng)過該程序段“加工”后,數(shù)組元數(shù)a(1) 到a(5)的值依次為
A.77,45,33,16,24 B.77,33,45,16,24
C.77,24,45,16,33 D.77,45,33,24,16
研究和編寫過“選擇排序的程序變式”的學生在考試中嘗到甜頭,能很快找到解題的關(guān)鍵點:若能判斷出此段代碼的核心算法是選擇排序,定能選出正確答案;但如果學生沒有接觸過這段代碼,考試中可能誤判成冒泡排序,故而失分。
在冒泡排序、選擇排序的算法教學中,我們不應局限于書本提出的一種思路,利用“一題多變”舉一反三思想,引導學生拓寬思維,對原有程序的改編,至少有以下幾種思路來訓練程序的變式:
總之,在高中算法課教學中,加強一題多變、一題多解等舉一反三的思維訓練,有利于發(fā)展學生的發(fā)散思維能力,以提高學生解題的靈活適應力。