羊巍 孫新杰 六盤水師范學(xué)院
通常在選擇法排序(以下簡稱排序)的教學(xué)中,教師可能會先演示排序算法的排序過程,講解什么是排序,然后展示程序,并對程序中的代碼進行講解,可能還要對程序中的關(guān)鍵代碼反復(fù)強調(diào)等等。其實對于一年級的程序新手而言,選擇法排序算是一個比較難的復(fù)雜問題,他們常常是懂了選擇法排序的算法原理,寫不出程序,看了教師程序,關(guān)鍵代碼搞不懂,課后還要花大量的時間反復(fù)琢磨才能搞懂。這樣的教與學(xué)往往枯燥而又事倍功半,學(xué)生可能會失去學(xué)習(xí)興趣,教師的教學(xué)目標也往往難以達成。
教學(xué)設(shè)計是根據(jù)課程標準的要求和教學(xué)對象的特點,將教學(xué)諸要素有序安排,確定合適的教學(xué)方案的設(shè)想和計劃。一般包括教學(xué)目標、教學(xué)重難點、教學(xué)方法、教學(xué)步驟與時間分配等環(huán)節(jié)。我校為地方二本學(xué)校,學(xué)生大都來自山區(qū),多數(shù)學(xué)生沒有計算機基礎(chǔ)知識,經(jīng)過一段時間的學(xué)習(xí),分析問題并將其用程序?qū)崿F(xiàn)的能力往往還是比較薄弱,鑒于此,進行排序教學(xué)設(shè)計時,根據(jù)實際情況,把排序算法分解成為幾個子問題,分而治之,最后又進行合成,讓學(xué)生從整體與細節(jié)上,比較好的掌握排序算法。
排序算法教學(xué)目標為:掌握排序算法(以排成一個非遞減序列為例)的原理并能用C代碼實現(xiàn)。
排序算法教學(xué)重難點為:排序算法的原理,排序過程與程序中關(guān)鍵代碼的對應(yīng)關(guān)系。
結(jié)合多媒體手段講解排序算法原理,學(xué)生可以理解算法原理,從教學(xué)的角度從發(fā),分析一下排序算法源程代碼結(jié)構(gòu),會發(fā)現(xiàn)其中有如下的難點:
(1)整個代碼為一個雙重循環(huán),而且,內(nèi)層循環(huán)次數(shù)執(zhí)行受外層循環(huán)的控制。
(2)內(nèi)層循環(huán)做兩件事,一是掃描出指定范圍內(nèi),序列中最大值的元素所對應(yīng)的位置,而掃描的終點位置是遞減的;二是元素對換,將上一步中得到最大值元素與掃描終點元素作對換,而對換中的三步操作雖然不一唯,但第一步操作確定后,后兩步操作的順序是唯一的。
針對上述分析,筆者認為,學(xué)生從理解排序算法原理,要一下實現(xiàn)排序算法,有比較大的難度。排序算法可以分解為二個子問題,一是掃描,二是對換,可以以函數(shù)的形式獨立實現(xiàn),作為課堂任務(wù),引導(dǎo)學(xué)生完成,這樣做有兩個好處:一是讓學(xué)生掌握掃描與對換的實現(xiàn),二是作為知識銜接,進一步訓(xùn)練數(shù)組作為函數(shù)參數(shù)的函數(shù)這一知識點。在這個基礎(chǔ)上,可以引導(dǎo)學(xué)生,以單循環(huán)的形式實現(xiàn)排序算法,即在循環(huán)中反復(fù)調(diào)用掃描與對換函數(shù),這樣做,可以避開雙重循環(huán)。完成了這個課堂任務(wù),學(xué)生可以理解,排序過程,就是反復(fù)的掃描與對換的過程,這就是分解問題的典型求解方法。行至于此,教師可以引導(dǎo)學(xué)生,完成最終形式的非函數(shù)調(diào)用的排序算法,在單循環(huán)中用非函數(shù)調(diào)用替換函數(shù)調(diào)用(子問題的合成),在這個過程,學(xué)生在函數(shù)調(diào)用的參數(shù)傳遞與多重循環(huán)兩個知識點在能得到強化。
基于上述分析,筆者認為,排序算法的教學(xué)過程可以這樣設(shè)計:教學(xué)方法采用以課堂任務(wù)驅(qū)動與引導(dǎo)探究為主的方法,通過幾個課堂任務(wù)為驅(qū)動,1個算法原理展示為引導(dǎo)環(huán)節(jié),逐步引導(dǎo)學(xué)生掌握排序的算法原理,引導(dǎo)學(xué)生逐步實現(xiàn)該算法,并深刻理解程序中的關(guān)鍵代碼,同時,作為拓展,進一步引導(dǎo)學(xué)生用同樣的分解方法實現(xiàn)冒泡排序算法。
開始講授時,不直接講授排序,僅僅使用課堂任務(wù)驅(qū)動與教師演示進行探索引導(dǎo)。
課堂任務(wù)一:實現(xiàn)一個函數(shù),其功能為:給定一個整數(shù)數(shù)組,找出從頭至給定位置間,值最大的元素所在的數(shù)組下標。參考實現(xiàn)如下:
教學(xué)環(huán)節(jié)一:引導(dǎo)
教師引導(dǎo)學(xué)生觀察排序算法圖示,通過教師的引導(dǎo),使學(xué)生理解并掌握算法的原理。引導(dǎo)學(xué)生總結(jié):教師把排序問題分解為兩個子問題:
(1)從序列的開始到指定位置,掃描序列,找出最大值元素所在的位置;
(2)將上一步中得到的位置上的元素,與序列中指定位置的元素進行對換。對于一個問題的規(guī)模為len的序列,反復(fù)做len-1次掃描與對換,可完成排序。至此,教師引導(dǎo)學(xué)生,利用已經(jīng)實現(xiàn)的掃描與交換兩個函數(shù),可以完成課堂任務(wù)三。
課堂任務(wù)三:利用任務(wù)一和任務(wù)二find_max與swap兩個函數(shù),實現(xiàn)排序算法,功能為:給定一個長度為len整數(shù)序列,利用排序?qū)υ撔蛄羞M行排序,使得該序列成為一個非遞減的有序序列。參考實現(xiàn)如下:
課堂任務(wù)四:不調(diào)用find_max和swap函數(shù),改寫任務(wù)三的selection_sort函數(shù),實現(xiàn)排序算法。該任務(wù)是將排序問題的子任務(wù)(掃描與對換)進行合成,形成最終的排序算法。參考實現(xiàn)如下:
教學(xué)環(huán)節(jié)二:小結(jié)
(1)排序問題被分解為幾個子問題?
(2)每個子問題如何解決(教師強調(diào)關(guān)鍵代碼)。
教學(xué)環(huán)節(jié)三:拓展:
(1)如果在每一趟排序中,要求掃描的終止位置不變,而起始位置可變,又怎么實現(xiàn)排序?
(2)要求學(xué)生研究冒泡排序,分解該問題,進而自行實現(xiàn)該算法。
至此,筆者通過四個課堂任務(wù),一個引導(dǎo)環(huán)節(jié)及一個小結(jié),完整清晰、循序漸進、由淺入深的完成了教學(xué)任務(wù)。其中課堂任務(wù)一和課堂任務(wù)二將排序問題中掃描與交換分開實現(xiàn),這種分解使得問題被簡化,同時,在講解排序問題前實現(xiàn)掃描與交換,降低了學(xué)生實現(xiàn)完整程序的難度。通過引導(dǎo)環(huán)節(jié),使學(xué)生通過圖示,清晰明了的理解排序算法的原理。通過課堂任務(wù)三,利用函數(shù)調(diào)用的方式實現(xiàn)算法,避免學(xué)生陷入掃描與交換的代碼細節(jié),使得算法實現(xiàn)簡單清晰,同時,在技術(shù)細節(jié)上,強調(diào)每一趟掃描的終止位置如何控制,掃描完成后,如何指定元素交換的位置。通上述教學(xué)環(huán)節(jié),學(xué)生可以平滑的進行到課堂任務(wù)四,實現(xiàn)一個最終的排序算法。最后利用教學(xué)環(huán)節(jié)六用為拓展,強化本堂課的教學(xué)內(nèi)容。