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