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