張樂,楊立
(山西運城學院數(shù)學與信息技術學院,運城044000)
C語言中提供了解決批量數(shù)據(jù)相同操作問題的方法—數(shù)組。數(shù)組是一種構造的數(shù)據(jù)類型,是相同類型數(shù)據(jù)的集合[1]。數(shù)組是C語言程序設計教學中一個重要內容,C語言中按確定數(shù)組元素下標的個數(shù)可以分為一維數(shù)組、二維數(shù)組和多維數(shù)組[1]。使用一維數(shù)組可以解決實際應用中的很多問題,如一維數(shù)組元素輸入輸出、查找最大最小值、數(shù)組元素排序、在原數(shù)組中插入、刪除、查找元素等。其中在一維數(shù)組中插入元素是C語言程序設計教學中的重難點,而傳統(tǒng)教學中教師為主體灌輸式的教學方式比較枯燥無法調動學生學習的積極性和主動性,對數(shù)據(jù)插入算法的理解達不到教學目標,無法熟練使用插入算法解決實際問題。因此,采用問題引導式教學方法對插入算法過程進行具體分析,以學生為主體教師為主導模式引導學生分析問題總結問題,幫助學生更好理解算法思想及過程,從而提高學生解決實際問題的能力。
問題引導法是以問題為中心,以學生為主體的一種教學方法,將教學目標或教學內容以問題的形式呈現(xiàn)出來[2],通過提出問題-分析問題—解決問題-總結歸納-拓展應用的方式,在教學過程中通過問題引導學生主動發(fā)現(xiàn)問題、分析問題,在教師的指導下尋找解決問題的方法總結歸納,從而解決實際問題。問題引導法能夠激發(fā)學生的求知欲,引導學生主動學習,從而提升學生自主學習的能力和解決實際問題的能力。采用問題引導法常常能取得良好的教學效果。
在教學過程中使用問題引導法能夠激發(fā)學生的學習興趣,使得學生對插入算法思想和過程有整體、全面、記憶深刻的理解,并能將插入算法過程步驟分解,根據(jù)步驟順利編寫算法代碼,更好地理解掌握插入算法。
程序設計中,為了方便處理,把具有相同類型的若干變量按有序的形式組織起來,形成數(shù)組(Array)[3]。按數(shù)組元素下標的個數(shù),數(shù)組可分為一維數(shù)組、二維數(shù)組和多維數(shù)組。由一個下標標識數(shù)組元素的數(shù)組稱為一維數(shù)組,一維數(shù)組可以直觀地被認為是排列成一行或一列的數(shù)據(jù)。數(shù)組有以下兩個特點:
數(shù)組元素是同質的,同一個數(shù)組中的元素必須是同類型數(shù)據(jù)。
數(shù)組元素是有序的,數(shù)組元素之間按順序排列,從而確定它們之間的相對位置。
在一組數(shù)據(jù)中插入一給定的數(shù)據(jù),有兩種方式:在有序列表中插入和指定位置插入。
在有序列表中插入數(shù)據(jù),要保證插入數(shù)據(jù)前后都是有序的。首先在有序列表中查找插入的位置,再把從最后一個數(shù)據(jù)到插入位置的所有數(shù)據(jù)依次按順序后移,然后再把指定的數(shù)據(jù)復制到插入位置。
傳統(tǒng)的教學過程中,以教師為主體填鴨式教學,將算法思想和程序代碼灌輸給學生,在沒有理解思想的基礎上編寫代碼十分困難,無法調動學生的積極性,也無法真正理解數(shù)據(jù)插入算法的意義并將其應用到實際問題中。因此,采用問題引導的方法,以學生為主體教師輔助教學,通過提出問題-引導學生分析問題并總結歸納數(shù)據(jù)插入算法基本過程,從而順利編寫算法代碼,能夠充分調動學生學習興趣,拓展自主思維能力,熟練掌握數(shù)據(jù)插入算法思想及編程方法并靈活運用從而解決實際問題。
教師通過多媒體課件播放一組學生成績數(shù)據(jù),引導學生觀察數(shù)據(jù)特點:有序(升序)列表,并提出問題:班級里新來一名轉班的學生,需要將轉班學生的成績排列到當前班級成績列表中,如何實現(xiàn)?引入新知識點:在有序列表中插入數(shù)據(jù)。
【提問】如何在升序列表中插入一個數(shù)據(jù)并保持其繼續(xù)有序。
教師播放提前制作好的PPT課件,通過有趣生動的動畫直觀演繹數(shù)據(jù)插入過程,吸引了學生注意力。在動畫播放結束之后,結合課件教師引導學生觀察數(shù)據(jù)插入算法的過程:查找、后移、復制,即查找位置,將最后一個元素到插入位置的元素依次后移,復制數(shù)據(jù)到插入位置。
【提問】具體如何查找、移動、復制?
通過提問,引入數(shù)據(jù)插入算法思想,并通過重新播放PPT課件動態(tài)分析數(shù)據(jù)插入過程。
假設班級有7個學生的成績存儲在數(shù)組sc[7]中,按升序排序后為:50、65、72、80、87、90、98,對應的下標分別是 0、1、2、3、4、5、6,現(xiàn)要求將轉班生成績 82(用變量k表示)插入到當前班級成績表中。
(1)分解數(shù)據(jù)插入過程
①查找位置
在播放PPT過程中,教師引導學生并提出問題:在升序的序列中查找第一個最大的值還是最小的值才能確定位置?
表1
教師引導分析:數(shù)組中下標0-6的元素分別跟k比較比較的結果有兩種可能性:sc[0]-sc[3]元素比k小,說明k應該插入在該數(shù)據(jù)之后,繼續(xù)和之后的數(shù)據(jù)比較;sc[4]元素比k大,當找到第一個比k的元素值,說明k插入在此位置,位置確定,即sc[4]就是插入的位置,比較結束。
②數(shù)據(jù)移動
【提問】當找到第一個比k大的數(shù)組元素后,位置確定,可以直接插入數(shù)據(jù)嗎?
教師引導分析:插入數(shù)據(jù)的過程就是數(shù)據(jù)賦值替換的過程,如果直接插入數(shù)據(jù),會導致原列表中sc[4]元素被替換,因此必須把sc[4]元素的位置空出來,即將sc[4]-sc[6]的元素后移一位。
【提問】將sc[4]到sc[6]元素后移,應該從sc[4]開始移動還是從sc[6]開始移動?
教師引導:移動數(shù)據(jù),即前者賦值給后者,如果從sc[4]開始依次后移,sc[5]-sc[6]的數(shù)據(jù)都將會被前者取代,因此應該從sc[6]-sc[4]逆向往后移動。移動過程如圖1所示。
圖1 數(shù)據(jù)后移的過程
【提問】移動過程中,sc[6]往后移動一位,而之前定義數(shù)組長度為7,最大下標為6,移動后最大下標為7,因此,定義數(shù)組長度至少為8,即float sc[8]數(shù)據(jù)后移后如圖2所示。
圖2 移動后的數(shù)據(jù)
③復制數(shù)據(jù)
教師引導:sc[4]-sc[6]的數(shù)據(jù)移動到sc[5]-sc[7]之后,sc[4]原來的數(shù)據(jù)87可被替代。將現(xiàn)有數(shù)據(jù)82賦值給sc[4]即可。如圖3所示。
圖3
(2)總結歸納數(shù)據(jù)插入過程
【提問】根據(jù)分析過程,總結數(shù)據(jù)插入一共幾個過程?有什么特點?
教師引導:查找位置、數(shù)據(jù)移動、復制數(shù)據(jù)三個過程。
①查找位置:將要插入的數(shù)據(jù)k=82依次與數(shù)組中的元素進行比較,每次比較若比k小則繼續(xù)比較;若比k大則停止比較。
教師引導:比較的過程可用循環(huán)for語句實現(xiàn)。
②數(shù)據(jù)移動:若找到比k大的第一個值則break跳出循環(huán),i便是查找到要插入數(shù)據(jù)的位置。將sc[i]到sc[6]所有元素逆序后移。
教師引導:移動的過程即將前一個元素賦值給后一個元素的過程,賦值多次用for語句實現(xiàn)。
③復制數(shù)據(jù):移動結束后,查找到的位置i中數(shù)據(jù)
通過定義-賦值-排序-輸出四個階段,我們可以將完整的過程代碼補充如下:
教師引導注意事項:定義數(shù)組長度要比原數(shù)組長度至少大1,float sc[8];輸出7個數(shù)據(jù),輸出8個數(shù)據(jù)。
【拓展問題】若要在降序數(shù)據(jù)列表中插入一個數(shù)據(jù),如何實現(xiàn)?
教師引導:查找位置(比較查找第一個比k小的值確定位置)、數(shù)據(jù)逆序后移、復制數(shù)據(jù)。
移動和復制數(shù)據(jù)同升序過程。
【拓展問題】如果原數(shù)組中包含N個數(shù)據(jù)并為升序,如何插入數(shù)據(jù)并保持有序?
教師引導:原來數(shù)組中有N個數(shù)據(jù),插入一個數(shù)據(jù),因此定義數(shù)組時至少數(shù)組長度為N+1。
現(xiàn)代教育注重培養(yǎng)學生的自主學習能力和創(chuàng)造性思維,相對于知識點的講授,更重要的是讓學生掌握計算機思維方式,從而運用計算知識解決其他問題。為了鞏固知識點,教師可在課后布置小問題培養(yǎng)發(fā)散思維。
【課后問題】數(shù)據(jù)插入算法分為:在有序列表中插入數(shù)據(jù)和在指定位置插入數(shù)據(jù),根據(jù)有序列表中插入數(shù)據(jù)分析過程,自主編寫程序實現(xiàn)在指定位置插入數(shù)據(jù)。
教師提示:給定位置,無需查找。將指定位置之后的所有元素依次后移,并復制數(shù)據(jù)至指定位置。
本文以數(shù)據(jù)插入算法為例,利用PPT、視頻等多媒體手段教學,在教師的指導下通過問題引導方法(提出問題-分析問題-總結歸納-解決問題),形象生動具體分析了數(shù)據(jù)插入算法全過程,并引導學生自主總結要點從而編寫出相應代碼,并運用算法思想解決其他問題。一方面通過步驟的總結順利過渡到代碼的書寫,突破代碼書寫的難點。另一方面引導學生觀察算法的過程,通過提問的方式引導學生自己發(fā)現(xiàn)問題,并提出解決問題的辦法,進而培養(yǎng)學生的發(fā)散創(chuàng)新思維和自主學習的能力[4]。因此,在C語言程序教學中使用問題引導法可以提高學習熱情和學習效率,對于程序設計及相近學科具有一定的借鑒意義。