鄭福妍 鄭寶民 張 寧
(黑河學(xué)院 a.計(jì)算機(jī)與信息工程學(xué)院;b.現(xiàn)代教育技術(shù)中心,黑龍江 黑河 164300)
“數(shù)據(jù)結(jié)構(gòu)”課程是計(jì)算機(jī)相關(guān)專業(yè)中具有較強(qiáng)理論性和操作性的一門專業(yè)基礎(chǔ)課,我國一些高校涉及編程課程的專業(yè)計(jì)劃中——如電子技術(shù)專業(yè),也增加了“數(shù)據(jù)結(jié)構(gòu)”課程,將其作為程序設(shè)計(jì)開發(fā)的入門課程。“數(shù)據(jù)結(jié)構(gòu)”課程知識點(diǎn)非常繁雜,主要研究的是將實(shí)際遇到的問題進(jìn)行分析,抽象為各種數(shù)據(jù)模型的過程,并根據(jù)實(shí)際操作的不同特點(diǎn)選擇相應(yīng)的存儲結(jié)構(gòu)進(jìn)行存儲,同一問題可以建立不同的抽象即邏輯結(jié)構(gòu),即使抽象類型相同,當(dāng)選擇不同的存儲結(jié)構(gòu)時(shí),在最終實(shí)現(xiàn)的程序思想方面也會有較大的不同,通過數(shù)據(jù)結(jié)構(gòu)課程的學(xué)習(xí),可以培養(yǎng)學(xué)生的發(fā)散思維能力、邏輯思維能力及編程能力,數(shù)據(jù)結(jié)構(gòu)課程可以讓人們在沒有編寫程序代碼之前,就知道該程序代碼的優(yōu)劣,可以對程序中存在的問題在時(shí)間和空間角度進(jìn)行分析及改進(jìn),設(shè)計(jì)出效率最優(yōu)的程序代碼。都說程序等于七分?jǐn)?shù)據(jù)結(jié)構(gòu)加上三分算法,可見,“數(shù)據(jù)結(jié)構(gòu)”課程對編程相關(guān)專業(yè)的學(xué)習(xí)是非常重要的。該課程以提高學(xué)生的編程能力為主要培養(yǎng)目標(biāo),以程序設(shè)計(jì)為基礎(chǔ),對學(xué)生進(jìn)行較復(fù)雜程序設(shè)計(jì)的訓(xùn)練。
“數(shù)據(jù)結(jié)構(gòu)”課程理論知識點(diǎn)較多,涉及的內(nèi)容有集合、數(shù)組、字符串、線性表、廣義表、棧、隊(duì)列、二叉樹、圖等,操作也非常繁瑣,如何在教學(xué)中讓學(xué)生掌握其繁雜的內(nèi)容,采用傳統(tǒng)的教師講、學(xué)生聽的方法是遠(yuǎn)遠(yuǎn)不夠的,各高校教師為提高學(xué)生課堂學(xué)習(xí)效果,提出了很多種創(chuàng)新的教學(xué)方法,筆者在實(shí)際教學(xué)中采用了學(xué)生參與式教學(xué)方法,該種方法將課堂主體由教師轉(zhuǎn)換成學(xué)生,學(xué)生由一個(gè)被動(dòng)接受者的角色轉(zhuǎn)換為一個(gè)自主、探究學(xué)習(xí)者的角色。這兩種角色的轉(zhuǎn)換實(shí)質(zhì)是學(xué)生自主完成學(xué)習(xí)內(nèi)容進(jìn)行創(chuàng)新思維的過程。參與型教學(xué)就是以學(xué)生的探索嘗試為核心來設(shè)計(jì)各教學(xué)環(huán)節(jié),引導(dǎo)學(xué)生在參與過程中通過自身體驗(yàn)不斷思考,以此提出新觀點(diǎn)、掌握其知識脈絡(luò),使學(xué)生成為探索、創(chuàng)新、學(xué)習(xí)的主體[1]。參與式教學(xué)過程中的關(guān)鍵環(huán)節(jié)是如何調(diào)動(dòng)學(xué)生的參與度。
在教學(xué)過程中,抓住本門課程的兩個(gè)核心概念邏輯結(jié)構(gòu)和物理結(jié)構(gòu)來展開,整門課程的講解以算法實(shí)現(xiàn)為軸進(jìn)行串聯(lián),筆者的理論課講解過程如下。
講解數(shù)據(jù)結(jié)構(gòu)的基本概念,介紹本門課程學(xué)習(xí)的主要內(nèi)容,需要達(dá)到的教學(xué)目標(biāo),本門課程在本專業(yè)中的地位,以及工作中的用途等,讓學(xué)生學(xué)習(xí)課程之前就了解本門課程的作用,能夠把握學(xué)習(xí)的主線來展開學(xué)習(xí)。
簡單介紹所使用教材的每章內(nèi)容及每章之間的關(guān)聯(lián),從編者角度出發(fā),向?qū)W生說明教材的組織結(jié)構(gòu),讓學(xué)生在學(xué)習(xí)之前就知道本門課應(yīng)該掌握的核心內(nèi)容是什么,在學(xué)習(xí)過程中有側(cè)重地學(xué)習(xí)。
數(shù)據(jù)結(jié)構(gòu)的邏輯結(jié)構(gòu)大致包括集合、線性結(jié)構(gòu)和非線性結(jié)構(gòu),從線性結(jié)構(gòu)入手進(jìn)行講解,將線性表的相關(guān)概念、存儲結(jié)構(gòu)的定義、所能進(jìn)行的操作及算法思想進(jìn)行詳細(xì)講解,對于算法實(shí)現(xiàn),讓學(xué)生自己試著去寫,教師側(cè)重于指導(dǎo)。
對于棧和隊(duì)列這兩種線性結(jié)構(gòu),重點(diǎn)講解其與線性表的區(qū)別,其他的學(xué)習(xí)內(nèi)容全都由學(xué)生自己獨(dú)立完成,教師需要做好引導(dǎo)環(huán)節(jié)的工作,可以設(shè)計(jì)不同層次的問題,引導(dǎo)學(xué)生一步一步地學(xué)習(xí),當(dāng)學(xué)生提出問題時(shí),不是第一時(shí)間給予解答,而是讓同學(xué)之間先進(jìn)行探討,學(xué)生各抒己見后教師再進(jìn)行總結(jié),這樣能夠讓學(xué)生深入地思考,從而激發(fā)學(xué)習(xí)興趣。
線性結(jié)構(gòu)講解完后,簡單介紹一下集合類型,本章知識點(diǎn)不用投入太多的時(shí)間與精力,在集合部分的代碼實(shí)現(xiàn)中,查找操作是核心思想,讓同學(xué)們注意該算法,在后面章節(jié)中還會對該算法進(jìn)行重點(diǎn)講解。
接下來是非線性結(jié)構(gòu)的學(xué)習(xí)——樹和二叉樹,重點(diǎn)是二叉樹的概念及應(yīng)用,二叉樹的性質(zhì)讓學(xué)生自己進(jìn)行總結(jié),這些性質(zhì)涉及的知識點(diǎn)主要是高中階段所學(xué)習(xí)的等比序列和排列組合的內(nèi)容,通過這部分內(nèi)容可以看出,計(jì)算機(jī)和數(shù)學(xué)是不分家的,要想學(xué)好計(jì)算機(jī),首先要有扎實(shí)的數(shù)學(xué)基礎(chǔ),否則在一些計(jì)算機(jī)理論知識的理解上會存在問題,將無法順利地進(jìn)行后續(xù)內(nèi)容的學(xué)習(xí),這也是教師為什么總說,通過計(jì)算機(jī)的學(xué)習(xí)能夠有效提高數(shù)學(xué)能力、邏輯思維能力及計(jì)算能力的主要原因。二叉樹在現(xiàn)實(shí)生活中的應(yīng)用非常多,如人機(jī)對弈中每一步棋子如何進(jìn)行布局,最終勝出;如何利用二叉樹對一組數(shù)列進(jìn)行排序;在現(xiàn)代通信技術(shù)中如何進(jìn)行字符編碼等,在對這部分知識進(jìn)行講解時(shí),多列舉一些學(xué)生了解并感興趣的例子,以此激發(fā)學(xué)生學(xué)習(xí)的興趣。
圖的存儲及算法實(shí)現(xiàn)是難點(diǎn),這部分內(nèi)容的學(xué)習(xí)采用的方法是:反復(fù)閱讀和理解相應(yīng)算法的計(jì)算機(jī)語言描述,要注意圖和樹型結(jié)構(gòu)、線性結(jié)構(gòu)之間的相同點(diǎn)及區(qū)別。
每個(gè)知識點(diǎn)之間都是有關(guān)聯(lián)的,講解完一種邏輯結(jié)構(gòu)后,一定要對其進(jìn)行總結(jié),并與前面學(xué)習(xí)過的其他類型的邏輯結(jié)構(gòu)進(jìn)行對比,找到異同及各自應(yīng)用的場合。
“數(shù)據(jù)結(jié)構(gòu)”課程學(xué)習(xí)結(jié)束后,能夠?yàn)槿藗兘鉀Q一個(gè)問題提供多種不同的解題思路。因此,通過數(shù)據(jù)結(jié)構(gòu)課程的學(xué)習(xí),能夠有效鍛煉并提高學(xué)生的發(fā)散思維能力,在解決實(shí)際問題時(shí),會使設(shè)計(jì)者在面對問題時(shí)考慮得更加全面,不會造成思維的局限性。通過本門課程的學(xué)習(xí),學(xué)生掌握了各種數(shù)據(jù)模型在各種存儲結(jié)構(gòu)下算法實(shí)現(xiàn)的對比分析,能夠做到在程序代碼編寫之前就明確哪種解決方案是最優(yōu)的,接下來可以節(jié)省大量試錯(cuò)的時(shí)間,將全部精力投入到程序代碼的編寫中,以此設(shè)計(jì)開發(fā)出效率最優(yōu)的程序代碼。
理論知識的理解非常重要,但只有理論知識,不結(jié)合實(shí)踐,也只是紙上談兵,在具體代碼實(shí)現(xiàn)時(shí)還是無從下手,所以,在教學(xué)中還要注重實(shí)際環(huán)節(jié)的練習(xí),因?yàn)槊棵瑢W(xué)編程能力有所不同,每堂課應(yīng)該布置不同難度的任務(wù),讓學(xué)生一步一步地進(jìn)行代碼的實(shí)現(xiàn),即使是編程能力較強(qiáng)的同學(xué)也建議他們從最簡單的任務(wù)開始,筆者在實(shí)踐教學(xué)中是如下設(shè)置的:每堂課設(shè)置一組實(shí)驗(yàn)項(xiàng)目,每個(gè)任務(wù)的難度不同,但都圍繞同一問題展開,當(dāng)一個(gè)任務(wù)完成后,在此基礎(chǔ)上進(jìn)行些許改動(dòng),就完成了下一個(gè)任務(wù),依次完成最終的任務(wù),該種方法將一個(gè)大的、復(fù)雜問題分解為若干個(gè)遞進(jìn)問題,一步一步地引導(dǎo)學(xué)生完成,該種方法的運(yùn)用使學(xué)生不再感到每堂課的任務(wù)量大,無法下手,下面列舉兩個(gè)例子進(jìn)行說明。
示例一:在線性表的代碼實(shí)現(xiàn)過程中,采用模塊化的設(shè)計(jì)思想,將每個(gè)操作定義為一個(gè)函數(shù),然后通過主函數(shù)調(diào)用各個(gè)函數(shù),根據(jù)該任務(wù)可以設(shè)置以下任務(wù):
任務(wù)一:將所有的庫函數(shù)調(diào)用、主函數(shù)及線性表所有操作函數(shù)定義在一個(gè)文件中(教材有原代碼)。
任務(wù)二:將所有的庫函數(shù)調(diào)用、主函數(shù)定義在一個(gè)文件中,將線性表所有操作函數(shù)定義在一個(gè).C文件中。
任務(wù)三:將所有的庫函數(shù)調(diào)用、主函數(shù)定義在一個(gè)文件中,將線性表所有操作函數(shù)定義在一個(gè).H文件中。
任務(wù)四:對任務(wù)三中的主函數(shù)進(jìn)行重新編寫,來解決現(xiàn)實(shí)生活中的某一具體問題。如銀行在辦理業(yè)務(wù)時(shí),用戶需要按照先后順序進(jìn)行編號,以此確定操作順序,但VIP用戶具有優(yōu)先權(quán),不需要排隊(duì),通過線性表結(jié)構(gòu)來模擬實(shí)現(xiàn)這一操作過程,存儲結(jié)構(gòu)不限。
示例二:利用棧實(shí)現(xiàn)將十進(jìn)制整數(shù)轉(zhuǎn)換為二至九之間的任意進(jìn)制數(shù)的實(shí)現(xiàn),根據(jù)此問題可以設(shè)置以下一組任務(wù)。
任務(wù)一:在主函數(shù)中定義好要轉(zhuǎn)換的十進(jìn)制數(shù)及要轉(zhuǎn)換后的進(jìn)制(教材有原代碼)。
任務(wù)二:在主函數(shù)中通過scanf( )函數(shù)和printf( )函數(shù)輸入要轉(zhuǎn)換的十進(jìn)制數(shù)及要轉(zhuǎn)換后的進(jìn)制數(shù)。
任務(wù)三:實(shí)現(xiàn)將十進(jìn)制整數(shù)轉(zhuǎn)換為二至十六之間的任意進(jìn)制數(shù)。
任務(wù)四:計(jì)算機(jī)不斷發(fā)展,當(dāng)計(jì)算機(jī)中數(shù)據(jù)不再局限于十六進(jìn)制,而是產(chǎn)生了三十二進(jìn)制時(shí),思考三十二進(jìn)制將如何進(jìn)行編碼,并使用棧來實(shí)現(xiàn),將用戶輸入的任意十進(jìn)制轉(zhuǎn)換為二至三十二進(jìn)制之間的任意進(jìn)制。
任務(wù)五:在任務(wù)四的實(shí)現(xiàn)中,將棧中所存儲的數(shù)據(jù)類型定義為int型和char型,分別如何實(shí)現(xiàn)?
在實(shí)踐環(huán)節(jié)即使編程語言功底差的同學(xué),也可以完成任務(wù)一,因?yàn)檫@些源代碼在大部分教材中都有,雖然其編程能力差,但通過文件的創(chuàng)建、代碼的輸入、編譯、運(yùn)行在這一過程中也能收獲很多,當(dāng)編譯遇到問題時(shí),任課教師可以對其進(jìn)行指導(dǎo)講解,以提高其編程能力,學(xué)生們就能從只能完成任務(wù)一,然后完成任務(wù)二,逐漸完成任務(wù)三、任務(wù)四等所有的任務(wù)要求,如果課堂時(shí)間有限,同學(xué)們可以課下完成,將實(shí)踐過程中遇到的問題記錄下來,在課下詢問同學(xué)或找老師幫助解決。
在每堂實(shí)驗(yàn)課結(jié)束前,任課教師都要根據(jù)學(xué)生實(shí)踐情況進(jìn)行總結(jié),并提出下一步要求,為在課堂上完成所有任務(wù)的學(xué)生布置課下思考、練習(xí)、實(shí)踐內(nèi)容。在課下練習(xí)時(shí),鼓勵(lì)學(xué)生不局限于書本的定義形式,讓學(xué)生發(fā)散思維,自己進(jìn)行定義并代碼實(shí)現(xiàn),當(dāng)學(xué)生定義形式或者實(shí)現(xiàn)思想與教材不同時(shí),可以讓同學(xué)們分析該算法與教材上算法的區(qū)別及優(yōu)劣。
在分層次任務(wù)教學(xué)中,第一層次的任務(wù)是最簡單的,一般情況下程序代碼已經(jīng)在教材上給出,或者由任課教師給出,即使基礎(chǔ)差只要按照任課教師的要求進(jìn)行練習(xí)還是有收獲的。每個(gè)問題所設(shè)置的任務(wù)數(shù)不等,每層任務(wù)之間差距較小,只要在前一任務(wù)基礎(chǔ)上進(jìn)行小小的改動(dòng),便可以完成下一級任務(wù),不會讓學(xué)生感覺太吃力,教師通過一個(gè)任務(wù)接著一個(gè)任務(wù)的引導(dǎo),讓學(xué)生最終完成所有任務(wù)。如果在實(shí)踐中,直接讓學(xué)生完成最后一個(gè)任務(wù),學(xué)生可能會有無從下手的感覺,這樣會嚴(yán)重打擊學(xué)生學(xué)習(xí)的積極性,特別是編程能力較差的同學(xué),直接放棄,不再嘗試程序代碼的編寫與實(shí)現(xiàn)。教學(xué)過程本來就是師生之間的一項(xiàng)雙邊活動(dòng),在教學(xué)過程中,要求教師以觀察、詢問、交談等多種方式來了解學(xué)生對知識、能力、情感等方面的信息,通過學(xué)生反饋的這些信息,任課教師能夠了解學(xué)生對知識等方面的掌握情況,任課教師能及時(shí)調(diào)節(jié)教學(xué)方法和教學(xué)手段,達(dá)到預(yù)期的教學(xué)目標(biāo)。學(xué)生通過該過程應(yīng)多聽、多說、多思考、多提問、多總結(jié),通過這一過程能夠鍛煉和提高學(xué)生的邏輯思維能力、總結(jié)能力、語言表達(dá)能力、文獻(xiàn)檢索能力等方面的能力,真正達(dá)到教書育人的目的[2]。
綜上所述,計(jì)算機(jī)編程能力對于信息化社會的人們來說非常重要,處理信息能力的強(qiáng)弱決定了在社會中生存能力的高低,在信息處理過程中,計(jì)算機(jī)編程思維成為人們必須掌握的一項(xiàng)基本技能,本文針對計(jì)算機(jī)專業(yè)的“數(shù)據(jù)結(jié)構(gòu)”課程,講解了如何在教學(xué)中培養(yǎng)學(xué)生的編程能力及計(jì)算思維能力,其他任課教師可以將該種方法引入到所授課程中,只有學(xué)生學(xué)習(xí)的參與度提高了,才能主動(dòng)去學(xué)習(xí),去接受知識,在學(xué)習(xí)過程中做到學(xué)習(xí)目標(biāo)明確,達(dá)到事半功倍的學(xué)習(xí)效果。
在“數(shù)據(jù)結(jié)構(gòu)”課程教學(xué)中講解了大量使用計(jì)算機(jī)編程來解決現(xiàn)實(shí)生活中的實(shí)際問題的案列,通過本門課程的學(xué)習(xí),對學(xué)生以后的工作也有很大幫助;“數(shù)據(jù)結(jié)構(gòu)”課程中思維能力的鍛煉,讓學(xué)生在自主創(chuàng)業(yè)時(shí),思維更加嚴(yán)謹(jǐn),考慮問題更加全面,使創(chuàng)業(yè)的成功率更高。