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