楊智明,夏春梅
(保山學院 大數據學院,云南保山 678000)
隨著云計算、人工智能技術的發展,高校培養人才面臨新的挑戰。2017年,《教育部高等教育司關于開展新工科研究與實踐的通知》提出,新工科研究和實踐圍繞工程教育改革的新理念、新結構、新模式、新質量、新體系開展。自此,新工科在全國各大高校引起廣泛討論與交流,高校在專業設置、課程改革、人才培養等方面進行了改革與探索。圍繞賦能教育的目標,賦予學生思維能力、利用專業知識解決實際問題的能力,以及責任擔當的能力[1]。筆者優化數據結構課程的教學設計,在教學內容上適當做“減法”,省略了一些純理論的推導和繁瑣的數學證明,增加了學生能力培養等方面的教學內容,把傳授知識與能力培養相結合,重視學生解決復雜工程問題的能力培養,收到了很好的效果。
數據結構是計算機專業的核心課程,也是考研的科目,學生特別重視這門課程的學習。針對數據結構課程的特點以及學生學習數據結構課程的認知規律,優化每一節課的教學設計,從而減少講解知識點的時間,重視學生能力素養的培養。比如在順序表中插入數據元素,學生不是把數據元素插錯位置,就是把原來的數據元素覆蓋掉,輸出不正確的結果,學生還找不到出錯原因,這是學生比較困惑的問題,因此,針對這個問題,進行了教學設計改進。
學生參加過軍訓,對軍訓隊伍中隊員的插入和刪除較為熟悉。教學中可以讓學生回想軍訓時的情景,有隊員要插入到隊伍中來,隊伍中的其他隊員如何移動。也可以到網絡上找這類插入操作的視頻或動畫,播放時讓學生仔細觀察,當有隊員插入隊伍時,其他隊員移動的情況。還可以把隊伍中的隊員想象成一組數據元素,據此制作一個動畫,讓學生仔細觀察數據元素插入過程的變化。
根據順序表有限序列的特性,順序表的中間不能有空的單元,因此,插入數據元素時,必須通過移動數據元素來實現。依據這個原則,事先設置以下幾個問題,讓學生帶著問題看插入動畫,并在教師的引導和提示下回答這些問題,把容易弄錯的關鍵點標注出來,再讓學生嘗試用計算機語言來描述。
第一個問題,為什么要移動數據元素。該問題考查學生理解順序表有限序列的特性[2]:如果數據元素不移開騰出位置,就把數據元素插入到這個位置上,原來在這個位置上的數據元素就會被覆蓋而丟失。而這就是有的學生會把數據元素弄丟的原因。第二個問題,數據元素向什么方向移動,如何表達。學生往往知道數據元素從前向后移動,但是不知道用C 語言如何表達出來,這就需要提示學生,把前面單元上的數據元素賦值到后面單元上,這時學生就能理解數據元素移動的含義,就會用L.elem[j+1]= L.elem[j]語句來表示。第三個問題,從哪個元素開始移動。數據元素只有從最后一個開始移動,前面單元上的數據元素移到后面單元上,才不至于覆蓋原來的數據元素,因此開始移動的數據元素初值為j=L.length-1,也就是將順序表L 中的第L.length-1 個至第i 個數據元素依次后移一個位置,把第i-1 單元空出來,將要插入的新元素e 插入到第i-1 位置上。第四個問題,數據元素移動到哪個元素停止。這個問題是讓學生理解第i 個數據元素和第i 個位置之間的差別,第i 個數據元素存儲在第i-1 位置上,數據元素移動到第i 個數據元素就停止了,也就是到i-1 位置停止,寫代碼時注意減1,避免把插入位置弄錯。第五個問題,什么時候不能插入。該問題主要考查學生查找邊界問題的能力。如果不設置這個問題,學生在寫代碼的時候容易忽略邊界,運行程序會出現錯誤數據,學生卻很難發現出錯的原因,因此,授課教師一定要進行指導和提示。有兩種情況數據元素不能插入,一是插入位置不合法,i 的合法范圍是在1 ≤i ≤L.Length+1 上,不在此范圍內就做出錯處理;另一種情況是順序表表滿,不能進行插入操作,可做異常處理,也可以動態增加順序表的存儲空間。第六個問題,插入后的順序表長度如何變化。插入后的順序表增加了一個數據元素,順序表長度要加1,學生經常忘記這步操作,輸出的數據元素就會因少一個而出錯。
根據這些回答的問題,按處理問題的先后次序,就可以歸納出順序表插入操作的算法思想,然后按照這個操作步驟,就能寫出對應的插入操作的算法函數ListInsert_Sq[2]。第一步,判斷插入位置i 是否合法,i 的合法范圍是在1 ≤i ≤L.Length+1,如果i 不在此范圍,只要否定這個條件即可,語句為if (i<1||i>L.length+1) return ERROR。第二步,判斷順序表是否為滿,即if(L.length>=L.listsize)條件滿足,說明順序表已滿,不能進行插入操作,需要用realloc 函數重新申請(L.listsize+LISTINCREMENT)倍的連續存儲空間,并把其存儲空間的起始地址進行強制性轉換后賦給新的指針變量newbase,需要注意這個地方的強制性轉換的地址類型ElemType 一定要與sizeof 后面的ElemType類型一致。另外,為了知道能否申請到存儲空間,要加一個溢出標識OVERFLOW 說明,即使沒有申請到存儲空間,也需要返回一個溢出標識說明,即if(!newbase)return (OVERFLOW),把剛申請到的新基址newbase 賦給L.elem,雖然順序表的存儲空間增大了,但是仍保證順序表的起始地址是L.elem,便于后續操作。最后,再把L.listsize 和增量LISTINCREMENT 相加后賦值給L.listsize,說明增加了順序表的存儲容量。第三步,將順序表L 中的最后一個數據元素至第i 個數據元素依次后移一個位置。因為第i 個元素和第i 個位置相差1,所以最后一個數據元素就是L.length-1 位置,第i 個數據元素就是i-1 位置,for 循環語句j 的初值為L.length-1;移動到第i-1 位置停止,因此,j 的判斷條件是j>=i-1,注意等號一定不能漏掉,否則數據就少移動一個位置而出錯;j 的值從大變小,因此,j--;數據元素移動的方向是從前往后,語句是L.elem[j+1]=L.elem[j],注意一定是j 位置中的數據移到j+1,千萬不能弄反順序。第四步,將要插入的新元素e 插入到i-1位置,其實就是賦值操作。第五步,順序表長度加1。
通過這樣的教學設計和實踐教學,學生根據解決問題的思路,很容易就能寫出對應的代碼。
優化教學設計后,減少了知識傳授的時間,增加了培養學生能力的時間,為學生的賦能教育提供了改革的空間。
選取合適的教學案例,培養學生用新的思維方法去觀察和理解問題。比如,讓學生帶著問題觀看插入操作的動畫,學生就容易理解內容的難點,并會在潛意識中使用計算機處理問題的方式來分析,從而降低了寫代碼的難度。比如,學生一旦理解了移動數據元素必須從最后一個開始,重復移動數據元素的for 循環語句,j 的初值很自然就會寫成j=L.length-1,或者j=n-1,就不會出現不知道初值究竟是賦什么數據才合適的問題。根據動畫回答問題,再對應答案寫出相應的代碼,就能達到聽得懂、寫得出、耗時少、出錯低的目標。對擴展的內容,比如,“寫出在順序有序表中插入新元素e 后仍然有序的算法”,只要提醒學生在插入算法的基礎上增加查找插入位置這一步,多數學生能很快找到解題的突破口。另外,提醒學生查找e 元素時,找到e的插入位置在i+1 上,插入語句寫成L.elem[i+1]=e,其他代碼與插入算法相同,學生就能把這個算法完整地寫出來,這樣,學生的思維能力得到鍛煉,教學內容也得到擴展。
另外,學生回答完問題后,還要讓學生分組分別討論:(1)歸納插入操作的算法思想;(2)分析數據元素從后往前移動的情況;(3)分析前移和后移的異同點,每組由一個代表分享討論成果。這樣,既鍛煉了學生的表達和溝通能力,又提高了學生的思考和辨析能力。
數據結構課程的重要性在于能用計算機解決實際問題,利用數據結構課程中的知識編寫程序解決生活中的實踐問題。從生活中發現的問題入手,采用學用結合的方法,按分析問題→建立模型→框架設計→編碼實現→項目測試完成等過程進行教學設計[3],并通過這門課程的教學和相應的訓練,使學生養成解決問題的思維能力[1]。
學習數據結構構圖知識后,有學生開發完成一個校園導航系統,解決了新生初入校園迷路的情況。也有學生通過編程設計幫助外賣小哥解決了最短路線配送選擇和縮短外賣配送時間等問題。
學習模糊算法后,有學生設計和開發一個在線考試和主觀題評閱系統,有效降低了相鄰學生考試作弊的可能性,還解決了教師出卷和閱卷工作量大的問題。
這種學用結合的學習過程,既是學生探索知識和鍛煉技能的過程,也是進行復雜程序設計訓練的過程,既培養了學生解決復雜工程問題的能力[4-5],又提升了學生的專業能力和競爭力。
在教學中適當引入前沿技術運用的原理,比如,共享單車的掃碼騎乘、機器人護理、紅外熱成像人體測溫篩查預警系統等的原理,可讓學生了解“物聯網獲取數據,云計算承載數據,大數據技術對數據進行挖掘和分析,把數據變成信息,人工智能對數據進行學習和理解,把數據變成知識和智慧”[6]這一過程,這樣既可激發學生的學習興趣,又能增強他們對新技術的敏感度。
根據每次課的教學內容,用1~2min 時間給學生講一個小故事,使學生樹立正確的人生觀和價值觀。
講隊列內容時,教授學生做人做事要懂規矩、守秩序的道理。
講單鏈表的插入操作時,鼓勵學生要積極上進并持之以恒。
講樹型結構時,講解家譜文化,鼓勵學生學習并傳承中華優秀傳統文化[7],讓學生學會感恩和團隊合作。
這樣,通過每節課的知識傳授,既把社會主義核心價值觀穿插在教學中,也把心態課、平衡課和協作課融入知識講授中,使學生知敬畏、守底線、懂感恩。
本課程改革突破了傳統教育的思維定式,通過改進教學設計和實踐教學,學生的思維能力、分析解決問題的能力均有所提高,教學效果有效性得到提升,取得了良好的人才培養效果。