時間:2023-05-30 10:17:43
開篇:寫作不僅是一種記錄,更是一種創(chuàng)造,它讓我們能夠捕捉那些稍縱即逝的靈感,將它們永久地定格在紙上。下面是小編精心整理的12篇數(shù)據(jù)結(jié)構(gòu)課程設(shè)計,希望這些內(nèi)容能成為您創(chuàng)作過程中的良師益友,陪伴您不斷探索和進步。
摘要:本文針對傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計教學過程中出現(xiàn)的問題,提出一種案例驅(qū)動的數(shù)據(jù)結(jié)構(gòu)課程設(shè)計教學方式,以幫助學生理解和掌握分析問題、解決問題的方法,提高自主學習能力,鍛煉設(shè)計創(chuàng)新能力。實踐表明,此教學方式能夠彌補傳統(tǒng)教學的不足,開闊學生的思路,提高自主完成率,達到課程設(shè)計目的。
關(guān)鍵詞:課程設(shè)計;數(shù)據(jù)結(jié)構(gòu);案例驅(qū)動;教學改革
中圖分類號:G642
文獻標識碼:B
1引言
數(shù)據(jù)結(jié)構(gòu)課程是計算機相關(guān)專業(yè)的專業(yè)基礎(chǔ)課程,屬于專業(yè)課程體系中的核心課程。該課程著眼于對基本數(shù)據(jù)結(jié)構(gòu)進行闡述和分析、講解基本數(shù)據(jù)結(jié)構(gòu)的應(yīng)用并介紹典型的基本算法等三個方面,內(nèi)容比較抽象枯燥,掌握起來相對困難。數(shù)據(jù)結(jié)構(gòu)課程設(shè)計是一門獨立的實驗環(huán)節(jié),是對數(shù)據(jù)結(jié)構(gòu)課程教學理論的延伸和補充,是對理論知識的綜合應(yīng)用,其目的是發(fā)揮學生的主動性,培養(yǎng)學生分析實際問題并加以解決的能力,鍛煉學生的設(shè)計創(chuàng)新能力。
傳統(tǒng)的數(shù)據(jù)結(jié)構(gòu)課程設(shè)計教學輕講授,主要以對學生的單獨輔導為主,督促學生完成課程設(shè)計。這種方式存在后文所提及的一些問題,隨著互聯(lián)網(wǎng)資源的日益豐富,部分問題更加突出了。為了能讓學生通過課程設(shè)計更好的掌握數(shù)據(jù)結(jié)構(gòu)的內(nèi)容,我們設(shè)計了案例驅(qū)動的數(shù)據(jù)結(jié)構(gòu)課程設(shè)計教學改革,實踐證明,該項教改能夠填補傳統(tǒng)教學過程的不足。
2傳統(tǒng)教學過程中暴露的問題
(1) 缺乏駕馭全局的能力。本科二年級學生計算機建模能力弱,沒有軟件工程的思想,因而缺乏駕馭全局的能力。軟件工程課程一般都開設(shè)在數(shù)據(jù)結(jié)構(gòu)課程之后,在進行數(shù)據(jù)結(jié)構(gòu)課程設(shè)計前,學生也基本沒有分析、編寫較大程序的經(jīng)驗,這種情況造成了學生拿到問題后不知該從何下手和如何規(guī)劃好課程設(shè)計的整個過程。
(2) 生搬硬套基本數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)教材中都是最原始的數(shù)據(jù)結(jié)構(gòu),不進行擴展和修改基本上是不能直接用到課程設(shè)計中解決實際問題的,而采用多種數(shù)據(jù)結(jié)構(gòu)解決問題并加以比較找尋最優(yōu)方案對于學生來說就更為困難。
(3) 對高級程序語言掌握不到位。數(shù)據(jù)結(jié)構(gòu)課程設(shè)計是需要用高級程序語言來編寫的,學生對該程序語言的掌握程度直接影響到課程設(shè)計的質(zhì)量,常見的問題包括:變量定義不規(guī)范、函數(shù)功能劃分不合理、代碼可讀性較差、文件讀寫掌握不好、調(diào)試程序能力較弱等。
(4) 照搬、照抄他人課程設(shè)計的現(xiàn)象存在。由于完成課程設(shè)計的時間有限,有的學生在無法自主完成的情況下,通過網(wǎng)絡(luò)、書籍等方式來查找解題方法。本來通過查閱資料消化吸收他人的解題思路來求解自己的課程設(shè)計問題是毋庸置疑的正規(guī)途徑,然而一方面課程設(shè)計的題目每個學校每屆學生都相對比較固定,致使存在抄襲往屆學生程序的現(xiàn)象,另一方面互聯(lián)網(wǎng)的發(fā)展使得查找相似題目的課程設(shè)計源代碼并非難事。此外,市面上還存在著大量快餐式的課程設(shè)計書籍在售,這類書籍良莠不齊,多是搜集、羅列了若干課程設(shè)計題目,源碼、光盤附上,草草分析講解了事。許多學生也習慣了這種快餐式的學習,能做到獨立思考、舉一反三的越來越少。
3案例驅(qū)動的數(shù)據(jù)結(jié)構(gòu)課程設(shè)計教學改革特點
案例驅(qū)動的數(shù)據(jù)結(jié)構(gòu)課程設(shè)計教學改革是將案例教學法引入數(shù)據(jù)結(jié)構(gòu)課程設(shè)計教學中,教師通過講解一個完整的案例分析解決過程,輔以多媒體的手段與學生交流、互動,達到培養(yǎng)學生分析并解決實際問題的能力,鍛煉學生的設(shè)計創(chuàng)新能力的目的,同時也彌補了目前數(shù)據(jù)結(jié)構(gòu)課程設(shè)計教學重實踐、輕講授的不足,豐富該項課程設(shè)計的教學內(nèi)容。該方法有以下特點:
(1) 提前熟悉軟件工程思想。案例的分析解決過程就是一個實踐軟件工程思想的過程,學生可以在講解的過程中體會軟件開發(fā)的完整流程,進而對自己的課程設(shè)計有全局性的考慮。
(2) 舉一反三,定制合適的數(shù)據(jù)結(jié)構(gòu)。對于案例講解中所涉及到的數(shù)據(jù)結(jié)構(gòu),教師將進行細致的分析。采用不同數(shù)據(jù)結(jié)構(gòu)解決同一問題,在性能和功能上會有所區(qū)別,學生可以在與教師的互動討論中提高對各種數(shù)據(jù)結(jié)構(gòu)的認識,從而設(shè)計適合解決自己課程設(shè)計的數(shù)據(jù)結(jié)構(gòu),甚至能夠采取多種解法。
(3) 養(yǎng)成良好的編程習慣。優(yōu)秀的代碼就像優(yōu)美的文章一樣能使閱讀者心情舒暢,教師講解的案例都是代碼級別的,定義規(guī)范、流程清楚、可讀性強、具備參考價值,這樣就促使學生養(yǎng)成良好的編程習慣。教師以多媒體手段演示代碼的編制調(diào)試過程,使學生對編程環(huán)境更加熟悉,能夠靈活運用跟蹤、斷點等調(diào)試手段,開發(fā)過程事半功倍。
(4) 最大限度避免抄襲課程設(shè)計的現(xiàn)象。大多數(shù)學生事實上都希望能夠自主完成課程設(shè)計,只是因為不會做才導致抄襲往屆學生或是市售相關(guān)書籍源碼的現(xiàn)象存在。授之以魚不如授之以漁,通過對典型案例的講授,教師教給了學生解決課程設(shè)計的方法,學生找到了突破口,便愿意通過自己的努力完成任務(wù),自己能制作“大餐”,也就不再求助于“快餐”了。
4典型數(shù)據(jù)結(jié)構(gòu)課程設(shè)計案例分析
“活期儲蓄帳目管理”是常見的數(shù)據(jù)結(jié)構(gòu)課程設(shè)計題目,下面以其講解過程為例簡單描述一下案例驅(qū)動的數(shù)據(jù)結(jié)構(gòu)課程設(shè)計教學的過程。
此課程設(shè)計需要實現(xiàn)的功能一般是:(1)采用交互工作方式;(2)實現(xiàn)儲戶開戶;(3)實現(xiàn)儲戶銷戶;(4)向某賬戶存款;(5)從某賬戶取款;(6)排序顯示所有賬戶信息;(7)查詢某賬戶余額;(8)查詢某賬戶交易記錄;(9)所有賬戶及其交易信息存儲至文件,程序運行時從文件中讀入。該課程設(shè)計考察的知識點包括:選擇并構(gòu)造數(shù)據(jù)結(jié)構(gòu);使用與特定數(shù)據(jù)結(jié)構(gòu)相應(yīng)的算法來實現(xiàn)具體功能;對文件讀寫結(jié)構(gòu)化數(shù)據(jù);對程序設(shè)計語言的靈活運用等。
首先應(yīng)對題目進行大致的分析,該題目包括兩方面的信息。一方面是儲戶的信息,可設(shè)計為包含賬號、姓名和余額等字段;另一方面是交易記錄信息,可設(shè)計為包括賬號、存取時間、存取標志、金額等字段,兩方面信息通過賬號字段關(guān)聯(lián)起來。使用順序存儲結(jié)構(gòu)、鏈式存儲結(jié)構(gòu)或樹形結(jié)構(gòu)都可以存儲這些信息,但其中各有利弊。順序存儲結(jié)構(gòu)設(shè)計簡單,但容量固定,賬戶插入刪除需要進行記錄的移動,單個賬戶的交易記錄信息存儲不易連續(xù)導致列舉時需要對全部交易記錄進行完整遍歷,對已排序順序表查找某一記錄時可以采用特定算法(如二分法)提高效率,總體上來說實用性和整體效率相對較差。鏈式存儲結(jié)構(gòu)設(shè)計略復雜,容量不設(shè)上限,賬戶插入刪除較方便,采用鏈式結(jié)構(gòu)存儲的交易記錄形式上連續(xù),列舉時很方便,但在查找某一記錄時需要遍歷整個鏈表效率較低,總體上來說實用性和整體效率中上。樹形存儲結(jié)構(gòu)相對最復雜,容量也不設(shè)上限,插入、刪除算法也相對復雜,采用特殊樹形結(jié)構(gòu)(如二叉排序樹)能夠提高查找記錄時的效率,交易記錄仍可采用鏈式結(jié)構(gòu)存儲,總體上來說實用性和整體效率較好,現(xiàn)實中的數(shù)據(jù)庫管理系統(tǒng)(DBMS)多是用樹形結(jié)構(gòu)來實現(xiàn)的。從實現(xiàn)難度上來說,順序存儲最簡單,鏈式存儲次之,樹形存儲最難。因此,對學生一般要求其用鏈式存儲來實現(xiàn),對能力較強的學生可以鼓勵其用樹形存儲來實現(xiàn),以鏈式存儲為例繼續(xù)討論。
賬戶信息和存取記錄之間是通過賬號來關(guān)聯(lián)的,在鏈式存儲結(jié)構(gòu)中可以用指針來表示兩者的聯(lián)系,即每個賬戶節(jié)點(數(shù)據(jù)域可包含賬號、姓名和余額等字段)具有兩個指針域,一個指針指向下一個賬戶節(jié)點,另一個指針域指向該賬戶的存取記錄鏈表(存取記錄節(jié)點的數(shù)據(jù)域可包含存取時間、存取標志、金額等字段),如下圖所示。
從功能上分析,儲戶開戶、儲戶銷戶就是在賬戶鏈表中進行插入和刪除操作;對賬戶存、取款時,首先找到相應(yīng)賬戶,然后添加一條存取記錄,同時修正該賬戶的余額;排序顯示所有賬戶信息,就是對賬戶記錄依據(jù)某一關(guān)鍵字進行排序并顯示排序結(jié)果;查詢某賬戶余額,就是遍歷賬戶鏈表,找到對應(yīng)記錄并顯示出來;查詢某賬戶交易記錄,就是先找到該賬戶,然后遍歷顯示該賬戶對應(yīng)的存取記錄鏈表。可以看出,對賬戶鏈表進行遍歷查詢在賬戶存取款、查詢余額和查詢存取記錄是都有用到,因此在設(shè)計時,可以考慮編寫查詢賬戶函數(shù),以供其他功能模塊調(diào)用。
在文件存取方面,存取時都是以存儲節(jié)點為單位進行的,即一次性存取一個結(jié)構(gòu)體。該課程設(shè)計有其特殊之處,有兩種類型的結(jié)構(gòu)體需要存取,即賬戶信息和存取款記錄,這兩種結(jié)構(gòu)體所占用的空間不盡相同,若是都保存在一個數(shù)據(jù)文件中則需要一定的技巧。以保存記錄到文件為例,可以采用存一個賬戶信息,再存一個整形數(shù),該整形數(shù)的數(shù)值為此賬戶對應(yīng)存取記錄節(jié)點的數(shù)量,然后再逐一保存每條存取記錄,存儲完畢后再用相同方法保存下一個賬戶的記錄。讀取文件過程則是存儲過程的逆過程,這樣可以保證存取時,賬戶信息和存取記錄一一對應(yīng),不至于混淆。
在確定了上述思路后,便可以著手編碼,值得注意的是數(shù)據(jù)結(jié)構(gòu)的定義。由于采用了鏈式結(jié)構(gòu),許多同學便直接將鏈式結(jié)構(gòu)的節(jié)點(包括指針域)直接存儲到文件中。事實上,這個指針域是沒有保存價值的,尤其在讀取時如果也將指針域讀出并賦值,將很有可能導致不可預(yù)知的錯誤。可以采取的方法是,先定義只包含數(shù)據(jù)域的數(shù)據(jù)結(jié)構(gòu)體,再定義鏈表節(jié)點結(jié)構(gòu)體將數(shù)據(jù)結(jié)構(gòu)體封裝起來并加上指針域,在文件讀寫時只對數(shù)據(jù)結(jié)構(gòu)體進行操作。給出該課程設(shè)計數(shù)據(jù)結(jié)構(gòu)參考定義如下:
typedef struct log //存取記錄
{
char DateTime[25]; //存取時間
char W_D; //存取標志
float Amount; //存取金額
} log;
typedef struct node_log //存取記錄節(jié)點
{
log data; //存取記錄
struct node_log *next; //下一存取記錄節(jié)點指針
} node_log, *p_node_log;
typedef struct account //賬戶記錄
{
char ID[10]; //賬號
char Name[10]; //姓名
float Balance; //余額
} account;
typedef struct node_account //賬戶記錄節(jié)點
{
account data; //賬戶記錄
struct node_log *nlog; //存取記錄節(jié)點指針
struct node_account *next; //下一賬戶記錄節(jié)點指針
} node_account, *p_node_account;
其他功能模塊便可以參照數(shù)據(jù)結(jié)構(gòu)教材上的相關(guān)算法設(shè)計實現(xiàn)。
5結(jié)果與結(jié)論
我們將來自3個不同專業(yè)(計算機、網(wǎng)絡(luò)工程、軟件工程)10個班級的57名同學分成了兩組,一組(試驗組)通過上述方法進行了課程設(shè)計教學,一組(對照組)仍采用傳統(tǒng)方法教學,課程設(shè)計題目相同。課程設(shè)計對比統(tǒng)計情況如下表,其中試驗組優(yōu)良率達到44%,不合格率13%,對照組優(yōu)良率21%,不合格率26%。同時,試驗組采用了多種方式來實現(xiàn)了課程設(shè)計,且雷同情況較少,對照組多數(shù)采用順序存儲方式實現(xiàn),程序雷同情況較多。很明顯,試驗組的學生思路更加開闊,自主完成率更高。
時代在變遷,信息獲取更加便捷,部分學生的學習積極性在某種程度上也發(fā)生了蛻變,隨之的教學方式也應(yīng)有所改變,教師應(yīng)從正面加以引導。在以案例驅(qū)動的數(shù)據(jù)結(jié)構(gòu)課程設(shè)計教學改革實踐中,教師通過對典型案例的細致分析,比較不同數(shù)據(jù)結(jié)構(gòu)的優(yōu)缺點,一方面使學生更加牢固的掌握了數(shù)據(jù)結(jié)構(gòu)知識,另一方面讓學生找到入手之門,激發(fā)學習興趣,提高動手能力,更重要的是能讓學生掌握分析和解決問題的方法,自主完成課程設(shè)計,這對今后其他課程的學習也是有所裨益的。
參考文獻:
[1] 張培,肖天慶. 基于網(wǎng)絡(luò)環(huán)境下教學設(shè)計與課程開發(fā)的合作模式研究[J]. 電化教育研究,2007,(9):60-63.
[2] 吳宏偉,張殿龍,梅險. 高校網(wǎng)絡(luò)輔助教學的探索與實踐[J]. 計算機教育,2007,(7):18-21.
[3] 張敏霞. 程序設(shè)計語言課程教學方法改革的探索與實踐[J]. 中國高教研究,2004,(2):90.
關(guān)鍵詞:CDIO模式;教學改革;創(chuàng)新意識
CDIO是Conceiving,designing,implementingandoperating的縮寫,即“構(gòu)思、設(shè)計、實現(xiàn)、運作”。2014-2015年度第一學期,我們對遼寧工業(yè)大學(以下簡稱我校)電信學院數(shù)據(jù)結(jié)構(gòu)課程,以CDIO模式進行了數(shù)據(jù)結(jié)構(gòu)課程設(shè)計教學模式的探索。數(shù)據(jù)結(jié)構(gòu)課程是一門實踐性很強的專業(yè)核心課程,將CDIO教學模式在數(shù)據(jù)結(jié)構(gòu)課程設(shè)計運用,就是培養(yǎng)學生創(chuàng)新能力、分析設(shè)計能力和團隊合作能力的重要途徑。培養(yǎng)學生充分考慮數(shù)據(jù)結(jié)構(gòu)特性、響應(yīng)速度、處理時間、存儲空間和單位時間的處理量技術(shù)參數(shù),鼓勵學生自己去嘗試各種設(shè)計方案,找出最有效的解決辦法,著重培養(yǎng)學生專業(yè)能力、分析設(shè)計能力和合作能力。
一、傳統(tǒng)實踐教學存在的問題
實施教學改革前,傳統(tǒng)的數(shù)據(jù)結(jié)構(gòu)的課程設(shè)計是一般性設(shè)計。課設(shè)布置題目是針對教學內(nèi)容的小型練習題,讓學生獨立完成程序設(shè)計與實現(xiàn)。從學生的認知規(guī)律以及學生不同個體差異來看,把一些難懂的、晦澀的、抽象的東西原封不動地給出并采取傳統(tǒng)的教學模式進行教與學有幾點弊端:第一,學生在毫無知識背景的前提下,要完全理解這些抽象概念及抽象數(shù)據(jù)類型比較困難。第二,課設(shè)涉及到的知識點內(nèi)容單一,不需要學生考慮創(chuàng)新思維方面的設(shè)計方案。只要將課堂講過的內(nèi)容直接拿來用就可以,對于課設(shè)中各種技術(shù)參數(shù)的要求可以說沒有理解,導致設(shè)計解決方案不是最合適的。課程設(shè)計沒有達到預(yù)期收獲。第三,學生缺乏團隊合作過程,自己完成一個小型題目,在設(shè)計方案和算法設(shè)計過程中鍛煉的層次和涉及面都比較窄。沒有體現(xiàn)數(shù)據(jù)結(jié)構(gòu)在處理大規(guī)模復雜問題時才能體現(xiàn)出的優(yōu)勢,使學生沒有真正認識數(shù)據(jù)結(jié)構(gòu)存在的意義。對以后學生參加實踐類課程活動有很大影響。
二、課程設(shè)計的改革措施
《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計采用了CDIO教學模式,強調(diào)知識的綜合運用,鍛煉學生對復雜問題進行分析與求解的能力,在項目實施過程中始終圍繞“構(gòu)思、設(shè)計、實現(xiàn)、運作”。它的指導思想是:以工程設(shè)計任務(wù)為導向,以培養(yǎng)學生創(chuàng)新能力、團隊合作能力為主要目標。通過利用綜合性課程設(shè)計,培養(yǎng)學生進行復雜程序設(shè)計這個主線,將學生在課堂上所學的比較抽象的理論知識具體化,提高了理論和實踐相結(jié)合的能力。具體做法如下:
(一)課程設(shè)計內(nèi)容改革
第一,從課程設(shè)計選題上精心準備:需要介紹題目內(nèi)容,介紹算法產(chǎn)生的背景。明確數(shù)據(jù)內(nèi)在的必然聯(lián)系,分析數(shù)據(jù)的邏輯結(jié)構(gòu);確定解決問題所需要用到的算法及設(shè)計參數(shù)的要求,設(shè)計數(shù)據(jù)的存儲結(jié)構(gòu);解決該課設(shè)到底應(yīng)該怎么做的問題。題目規(guī)模適宜,課程設(shè)計題目覆蓋的知識點應(yīng)盡可能避免單一,設(shè)計內(nèi)容要新,具有綜合性。第二,擴大知識面:要求學生從需求分析開始,通過查找大量的資料,充分理解設(shè)計技術(shù)參數(shù)的要求及實現(xiàn)方式,根據(jù)設(shè)計要求對空間復雜度、處理時間、時間復雜度和單位時間的處理量等技術(shù)參數(shù),分析數(shù)據(jù)進行哪些操作,建立數(shù)據(jù)的存儲結(jié)構(gòu)。第三,數(shù)據(jù)結(jié)構(gòu)課程特點邏輯結(jié)構(gòu)強,概念抽象,學生對于知識點的綜合運用能力差。在課設(shè)中明確知識點的前后序關(guān)系和知識點的歸屬,解決學生只見樹木不見森林的盲目性和隨機性。
(二)課程設(shè)計實施方法
我們對遼寧工業(yè)大學電子與信息學院數(shù)據(jù)結(jié)構(gòu)課程,以CDIO模式進行了數(shù)據(jù)結(jié)構(gòu)課程設(shè)計教學模式的探索,并且實施如下改革:第一,采用啟發(fā)式的設(shè)計思路,引導學生圍繞課程設(shè)計目標,通過查找與分析有關(guān)參考資料,培養(yǎng)和鼓勵學生的學習興趣,同時提高學生查閱資料的能力。第二,讓學生能夠按照軟件工程的思想進行軟件的分析、設(shè)計與實現(xiàn),提高學生實踐動手能力和協(xié)作開發(fā)大型軟件項目的能力。第三,在項目實施中,進行探究式的學習,不應(yīng)該只是“手把手”地教,要給學生留出發(fā)揮想象力和創(chuàng)造力的空間,激發(fā)學生創(chuàng)造的意識和能力。第四,努力使學生對規(guī)范性的軟件開發(fā)不僅僅是以實現(xiàn)相應(yīng)的程序為目標,更重要的是培養(yǎng)學生今后從事軟件開發(fā)所需要的各種能力與素質(zhì),包括測試能力和文檔寫作的能力。因此,在課程設(shè)計實施中,我們考察學生程序編寫、測試以及實驗報告撰寫工作。
三、實踐情況及效果
CDIO模式在國際高等教育中已有共識,通過實踐,根據(jù)軟件工程專業(yè)本科教學的培養(yǎng)目標,解決了傳統(tǒng)教學方式存在的問題,提高了實踐能力,體會到數(shù)據(jù)結(jié)構(gòu)課程設(shè)計實踐教學采用CDIO模式,突出了學生在理論教學與實踐教學過程中的主體地位,提高了教學的針對性和實效性。將CDIO教學模式引入到數(shù)據(jù)結(jié)構(gòu)課程設(shè)計教學中,改變了該課程的教學理念,重理論,輕實踐;重課堂,輕課外。改變了教師單向的知識傳授與學生被動接受之間的教與學模式,實踐情況及效果表現(xiàn)在:(1)學生學習方式發(fā)生了轉(zhuǎn)變,從被動接受知識,到主動查閱資料,對于題目要求的設(shè)計技術(shù)參數(shù)有了進一步理解,使學生學會分析和研究計算機處理的數(shù)據(jù)結(jié)構(gòu)的特點,分析數(shù)據(jù)的邏輯結(jié)構(gòu)及設(shè)計存儲結(jié)構(gòu),設(shè)計算法的基本思想,提高了理論和實踐相結(jié)合的能力。對知識有比較全面深刻了解,實際解決問題的能力有了明顯的提升。(2)采用CDIO教學模式,對于課程設(shè)計題目精心安排,給學生留出發(fā)揮想象力和創(chuàng)造力的空間,提高了學生運用知識分析問題和解決問題的能力。培養(yǎng)學生的創(chuàng)新能力和創(chuàng)造性思維。(3)實踐中,培養(yǎng)學生充分考慮數(shù)據(jù)結(jié)構(gòu)特性、響應(yīng)速度、處理時間、存儲空間和單位時間的處理量技術(shù)參數(shù),鼓勵學生自己去嘗試各種設(shè)計方案,找出最有效的解決辦法。著重培養(yǎng)學生專業(yè)能力、分析設(shè)計能力和合作能力。
參考文獻:
[1]張洪奎,等.國家級實驗教學示范中心建設(shè)的探索與實踐[J].高等理科教育,2009,83(1):22-26.
[2]方愷晴,等.信息技術(shù)實驗室教學示范中心的建設(shè)與改革[J].實驗室研究與探索,2009,28(4):93-95,100.
[3]陳春林,等.基于CDIO教育理念的工程學科教育改革與實踐[J].教育與現(xiàn)代化,2010(1):30-34.
【關(guān)鍵詞】數(shù)據(jù)結(jié)構(gòu);基本知識;課程實驗;方法;改革
中圖分類號:G423.07 文獻標志碼:A 文章編號:1673-8500(2014)01-0068-01
一、數(shù)據(jù)結(jié)構(gòu)內(nèi)涵
數(shù)據(jù)結(jié)構(gòu)是指相互之間存在著一種或多種關(guān)系的數(shù)據(jù)元素的集合和該集合中數(shù)據(jù)元素之間的關(guān)系組成。目前,對數(shù)據(jù)結(jié)構(gòu)研究已經(jīng)成為世界上一些非數(shù)值量的信息結(jié)構(gòu)及其處理方法,它被定為計算機科學與技術(shù)相關(guān)專的重要課程,同時也是應(yīng)用數(shù)學、管理科學等很多專業(yè)的一門基礎(chǔ)課程。為了更好有成效的使用計算機、讓計算機的性能得到充分發(fā)揮,數(shù)據(jù)結(jié)構(gòu)的有關(guān)知識的學習和掌握是非常必要的,大量的很難的算法存在于數(shù)據(jù)結(jié)構(gòu)中,分解與抽象是它的核心技術(shù),要想讓學生掌握這門核心技術(shù),就要認真扎實的通過對課程內(nèi)容的學習與實踐,構(gòu)造性思維訓練的特征得到有效的體現(xiàn),提高學生的操作能力和實際應(yīng)用水平。
二、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計改革
通過課程設(shè)計來讓學生進一步掌握數(shù)據(jù)結(jié)構(gòu)的整體框架和知識層次,課程設(shè)計的內(nèi)容主要是根據(jù)三種邏輯結(jié)構(gòu)(線性、樹型和圖型)把課程分成三部分貫穿下來,對每一部分又采用層次結(jié)構(gòu),即邏輯結(jié)構(gòu)、存儲結(jié)構(gòu)和在該存儲結(jié)構(gòu)上的操作及相應(yīng)的算法。結(jié)合講過的一個和幾個典型的算法給學生留一個實際問題,讓學生編程序上計算機去處理。如:講線性問題的插入和刪除這部分時,就留一作業(yè)題:把學生成績按學號錄入進計算機中,一涉及到實際問題就會用到許多的相關(guān)知識,需要查閱大量的書籍和網(wǎng)站。不過,得到的收獲也是可觀的。
三、數(shù)據(jù)結(jié)構(gòu)教學手段和教學方法的改革
實現(xiàn)以教師主導下的以學生為主體的教學模式。在具體的教學手法方面,把學生為教學的主體,堅持實行任務(wù)驅(qū)動的教學手段,誘導學生主動學習,相互協(xié)助學習,共同進行探索與研究,這種教學方式學生很容易接受并受到好評,取得成效很顯著。研究算法的具體法則是給學生的算法實現(xiàn)的有關(guān)程序和算法實現(xiàn)的思路。每一節(jié)課上完后,對討論過的內(nèi)容作出總結(jié),對本節(jié)極容易出錯的狀況做好歸納,梳理出具體條款。學生對每一種數(shù)據(jù)結(jié)構(gòu)的特點和實現(xiàn)都能夠牢牢地掌握。除此之外,做好與學生溝通協(xié)調(diào)工作,重視課后輔導。課下輔導除在課堂中以及學生上機進行輔導之外,還有一種辦法是和學生取得聯(lián)系,利用網(wǎng)上交談的手段,利用這種手段,掌握學生的思想動態(tài)、學習狀況,迅速回應(yīng)學生在自主學習及課后學習時遇到的疑難問題。教師在數(shù)據(jù)結(jié)構(gòu)教學手段上,要精心設(shè)計教學內(nèi)容,對較困難的算法制作以及收集了大量FIASH演示動畫方面的材料。把抽象的概念和空間結(jié)構(gòu)加以具體化、形象化,使所教的數(shù)據(jù)結(jié)構(gòu)內(nèi)容直觀、生動、提高了學生的學習的積極性,同時提高數(shù)據(jù)結(jié)構(gòu)教學質(zhì)量和學生的學習效果。
四、數(shù)據(jù)結(jié)構(gòu)基本知識部分教學的改革
數(shù)據(jù)結(jié)構(gòu)的基本知識是這門課程的重點,包括數(shù)據(jù)的邏輯結(jié)構(gòu),相應(yīng)邏輯結(jié)構(gòu)的存儲結(jié)構(gòu),以及在此存儲結(jié)構(gòu)上的相關(guān)操作及算法等,這些內(nèi)容必須要講,也很枯燥,教學時可以根據(jù)實際情況做一些調(diào)整。
教授學生理解數(shù)據(jù)結(jié)構(gòu)這門課,同時也是提高學生的學習興趣的實踐過程。通過舉例分類、總結(jié)學生參與進來的辦法來幫助學生理解數(shù)據(jù)的邏輯結(jié)構(gòu)和存儲結(jié)構(gòu)等概念。首先從實際情況入手來引出邏輯結(jié)構(gòu)的概念:學生都知道計算機能進行圖書管理,能和人對弈,可是學生要明白計算機之所以能干這些事是靠人工編的程序輸入到計算機中來支配計算機工作的,程序怎么編,不同的問題有不同的編程思路,那么實際中的問題基本上就是這么三類;線性問題、樹型問題和圖型問題。接著通過分析上面圖書管理問題,下棋問題,以及修路問題來讓學生明白什么是線性、樹型和圖型問題,接著給一定的時間讓學生每人想出一個線性、樹型和圖型關(guān)系的例子,在生動活潑的氣氛中把實際問題過渡到這門課中來,實際生活活躍了學生的課堂氣氛。反過來,學生也把數(shù)據(jù)結(jié)構(gòu)的理論知識應(yīng)用到了實際中去,最后總結(jié)到實際問題的線性、樹型和圖型的邏輯關(guān)系是人類對實際問題的邏輯思維。在數(shù)據(jù)結(jié)構(gòu)這門課中把這種邏輯關(guān)系叫做邏輯結(jié)構(gòu)。要讓計算機處理實際問題必須把從實際問題中抽象出來的數(shù)據(jù)和它們之間的邏輯結(jié)構(gòu)存儲到計算機中,計算機才能夠?qū)嶋H問題進行處理,那么怎么存儲呢?邏輯結(jié)構(gòu)在計算機中的存儲方式在數(shù)據(jù)結(jié)構(gòu)中就叫存儲結(jié)構(gòu)。邏輯結(jié)構(gòu)和存儲結(jié)構(gòu)這兩個概念學生就順其自然地接受下來。
五、數(shù)據(jù)結(jié)構(gòu)課程實驗部分教學的改革
進行實驗教學改革,加強實踐教學環(huán)節(jié)。讓學生學以致用是教師傳授知識的目的,因此明確教學目標,把培養(yǎng)學生的能力放到重要位置,重視數(shù)據(jù)結(jié)構(gòu)實踐性環(huán)節(jié)。數(shù)據(jù)結(jié)構(gòu)課程的讓學生上機實習,是對學生極有利全面綜合訓練,它與課堂上聽老師的講解、自主學習和獨立訓練是相輔相成的,也是教學中不可或缺的一個教學環(huán)節(jié)。因此為了幫助學生更好地學習本課程,理解和掌握算法設(shè)計所需的技術(shù),制定了實驗大綱,實驗指導書,實驗手冊等設(shè)計了系統(tǒng)的有效的實驗項目,規(guī)范實驗報告,提高學生編程能力和專業(yè)技術(shù)水平。
在學生理解了數(shù)據(jù)結(jié)構(gòu)的邏輯結(jié)構(gòu)和存儲結(jié)構(gòu)這兩個概念的基礎(chǔ)上,接著讓學生學習計算機對數(shù)據(jù)的操作和算法。算法一般都是用C語言來描述的,要想讓學生掌握好每個操作的算法,一定要學生自己編出完整的程序,直接上機訓練每個算法。在理論課上把每種邏輯機構(gòu)聯(lián)系到的操作進行初步歸類后,接著講每種操作的算法。講算法時主要采用以下方式幫助學生理解和掌握:
關(guān)鍵詞:程序設(shè)計;教學改革;實踐能力
中圖分類號: G642文獻標識碼:A文章編號:1009-3044(2012)02-0366-02
Practice on the Teaching of the Programing Course
YUAN Hui-yong, YANG Si-qing, YI Ye-qing
(Department of Computer, Hunan Institute of Humanities, Science and Technology, Loudi 417000, China)
Abstract: This paper first analyses the problem in teaching of "C Language"," Data Structure" and "Algorithm Design and Analysis", and then propose a reform of teaching by improving teaching method, integrating teaching content and strengthening practice teaching. Results show that the reform of teaching can effectively stimulate students interest in learning, improve the efficiency of learning and the ability of programming.
Key words:programming; reform of teaching; ability of practice
1概述
目前C語言程序設(shè)計、數(shù)據(jù)結(jié)構(gòu)、算法分析與設(shè)計是計算機及其相關(guān)專業(yè)中非常重要的專業(yè)課程。在以往教學中,這三門課程采用相對獨立、分開授課的方式,導致課程內(nèi)容脫節(jié)與重復,教學效果差,學習完三門課程后卻不能編寫程序的大有人在。這三門課程都以培養(yǎng)學生解決實際問題的程序設(shè)計能力為共同目標,因此,如何將三門課程有機地結(jié)合起來,構(gòu)建程序設(shè)計系列課程的新體系,整合教學內(nèi)容,改進教學方法,切實提升學生的程序設(shè)計能力,成了當前計算機專業(yè)教學改革中亟待解決的問題。
2教學中存在的問題
在傳統(tǒng)的教學中,C語言程序設(shè)計、數(shù)據(jù)結(jié)構(gòu)、算法分析與設(shè)計三門課程的分開授課,課程知識沒有整合,對課程知識中存在重疊的內(nèi)容,只是做簡單的重復講解(如C語言和數(shù)據(jù)結(jié)構(gòu)課程中都有數(shù)組這個教學內(nèi)容),教學深度不夠。教學中注重講授基本理論,忽略了程序設(shè)計過程中涉及的方法和技術(shù)(如算法分析與設(shè)計課程通常是將已有的經(jīng)典算法在數(shù)學模型和數(shù)據(jù)結(jié)構(gòu)上給學生解釋),理論教學與實踐教學結(jié)合不夠緊密(如數(shù)據(jù)結(jié)構(gòu)在講授了某種抽象的數(shù)據(jù)關(guān)系和在計算機中的表示與實現(xiàn)后,并沒有將這種結(jié)構(gòu)用到解決實際問題中去),造成有些學生雖然具備了一定的理論基礎(chǔ),但由于實踐教學薄弱,動手能力差。
3具體改革措施
我們改變了以往C語言程序設(shè)計、數(shù)據(jù)結(jié)構(gòu)、算法分析與設(shè)計分開授課的模式,而是將這三門課程作為一個整體,以培養(yǎng)學生解決實際問題的程序設(shè)計能力為目標,從組織教學內(nèi)容、改進教學方法、突出實踐教學等方面進行教學改革與實踐。
3.1整合教學內(nèi)容
C語言程序設(shè)計是數(shù)據(jù)結(jié)構(gòu)的前導課程之一,學生對它的掌握程度直接關(guān)系到數(shù)據(jù)結(jié)構(gòu)課程的教學效果。算法分析與設(shè)計是計算機專業(yè)程序設(shè)計類的核心課程,在學習該課程之前,要求學生們掌握了基本的數(shù)據(jù)結(jié)構(gòu)知識,能熟練運用一門或多門編程語言,并具備一定的編程經(jīng)驗。
我校原來的C語言、數(shù)據(jù)結(jié)構(gòu)和算法分析與設(shè)計三門課程是相對獨立、分開授課的,學習效果不理想。我們將這三門課程的知識進行整合,采用同一教師授課,做到了前導課、后續(xù)課的有機銜接,并重新制定了三門課程的教學計劃,以知識點為單元,將這三 門課程很好地結(jié)合起來。在C語言的教學中,以C語言為主線,適當穿插數(shù)據(jù)結(jié)構(gòu)中的相關(guān)內(nèi)容,使C語言與數(shù)據(jù)結(jié)構(gòu)有機地結(jié)合在一起,如我們將C語言中的數(shù)組和數(shù)據(jù)結(jié)構(gòu)中的直接插入排序、冒泡排序、簡單選擇排序、順序查找、折半查找方法放在一個知識單元中。在數(shù)據(jù)結(jié)構(gòu)教學中,穿插了算法分析與設(shè)計的有關(guān)知識,如在講述哈夫曼樹和圖的最小生成樹時,穿插了講述了貪心算法,在講述圖的最短路徑時介紹了動態(tài)規(guī)劃算法。
我們不再把C語言當做一門語言來講解,加強了數(shù)據(jù)結(jié)構(gòu)、算法設(shè)計、邏輯思維和編程方法的教學。數(shù)據(jù)結(jié)構(gòu)課程不再只注重講授抽象的數(shù)據(jù)關(guān)系和存儲結(jié)構(gòu),而要求學生用C語言編程實現(xiàn)各種算法,并結(jié)合實際應(yīng)用,在ACM/ICPC在線評測系統(tǒng)上完成相應(yīng)的練習題目,學生不再感到枯燥無味,不僅較好地解決了數(shù)據(jù)結(jié)構(gòu)教學中學生上機困難的問題,也提高了學生的程序設(shè)計能力。在算法分析與設(shè)計課程教學中,我們選擇一些難度適中、能結(jié)合實際問題和相關(guān)課程的知識來講解,使學生既能理解,又能拓展創(chuàng)新。
3.2改進教學方法
我校屬于應(yīng)用型本科院校,其教育目標著重于培養(yǎng)具有實際工作能力的技術(shù)型和應(yīng)用型人才。在C語言的教學中我們采用了“案例”教學方法,從日常生活中選擇能典型反映教學內(nèi)容的案例,所選案例難度適中并能反映多個知識點。如選用了“學生的成績管理”,該案例覆蓋了C語言中的循環(huán)結(jié)構(gòu)與數(shù)組,涉及數(shù)據(jù)結(jié)構(gòu)中的排序與查找。在該案例中穿插介紹了數(shù)據(jù)結(jié)構(gòu)課程中的直接插入排序、冒泡排序、簡單選擇排序和順序查找;通過介紹C++中的排序函數(shù)qsort()激發(fā)學生自覺地學習C++標準模版庫;并提出如何保存學生信息以避免重復輸入數(shù)據(jù)的問題,引導學生自學C語言中的文件操作,培養(yǎng)學生的再學習能力。在算法分析與設(shè)計課程的教學中,我們采用了“任務(wù)驅(qū)動”教學方法,將具體的算法設(shè)計策略融入到一些“任務(wù)”中,課堂教學以任務(wù)為主,引導學生利用算法設(shè)計策略探索解決方案,在課后的實踐環(huán)節(jié),將結(jié)合實際應(yīng)用且融入了知識點的任務(wù)放到ACM/ICPC在線評測系統(tǒng)上,讓學生在課后根據(jù)任務(wù)描述,自主探索問題解決方案,并提交程序代碼。
在教學過程中,對典型例題力求講透徹,并提出問題給學生思考。如斐波拉契數(shù)列,講解了分別使用變量交換的循環(huán)結(jié)構(gòu)、使用數(shù)組的循環(huán)結(jié)構(gòu)和遞歸三種編程方法,并比較了三種方法的優(yōu)缺點,使學生深刻體會到了采用遞歸求解斐波拉契數(shù)列的低效,引導學生理解使用數(shù)組的高效是基于算法分析與設(shè)計課程中的動態(tài)規(guī)劃的思想,并且穿插介紹了數(shù)據(jù)結(jié)構(gòu)課程中算法的時間復雜度與空間復雜度的度量;再提出大斐波拉契數(shù)列的求解問題,介紹使用數(shù)組進行高精度計算以及使用矩陣和二分法的求解方法,激發(fā)了學生的學習積極性。在例題的講解過程中,充分利用多媒體教學手段,加強了例題講解過程中的現(xiàn)場調(diào)試與分析,鼓勵學生對具體問題進行分析和研究,培養(yǎng)學生的邏輯分析和判斷能力,重視上機訓練,養(yǎng)成良好的編程習慣。
3.3加強實驗教學
這三門課程都是理論與實踐并重的課程,在教學中必須將理論教學與實踐教學緊密結(jié)合。我們從以下幾個方面來加強實驗教學:
1)重新編寫實驗指導書。按照教學內(nèi)容的知識點,綜合可操作性、趣味性和適當?shù)碾y度,編寫了適合教學要求的實驗指導書,既保證了實驗的可完成性,又增強了學生的興趣。
2)建立在線題庫。在ACM/ICPC在線評測系統(tǒng)上開設(shè)了C語言程序設(shè)計、數(shù)據(jù)結(jié)構(gòu)、算法分析與設(shè)計的專題訓練,每個專欄按照教學知識點安排了不同難度的練習題,學生可以根據(jù)自身的能力,完成相應(yīng)等級的題目,在探索與解決問題的過程中獲得學習成就感。
3)組織程序設(shè)計比賽。ACM/ICPC在線評測系統(tǒng)上安排了與教學知識點相關(guān)的競賽真題,鼓勵學生組隊、按照比賽規(guī)程進行模擬比賽。通過比賽,學生對教學知識點有了更深入的理解,不僅增強了學生的實踐動手能力,提高了學習興趣和積極性,也使學生提前了解ACM比賽的規(guī)則和比賽真題,訓練了學生的參與意識、競爭意識和團隊精神,為以后組織學生參加省程序設(shè)計比賽打下良好的基礎(chǔ)。
4)開設(shè)課程設(shè)計。課程設(shè)計的題目以典型的問題或?qū)嶋H的工程為主,如數(shù)據(jù)結(jié)構(gòu)課程選用了“教務(wù)計劃編制問題”,讓學生運用圖論中的拓撲排序來求解這個實際問題。通過課程設(shè)計,培養(yǎng)了學生綜合運用所學知識進行分析和解決實際問題的能力,使學生不僅學到了解決問題的辦法,同時加深了理論的理解與掌握,做到了理論教學與實踐緊密結(jié)合。
3.4改革考核與評分標準
考試作為課程教學的一個重要環(huán)節(jié),對學生的學習具有明顯的導向作用。這三門課程原來的考核分為平時成績和期末考試,這樣的考核方式很難考察學生的實踐能力,導致大部分學生只注重期末考試,而忽略學習過程,很難有效的提高學生的創(chuàng)新能力和實踐能力。我們認為這三門課程的考核應(yīng)著重考核學生的程序設(shè)計能力,而不是死記硬背一些基礎(chǔ)知識。為此,我們引入了ACM/ ICPC在線評測系統(tǒng)及,對課程的考核進行了大膽改革,評分標準也作了修改,提高實驗考核成績在課程總評成績中的比重,以此來引導學生認真對待實驗和課程設(shè)計,切實提高學生的實踐動手能力。
4結(jié)束語
實踐證明,將C語言程序設(shè)計、數(shù)據(jù)結(jié)構(gòu)、算法分析與設(shè)計這三門課程有機結(jié)合的教學改革,能夠很好地激發(fā)學生的學習興趣,學生在掌握基本理論和知識的同時,程序設(shè)計能力、數(shù)據(jù)結(jié)構(gòu)和算法設(shè)計的應(yīng)用能力也得到了很好的培養(yǎng),我校學生在近二年的湖南省程序設(shè)計比賽中均取得了較好的成績。
參考文獻:
[1]譚浩強. C程序設(shè)計(第2版) [M].北京:清華大學出版社,2005.
關(guān)鍵詞:應(yīng)用轉(zhuǎn)型;算法與數(shù)據(jù)結(jié)構(gòu);任務(wù)驅(qū)動;教學改革
中圖分類號:TP312 文獻標識碼:A
教育部于2013年,提出一項重大的改革,即計劃將大約600所地方性高等本科院校轉(zhuǎn)型為應(yīng)用型本科院校,2014年被列入教育部當年工作要點[1]。在高等院校向應(yīng)用型本科轉(zhuǎn)型的形勢下,高校教學面臨著新的機遇和挑戰(zhàn)。商洛學院作為陜西省首批應(yīng)用轉(zhuǎn)型試點高校,實現(xiàn)畢業(yè)時與社會、企業(yè)零距離對接,完成高等學校為社會輸送有用人才的最終目標[2]。
算法與數(shù)據(jù)結(jié)構(gòu)課程是計算機相關(guān)專業(yè)的專業(yè)基礎(chǔ)課程,是設(shè)計各種應(yīng)用軟件的重要基礎(chǔ),是我校電子信息科學與技術(shù)專業(yè)課程體系中的核心專業(yè)課程。本文主要針對當前教學過程的問題,進行探討研究,提出一種新的教學模式,達到教與學的有機結(jié)合[3]。
一、課程教學改革的必要性與緊迫性
算法與數(shù)據(jù)結(jié)構(gòu)課程主要涵蓋數(shù)據(jù)結(jié)構(gòu)的闡述分析、應(yīng)用以及經(jīng)典算法的應(yīng)用,主體內(nèi)容比較抽象,難以直觀描述,掌握相對困難。此外,電子信息科學與技術(shù)專業(yè)的學生計算機基礎(chǔ)知識薄弱,電子和計算機專業(yè)之間培養(yǎng)差異,導致電子信息科學與技術(shù)專業(yè)學生學習更加困難。隨著互聯(lián)網(wǎng)行業(yè)的迅猛發(fā)展,網(wǎng)絡(luò)教學資源的日漸豐富以及算法與數(shù)據(jù)結(jié)構(gòu)課程地位的愈加重要,傳統(tǒng)教學模式中的問題日益突出[4]。
(一)數(shù)據(jù)結(jié)構(gòu)課程自身特點
(1)高度抽象化,需要扎實的數(shù)理邏輯、圖論、高等數(shù)學、拓撲幾何、離散數(shù)學和數(shù)值分析等理論基礎(chǔ);(2)內(nèi)容涵蓋面廣泛豐富。(3)隱含的技術(shù)方法豐富,各部分問題解決方式種類多樣、沒有固定解法、靈活性強。
(二)應(yīng)用轉(zhuǎn)型下發(fā)展算法與數(shù)據(jù)結(jié)構(gòu)課程的教學目標
(1)重視算法與數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)理論知識學習,理解數(shù)據(jù)邏輯、數(shù)據(jù)存儲及數(shù)據(jù)運算等基本概念術(shù)語;(2)從實際問題出發(fā),培養(yǎng)學生運用算法與數(shù)據(jù)結(jié)構(gòu)的基本理論知識分析解決實際問題的能力;(3)重視學生實踐動手能力和工程項目思想的培養(yǎng)。
二、傳統(tǒng)教學過程中現(xiàn)存問題
根據(jù)長期從事算法與數(shù)據(jù)結(jié)構(gòu)的教學過程,發(fā)現(xiàn)當前算法與數(shù)據(jù)結(jié)構(gòu)教學中主要存在以下一些問題。
(一)難理解:本課程需要較高的邏輯思維和抽象思維能力,學生聯(lián)系實際比較困難這一問題始終縈繞在整個教學過程中。
(二)難把控:電子信息科學與技術(shù)專業(yè)本科二年級學生,其計算機基礎(chǔ)、建模能力、軟件工程的思想薄弱。
(三)難實現(xiàn):體現(xiàn)在遇到問題不知如何數(shù)據(jù)結(jié)構(gòu)類型;面對具體算法不清楚如何進行優(yōu)化;書本上的程序不能直接運行,學生自主學習有一定困難[5]。
(四)難應(yīng)用:數(shù)據(jù)結(jié)構(gòu)相關(guān)實驗的課程設(shè)計主要采用高級程序語言(如C,C++)等來編寫,我校電科專業(yè)學生對該程序語言的掌握程度直接影響到數(shù)據(jù)結(jié)構(gòu)課程的實際應(yīng)用情況。
三、教學模式改革與探索
針對現(xiàn)有傳統(tǒng)教學中存在的問題,為了提高學生算法與數(shù)據(jù)結(jié)構(gòu)應(yīng)用能力,需完善并加強實踐教學內(nèi)容。
(一)調(diào)整課程體系
當前教學是依據(jù)傳統(tǒng)的知識理論體系順序授課:然而當前應(yīng)用轉(zhuǎn)型環(huán)境下這種模式已難以適應(yīng)。根據(jù)學生學習認知一般規(guī)律及我校電子信息科學與技術(shù)專業(yè)自身特點,在傳統(tǒng)教學基礎(chǔ)上進一步優(yōu)化課程培養(yǎng)體系,針對每一知識點配備相應(yīng)實踐項目,將理論與實踐有機結(jié)合。
(二)優(yōu)化教學手段
傳統(tǒng)課堂教學主要以教師粉筆板書講授為主,不能用動態(tài)直觀的方式講解抽象知識,難以激發(fā)學生學習熱情,無法達到課題教學目的。
1.將微課引入教學中
借助微課這一新興教學模式,將算法與數(shù)據(jù)結(jié)構(gòu)課程重點、難點設(shè)計開發(fā)成網(wǎng)絡(luò)視頻資源,供學生課后自主學習。我們將算法與數(shù)據(jù)結(jié)構(gòu)中每一個知識點的內(nèi)容,制作成微教案、微視頻、微練習、微點評、微互動等傳至課程網(wǎng)絡(luò)中心。
2.將案例驅(qū)動引入教學中
案例驅(qū)動的算法與數(shù)據(jù)結(jié)構(gòu)教學方法,是將教學案例引入到課程教學過程中。教師通過一個完整案例的分析解決,借助板書、多媒體等手段與學生互動,達到培養(yǎng)學生發(fā)現(xiàn)問題、分析問題、解決問題的能力。
3.加強課外創(chuàng)新實踐活動
算法與數(shù)據(jù)結(jié)構(gòu)課程需要增加學生的課外創(chuàng)新實踐活動。具體通過以下方式開展:(1)組建算法和數(shù)據(jù)結(jié)構(gòu)學習創(chuàng)新小組,定期舉行學習經(jīng)驗研討交流活動,分享實際設(shè)計過程的困難、解決途徑和最新成果;(2)定期組織以算法為核心競賽活動,(3)鼓勵學生申報研究學習與科技創(chuàng)新性實驗項目,組織參加省市級或國家級各類學科競賽。
3.改革課程考核模式
傳統(tǒng)實驗課的課程,實驗動手部分只占10%,很多學生把重點放在報告書寫上,為適應(yīng)應(yīng)用轉(zhuǎn)型發(fā)展,加強學生實踐能力,課程考核提出以下改革方案:(1)平時(考勤+開卷隨堂測試+課堂表現(xiàn)),占學期總成績的10%;(2)課程上機實驗(源程序+實驗報告)30%;(3)期末卷面成績60%;(4)鼓鈦生到相關(guān)優(yōu)秀企業(yè)進行培訓實習
四、結(jié)語
針對當前電子信息科學與技術(shù)專業(yè)算法與數(shù)據(jù)結(jié)構(gòu)教學模式中培養(yǎng)目標及存在的主要問題,在轉(zhuǎn)向應(yīng)用型本科院校新形勢下,為培養(yǎng)創(chuàng)新型、應(yīng)用型人才,提高學生邏輯思維、編程運算等能力,本文主要從課程體系調(diào)整、教學手段優(yōu)化、創(chuàng)新實踐教學加強、考核模式改革共4個方面都出發(fā),以提高算法和數(shù)據(jù)結(jié)構(gòu)應(yīng)用能力為教學目標,結(jié)合工程項目與市場實際需求,指導并加強實踐教學。
參考文獻:
[1]陶影,張斌.數(shù)據(jù)結(jié)構(gòu)實驗教學應(yīng)重視算法設(shè)計與分析能力的培養(yǎng)[J].實驗室研究與探索,2008,12:119-122.
[2]張銘,趙海燕,王騰蛟,宋國杰,高軍.北京大學“數(shù)據(jù)結(jié)構(gòu)與算法”教學設(shè)計[J].計算機教育,2008,20:5-11.
[3]唐劍梅,譚平.《數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計實訓》課程教學研究[J].軟件導刊,2016,01:193-194.
[4]李治軍,廖明宏,張巖.數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計教學模式的探討[J].計算機教育,2006,02:54-56.
關(guān)鍵詞:CDIO理念;數(shù)據(jù)結(jié)構(gòu)教學模式;創(chuàng)新思考;實踐
中圖分類號:TP311.12-4 文獻標識碼:A 文章編號:1674-7712 (2014) 04-0000-01
數(shù)據(jù)結(jié)構(gòu)課程是計算機相關(guān)專業(yè)核心的基礎(chǔ)課程,其主要是研究計算機領(lǐng)域中相關(guān)的基本問題。隨著計算機技術(shù)以及信息化技術(shù)的普及,各行各業(yè)對計算機軟件應(yīng)用廣泛,所以數(shù)據(jù)結(jié)構(gòu)課程在高校中已經(jīng)不僅僅是計算機基礎(chǔ)課程,更是眾多理工科選修的熱門課程。然而由于其內(nèi)容專業(yè)性強,不易理解,所以對數(shù)據(jù)結(jié)構(gòu)教學帶來了諸多困難,所以加強教學創(chuàng)新,促進數(shù)據(jù)結(jié)構(gòu)教學發(fā)展具有很大的意義。
一、CDIO理念概述
CDIO是目前國際上高等工程教育中先進的創(chuàng)新模式,這種模式的根本目的就是將個人、社會以及系統(tǒng)的制造原理和技術(shù)有機的結(jié)合起來,為工程教育提供一個合理的、通用的教學目標,促使這種理念能適用于工程教學學科中各個領(lǐng)域。
CDIO理念的形成靈感來至于對工程中系統(tǒng)以及產(chǎn)品生命周期,在培養(yǎng)學生對工程相關(guān)基礎(chǔ)知識以及理論方面特別關(guān)注,并為工程教育放到具體的工程實踐領(lǐng)域中,在教育過程中涉及到團隊合作以及創(chuàng)新設(shè)計等。這個教育理念下,通過個人或團隊參與、構(gòu)思、設(shè)計等體驗,可以讓學生真正的融入到教學中去,并培養(yǎng)學生對系統(tǒng)構(gòu)建的能力。
二、基于CDIO理念背景下數(shù)據(jù)結(jié)構(gòu)教學模式創(chuàng)新的思考
數(shù)據(jù)結(jié)構(gòu)課程作為計算機相關(guān)學科的基礎(chǔ)性學科,學習過程中既有抽象的基礎(chǔ)理論,還包括具體的計算實踐,只有將兩者有機的結(jié)合,才能真正的培養(yǎng)學生實踐的能力。對于計算機以及相關(guān)專業(yè)的學生來說,團隊合作的能力也是在教學過程中需要重點培養(yǎng)的技能之一,其必須從基礎(chǔ)學科抓起。這就需要在進行數(shù)據(jù)結(jié)構(gòu)教學中積極探索創(chuàng)新新穎的教學方法,充分的調(diào)動學生學習的積極性,注重教學實踐與理論學習相結(jié)合的方法。基于CDIO理論給數(shù)據(jù)結(jié)構(gòu)教學的啟示主要包括以下幾個方面:
第一,在進行數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)理論教學的過程中,還應(yīng)該重視計算實踐教學相結(jié)合,這樣才能保證數(shù)據(jù)結(jié)構(gòu)課程能取得更大的教學效果;第二,數(shù)據(jù)結(jié)構(gòu)教學中,要運用多種教學方式相結(jié)合的模式,加強創(chuàng)新,增強課堂教學的趣味性,這樣才能激發(fā)學生參與教學活動的熱情;第三,在教學過程中,注重培養(yǎng)學生團隊合作的能力,在確保個人基礎(chǔ)知識掌握的基礎(chǔ)上,給予學生充分的時間進行團隊合作,發(fā)揮團體協(xié)作的作用;第四,計算機數(shù)據(jù)結(jié)構(gòu)課程設(shè)計方面,可以說是一個學科內(nèi)獨立的環(huán)節(jié),也是對課堂教學的延伸與發(fā)展,必須加強教學方式的創(chuàng)新與改革,選擇適當?shù)慕虒W方式全面培養(yǎng)學生理論與實踐能力。
三、CDIO理念下數(shù)據(jù)結(jié)構(gòu)教學模式創(chuàng)新的具體措施
根據(jù)上圖可知,在原有的數(shù)據(jù)結(jié)構(gòu)理論教學基礎(chǔ)上,通過開展一系列的設(shè)計實驗活動。這樣可以發(fā)揮學生的主觀能動性,并使學生對課堂的理論知識進行了全面的鞏固,對培養(yǎng)學生的思考能力、動手能力以及創(chuàng)新能力都有極其重要的意義。這種模式下的數(shù)據(jù)結(jié)構(gòu)教學具體措施為以下幾點:
傳統(tǒng)的數(shù)據(jù)結(jié)構(gòu)理論教學,教師進行刻板的講授,學生被動的接受,這樣學生的學習積極性不高,導致教學效果欠佳。根據(jù)這一問題,需要在進行理論教學過程中,以問題為導向,充分的發(fā)揮學生討論、交流的模式優(yōu)勢,增添教學課堂上的趣味性。在引入一個新的概念或理論前,用一個貼近生活的問題引入,這樣能引起學生的學習興趣,促使學生對知識點的掌握。如數(shù)據(jù)結(jié)構(gòu)中隊列理論的學習過程中,可以提出企業(yè)客服問題、銀行排隊問題等用計算機怎樣解決?這樣就能引發(fā)學生進行思考,潛意識就將學生帶入教學環(huán)境中。
在教學過程中,要應(yīng)該充分的利用教學實驗作為教學的輔助手段,并通過實踐教學進行鞏固。在數(shù)據(jù)結(jié)構(gòu)教學中,驗證性實驗往往恩能夠起到很好的教學實驗,學生通過自己參與對理論驗證實驗,增加了其對理論知識點的了解,并進行了相應(yīng)的實踐練習。如讓學生利用自己學到的相關(guān)理論知識進行樹與二叉樹實踐驗證,一般都是運用經(jīng)典算法進行。
在數(shù)據(jù)結(jié)構(gòu)教學中,很多理論都可以延伸出許許多多的知識點,所以要充分的培養(yǎng)學生舉一反三的能力,并通過大量的練習達到對技能熟練掌握的目的。這就要求教師在完成一個階段的理論教學后,給予學生足夠的時間進行對課堂所學知識進行總結(jié),并獨立完勝課程設(shè)計。
四、結(jié)束語
數(shù)據(jù)結(jié)構(gòu)教學是計算機以及計算機相關(guān)專業(yè)最基礎(chǔ)但又最核心的課程,并隨著計算機技術(shù)的普及向著其他學科領(lǐng)域發(fā)展。由于數(shù)據(jù)結(jié)構(gòu)的內(nèi)容專業(yè)性強、生澀難懂,傳統(tǒng)的教學方式往往達不到理想的教學效果。在CDIO理論背景下,給數(shù)據(jù)結(jié)構(gòu)教學帶來了很好的啟示,并指導數(shù)據(jù)結(jié)構(gòu)教學向著理論與實踐結(jié)合、實驗與教學結(jié)合、傳統(tǒng)與創(chuàng)新結(jié)合的方向發(fā)展,推動了數(shù)據(jù)結(jié)構(gòu)教學的發(fā)展。
參考文獻:
[1]肖媚燕,徐東風,周云華.基于CDIO理念的數(shù)據(jù)結(jié)構(gòu)教學模式創(chuàng)新與實踐[J].中國現(xiàn)代教育裝備,2012(05):89-90.
[2]歷威成.CDIO模式的教育理念以及實踐研究[J].四川師范大學碩士論文庫,2013(012):26-67.
[3]楊猛召,順澤元,劉文強. CDIO 理念在數(shù)據(jù)結(jié)構(gòu)課程中的探索與實踐[J].計算機教育,2010(12):125-126.
關(guān)鍵詞:數(shù)據(jù)結(jié)構(gòu);教學改革;教學手段
“數(shù)據(jù)結(jié)構(gòu)”是計算機科學中的一門綜合性專業(yè)基礎(chǔ)課,是信息科學的核心課程,是研究非數(shù)值計算的程序設(shè)計問題中計算機操作對象以及它們之間的關(guān)系和操作等的一門學科。主要是培養(yǎng)學生分析數(shù)據(jù)、組織數(shù)據(jù)的能力。我校的部分專業(yè),如資信、電子以及管理等專業(yè)都開設(shè)了數(shù)據(jù)結(jié)構(gòu)課程;部分沒有開設(shè)本課程的院系學生有時也主動旁聽數(shù)據(jù)結(jié)構(gòu)課程。由于數(shù)據(jù)結(jié)構(gòu)具有較強的理論性和實踐性,不同專業(yè)的學生特別是非計算機專業(yè)學生在教學過程中,無論是理論課程還是實踐過程確實存在一定的困難。筆者作為該課程的主講教師,結(jié)合自己在數(shù)據(jù)結(jié)構(gòu)教學中的一些體會,談?wù)剬δ壳敖谈牡恼J識。
1數(shù)據(jù)結(jié)構(gòu)教學中存在的問題
1.1前導課程“欠債”較多
“數(shù)據(jù)結(jié)構(gòu)”的前導基礎(chǔ)課程是“C語言程序設(shè)計”和“離散數(shù)學”。我校有多個院系開設(shè)C語言課程,不同院系所開設(shè)的“C語言程序設(shè)計”的教學內(nèi)容和教學要求并不完全一致。許多非計算機專業(yè)的學生一般在學習本課程之前并未經(jīng)過嚴格的程序設(shè)計基礎(chǔ)訓練,教師為了教學進度采取“填鴨”式的教學方式,導致學生對C語言理解不深,特別是指針、結(jié)構(gòu)體、聯(lián)合體以及函數(shù)等知識點,而這些又傳遞影響到數(shù)據(jù)結(jié)構(gòu)的教學。另外“離散數(shù)學”是學習“數(shù)據(jù)結(jié)構(gòu)”的基礎(chǔ)課程之一,但是由于課時不足,目前我校非計算機專業(yè)均未開設(shè)這門課。
1.2教學與專業(yè)背景脫節(jié)
“數(shù)據(jù)結(jié)構(gòu)”是一門理論性、抽象性很強的課程,教學中一定要將課程內(nèi)容與學生專業(yè)背景相融合,讓學生結(jié)合專業(yè)知識加深對理論的理解,同時也讓學生真正體會到數(shù)據(jù)結(jié)構(gòu)理論是為專業(yè)實踐服務(wù)的。但在目前的教學實踐中,教師只注重學生課堂理論知識的掌握,在面向不同的專業(yè)的學生時采用相同的教學案例,這使非計算機專業(yè)學生很難產(chǎn)生“共鳴”,教學效果自然達不到理想的目標。
1.3教學重點模糊
在目前的教學過程中,無論是計算機專業(yè)還是非計算機專業(yè)都沒有結(jié)合專業(yè)著重加強相應(yīng)的知識點的教學。如我校的地球物理與信息工程學院就包括了測井、勘探、攝影測量與遙感等學科方向,而數(shù)據(jù)處理在測量工作中是最重要的一個環(huán)節(jié)。對測量數(shù)據(jù)處理往往需要解大型的方程組,這涉及到稀疏線性方程的壓縮存儲問題,可以采用三元組順序表和十字鏈表的方式。因此在測井專業(yè)的教學內(nèi)容上,應(yīng)該將稀疏矩陣作為一個重點內(nèi)容,為后續(xù)專業(yè)知識的學習奠定一些基礎(chǔ)。
1.4教學內(nèi)容取舍不當
目前我校數(shù)據(jù)結(jié)構(gòu)的教學內(nèi)容基本相同,沒有根據(jù)專業(yè)具體情況注意內(nèi)容的取舍。計算機專業(yè)數(shù)據(jù)結(jié)構(gòu)為56課時,并有16課時的課程設(shè)計;其他非計算機專業(yè)的數(shù)據(jù)結(jié)構(gòu)課時為56課時,其中有8課時實驗課,但沒有數(shù)據(jù)結(jié)構(gòu)課程設(shè)計。在這種的情況下,讓學生系統(tǒng)地掌握數(shù)據(jù)結(jié)構(gòu)的基本內(nèi)容,在教學內(nèi)容的選擇上必須注意取舍,一些理論性太強,在專業(yè)內(nèi)應(yīng)用面不夠廣泛的內(nèi)容就可以舍棄,如廣義表、動態(tài)存儲管理以及外部排序等內(nèi)容。
2 “因?qū)I(yè)施教”的教學過程研究
2.1加強以數(shù)據(jù)結(jié)構(gòu)為核心的課程群建設(shè)
目前,國內(nèi)高校在數(shù)據(jù)結(jié)構(gòu)課程教學研究中的實驗教學方法、教學模式和教學內(nèi)容優(yōu)化等方面取得了一些實踐性成果,但在課程綜合體系建設(shè)方面仍然有一些不足[1]。非計算機專業(yè)教學時尤其要強調(diào)數(shù)據(jù)結(jié)構(gòu)與其他相關(guān)課程的緊密銜接,并將離散數(shù)學、數(shù)據(jù)庫、操作系統(tǒng)、圖形學、圖像處理等課程的主要知識點分散、穿插、融入到數(shù)據(jù)結(jié)構(gòu)的教學中,從而優(yōu)化整個課程體系結(jié)構(gòu)。
2.2面向不同專業(yè)學生的數(shù)據(jù)結(jié)構(gòu)教學方法研究
教學是以學生為主體,教師為主導的過程。教學方法是否適當,是否適合教學對象,是影響教學效果的關(guān)鍵部分。現(xiàn)有的主要教學方法包括[2]:啟發(fā)式教學法、任務(wù)驅(qū)動教學法、案例教學法以及討論式教學法等。每種方法只適合應(yīng)用于某些特定的情形,課題組根據(jù)不同的專業(yè)的教學內(nèi)容和教學對象,采取了不同的教學方法。例如,計算機專業(yè)、電子專業(yè)的學生采用啟發(fā)教學方法,教學中注意講解知識點時要盡力去打破學生頭腦中的“平靜”,激發(fā)學生思維活動,引導學生提出問題、分析問題和解決問題,歸納總結(jié)出一般規(guī)律或概念[3]。這種方法注重培養(yǎng)學生的科學思維方式,激發(fā)學生學習的積極性和創(chuàng)新精神。根據(jù)多年的教學經(jīng)驗,石油勘探專業(yè)適合于任務(wù)驅(qū)動教學法。勘探專業(yè)具有很強的專業(yè)背景,教師根據(jù)勘探專業(yè)教學大綱要求,精心設(shè)計地震數(shù)據(jù)處理實例任務(wù),將教材中每個章節(jié)的重點、難點內(nèi)容專業(yè)化、具體化、形象化、采用任務(wù)驅(qū)動法對數(shù)據(jù)結(jié)構(gòu)課程展開教學。管理專業(yè)以及測井專業(yè)采用案例教學法。圍繞教師所提供的測井系統(tǒng)軟件案例,學生在教師的引導下,積極進行閱讀、思考、分析、討論和實踐,從而達到深刻理解問題的原理和本質(zhì),提高分析問題和解決問題的能力,養(yǎng)成探究性的學習態(tài)度的目的。我校案例教學具體實施地點在多媒體教室,學生每人配備一臺機器,能夠完成實時網(wǎng)絡(luò)教學任務(wù)。
2.3面向不同專業(yè)學生的數(shù)據(jù)結(jié)構(gòu)教學內(nèi)容改革
針對不同院系制訂合理的數(shù)據(jù)結(jié)構(gòu)教學內(nèi)容,評估教學內(nèi)容的取舍方案,通過突出重點內(nèi)容,充實數(shù)據(jù)結(jié)構(gòu)的專業(yè)應(yīng)用環(huán)節(jié)。例如,測井專業(yè)的教學內(nèi)容除了稀疏矩陣的應(yīng)用外,由于測井信息通道不斷增加,傳輸?shù)臄?shù)據(jù)量越來越大,必須對采集的數(shù)據(jù)在傳輸前后分別進行壓縮。哈夫曼編碼在測井數(shù)據(jù)的無損壓縮方面發(fā)揮著重要作用。另外,在勘探專業(yè)地質(zhì)建模中,通常需要對大規(guī)模地震數(shù)據(jù)進行分析以發(fā)現(xiàn)地下潛在可能的油氣資源。地震數(shù)據(jù)的存儲,八叉樹是一種有效的方法。最短路徑在井間地震層析成像開發(fā)中發(fā)揮著重要作用。因此,在講解二叉樹的基礎(chǔ)內(nèi)容時,有必要擴展一些八叉樹的知識;在講解圖的應(yīng)用時要注意結(jié)合井間地震數(shù)據(jù)層析成像的實際例子。
2.4面向不同專業(yè)學生的數(shù)據(jù)結(jié)構(gòu)實踐教學改革
實踐教學是課堂理論教學的延伸和補充。培養(yǎng)并提高學生的實踐能力是數(shù)據(jù)結(jié)構(gòu)課程的基本目標。不同專業(yè)學生學習的側(cè)重點相同。例如,電子專業(yè)在學習計算機語言時側(cè)重硬件方面的應(yīng)用,缺乏計算機程序設(shè)計基礎(chǔ)訓練,軟件工程的概念不強;管理專業(yè)、測井專業(yè)以及勘探專業(yè)學生具有較好的軟件編程基礎(chǔ),但邏輯抽象能力特別是面向?qū)ο蠓治雠c設(shè)計能力欠缺。即便是同一專業(yè)的不同學生,他們的學習主動性和學習能力各不相同。如果采用“一刀切”式的尺度要求所有同學,往往起不到良好的教學效果。為了達到“因?qū)I(yè)施教”的目的,在進行“數(shù)據(jù)結(jié)構(gòu)”實踐教學時,課題組采用層次化設(shè)計思想,把實驗自下而上分為概念基礎(chǔ)層、應(yīng)用基礎(chǔ)層、應(yīng)用提高層和綜合層四個層次[4]。在進行試驗教學時,管理、電子專業(yè)同學以概念基礎(chǔ)層、應(yīng)用基礎(chǔ)層實驗為主,適當增加綜合層設(shè)計題目,以提高學生軟件工程的意識。如測井專業(yè)學生以應(yīng)用基礎(chǔ)層試驗為主,以測井工程中的具體問題為背景,強調(diào)理論與實踐的結(jié)合,使同學們體會到“數(shù)據(jù)結(jié)構(gòu)”是一門抽象理論與實踐緊密聯(lián)系、非常有趣味的課程,從而激發(fā)同學們的學習興趣;勘探專業(yè)學生實踐教學圍繞理論課的綜合層設(shè)計任務(wù)展開,各任務(wù)之間要耦合緊密,形成循序漸進的梯度,組成一個“任務(wù)鏈”。將同學們分為3~4人一組,確定小組成員的角色與任務(wù)。在這個過程中教師應(yīng)該提供必要的與勘探數(shù)據(jù)處理相關(guān)的學習資料、參考方法等,為學生完成任務(wù)提供資源支持,使學生透徹理解各種數(shù)據(jù)對象的特點,學會數(shù)據(jù)的組織方法和實現(xiàn)方法,選擇合適的數(shù)據(jù)結(jié)構(gòu),甚至改造基本的數(shù)據(jù)結(jié)構(gòu),并進一步培養(yǎng)學生良好的程序設(shè)計能力。
3結(jié)語
“數(shù)據(jù)結(jié)構(gòu)”這門課程在計算機科學與技術(shù)中的地位舉足輕重,也是石油相關(guān)專業(yè)的一門必修課程。教師在教學過程中,應(yīng)當積極探討,尋找有效的教學方法,充分調(diào)動學生的學習積極性,提高學生的學習興趣,才能使學生真正學好“數(shù)據(jù)結(jié)構(gòu)”。在非計算機專業(yè)學時少以及前序課程不足等因素的限制下,完成數(shù)據(jù)結(jié)構(gòu)課程的教學工作并取得滿意的教學效果,是一個具有挑戰(zhàn)性的課題。本文綜合實際教學經(jīng)驗在教學方法和實驗方法上提出了一些方法和原則,從我校多年的數(shù)據(jù)結(jié)構(gòu)教學實踐看,采取了這些措施和方法后,學生明顯感到數(shù)據(jù)結(jié)構(gòu)好學多了,教學效果得到了顯著提高。
參考文獻:
[1] 張銘,許卓群,楊冬青,等. 數(shù)據(jù)結(jié)構(gòu)課程的知識體系和教學實踐[J]. 計算機教育,2004(2):89-91.
[2] 蔡敏,鄭尚志,梁寶華.“數(shù)據(jù)結(jié)構(gòu)”課程教學改革之我見[J]. 計算機教育,2009(4):50-51.
[3] 劉紅梅. 啟發(fā)式教學法在數(shù)據(jù)結(jié)構(gòu)教學中的應(yīng)用[J]. 電腦知識與技術(shù),2009(3):661-662.
[4] 張玉華,周克蘭.“數(shù)據(jù)結(jié)構(gòu)”分層次實驗教學的探索與實踐[J]. 計算機教育,2009(3):108-110.
Research on Teaching Reform of Data Structure According to Specialty
LIAN Yuanfeng, WANG Xin, LI Li
(Department of Computer Science and Technology, China University of Petroleum, Beijing 102249, China)
關(guān)鍵詞:數(shù)據(jù)結(jié)構(gòu);教學方法;任務(wù)驅(qū)動;實踐教學
中圖分類號:TP311.12-4
數(shù)據(jù)結(jié)構(gòu)是計算機專業(yè)中介于數(shù)學、計算機硬件和計算機軟件三者之間的一門綜合性的專業(yè)基礎(chǔ)課。數(shù)據(jù)結(jié)構(gòu)的內(nèi)容不僅是程序設(shè)計進行總結(jié)和提高,而且是編譯原理、操作系統(tǒng)、數(shù)據(jù)庫系統(tǒng)等后續(xù)專業(yè)課提供基礎(chǔ),具有承上啟下的重要作用。本文針對數(shù)據(jù)結(jié)構(gòu)的課程特點和教學過程中存在的問題,探討教學實踐中如何針對產(chǎn)生的問題進行教學改革與實踐,以提高教學質(zhì)量和學生學習效果。
1 數(shù)據(jù)結(jié)構(gòu)教學中存在的問題與現(xiàn)狀
1.1 缺乏對數(shù)據(jù)結(jié)構(gòu)認識。正確深刻地理解數(shù)據(jù)結(jié)構(gòu)的涵義、作用以及數(shù)據(jù)結(jié)構(gòu)課程內(nèi)容體系是學習好數(shù)據(jù)結(jié)構(gòu)的前提和基礎(chǔ)。但是,一般情況學生只是大概了解了數(shù)據(jù)結(jié)構(gòu)的概念,在缺乏正確認識和深刻的理解的情況下,就開始直接學習課程內(nèi)容了,認為具體的內(nèi)容才是最重要的。對于為什么需要數(shù)據(jù)結(jié)構(gòu),課程中包括哪些內(nèi)容,從哪些角度和方面對數(shù)據(jù)結(jié)構(gòu)進行講解,原因是什么等等,都沒有認真研究和體會,導致數(shù)據(jù)結(jié)構(gòu)的學習效果和教學效果都不甚理想。如果這些問題都理解了,就從整體上認識了數(shù)據(jù)結(jié)構(gòu),那么學生學習,教師教授都會有的放矢。
1.2 C語言知識儲備與數(shù)據(jù)結(jié)構(gòu)的要求相脫節(jié)。數(shù)據(jù)結(jié)構(gòu)涉及指針、結(jié)構(gòu)體、類型定義、函數(shù)調(diào)用等相關(guān)知識,所以要求學生對這些內(nèi)容的掌握程度比較高高。但是在C語言教學中,一方面,這些內(nèi)容都是在課程的后半部分且學習起來難度較大,學生學習有畏難情緒,往往對這些內(nèi)容掌握不牢;另一方面,教師在授課過程中,對不同專業(yè)區(qū)別度不大,很少特別為后續(xù)課程的需要專門對相關(guān)知識做重點講授,這樣就影響后續(xù)課程的學習。最終導致學生掌握的C語言知識不能滿足學習數(shù)據(jù)結(jié)構(gòu)課程的要求。
1.3 缺乏獨立分析解決問題的能力。在課堂講課過程中,一般以教師講授課程內(nèi)容為主導,在講解課程內(nèi)容時,學生貌似都學會了,和老師的互動也非常積極,對老師提出的啟發(fā)式問題都能正確回答,認為課堂上老師所講的實例也都很簡單。但是,若在沒有老師的引領(lǐng)的情況下,讓學生單獨分析、解決一個例題,多數(shù)學生就很難掌握方向,不知從哪做起,缺乏獨立分析問題、解決問題的能力。
1.4 動手編程能力不強。相對于理論知識的學習,學生在上機實踐中遇到的問題更大。學生的程序設(shè)計基礎(chǔ)薄弱,缺乏足夠的系統(tǒng)訓練,對調(diào)試程序的方法不夠熟練,程序結(jié)構(gòu)設(shè)置不合理,代碼編寫可讀性差。即使一些學生看懂了教材上的算法,將其轉(zhuǎn)換成能運行的C語言程序,也存在一定的難度。這些都對學生的學習效果都有較大的影響,甚至會削減學習的積極性,進而產(chǎn)生畏難和厭學情緒,產(chǎn)生惡性循環(huán),有些學生干脆不學了。數(shù)據(jù)結(jié)構(gòu)中教學中出現(xiàn)的這些問題,嚴重影響了數(shù)據(jù)結(jié)構(gòu)課程的教與學,探討數(shù)據(jù)結(jié)構(gòu)課程教學方法,勢在必行。
2 教學探討與實施
2.1 正確認識“數(shù)據(jù)結(jié)構(gòu)”。認識數(shù)據(jù)結(jié)構(gòu)課程不僅僅讓學生了解其在專業(yè)中的地位和重要性,更要理解數(shù)據(jù)結(jié)構(gòu)課程本身的涵義和作用。所以在課程開始的時候開課之初,對課程緒論部分的講解不應(yīng)吝嗇時間,要把這部門內(nèi)容講清楚講透徹。數(shù)據(jù)結(jié)構(gòu)是一門研究非數(shù)值計算機的程序設(shè)計問題中計算機的操作對象以及他們之間關(guān)系的操作等的學科。從這個定義中,我們從中抽取對象、關(guān)系、操作等關(guān)鍵詞,再以設(shè)計實現(xiàn)一個家族家譜這樣一個比較形象的例子進行講解,進而引出如何存儲表示數(shù)據(jù)對象及關(guān)系和能對這個家族的族譜做哪些操作,這樣就引入了邏輯結(jié)構(gòu)和物理結(jié)構(gòu)的知識以及對數(shù)據(jù)結(jié)構(gòu)建立相應(yīng)操作的問題。這樣學生就基本能建立數(shù)據(jù)對象、數(shù)據(jù)關(guān)系、基本操作三元組的概念,并能深刻理解邏輯結(jié)構(gòu)與物理結(jié)構(gòu)的概念和關(guān)系。從總體上認識、把握、建立數(shù)據(jù)結(jié)構(gòu)的整體概念是學習好數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)。
2.2 針對數(shù)據(jù)結(jié)構(gòu)課程需要制定C語言課程教學大綱。因為不同專業(yè)學習C語言的要求不同,所以根據(jù)教學計劃制定科學合理的數(shù)據(jù)結(jié)構(gòu)前導課程的教學大綱、考試大綱能有效解決前導課程儲備知識不足的情況。根據(jù)教學計劃安排有數(shù)據(jù)結(jié)構(gòu)課程的專業(yè),其C語言課程與其他專業(yè)的課程不同,是單獨列出的。其教學大綱、考試大綱等教學文件由講授C語言和數(shù)據(jù)結(jié)構(gòu)的老師根據(jù)專業(yè)特點及后續(xù)課程的需要共同研究制定,并按學校的規(guī)定定期修訂。教學中只要按照制定好的教學大綱等相關(guān)文件規(guī)定執(zhí)行,就能滿足數(shù)據(jù)結(jié)構(gòu)課程的要求。這樣就從源頭上解決了C語言儲備知識不足的問題,避免了以往數(shù)據(jù)結(jié)構(gòu)課程教師需要與C語言課程教師溝通重點講解哪些內(nèi)容,但因只是個人行為而沒有學校相關(guān)文件規(guī)定的限制,所以不能達到較好的效果。通過制定專門的教學大綱,也無需要求數(shù)據(jù)結(jié)構(gòu)與C語言課程采用“一師制”,避免了人員變動等其他因素帶來的不確定性影響。
2.3 構(gòu)建整體教學內(nèi)容體系。數(shù)據(jù)結(jié)構(gòu)課程內(nèi)容抽象涉及很多概念和技術(shù),學生在學習的課程過程中總是感到知識沒有連貫性與整體性,難以對所學內(nèi)容融會貫通,對課程的知識缺少一個整體的把握。所以建立整體的知識框架體系對數(shù)據(jù)結(jié)構(gòu)的教學非常重要。數(shù)據(jù)結(jié)構(gòu)課程的內(nèi)容主要圍繞數(shù)據(jù)的邏輯結(jié)構(gòu)、數(shù)據(jù)在計算機中存儲的物理結(jié)構(gòu)以及對數(shù)據(jù)操作算法的實現(xiàn)及評價展開。數(shù)據(jù)的邏輯結(jié)構(gòu)根據(jù)數(shù)據(jù)對象之間關(guān)系的不同特性,分為線性結(jié)構(gòu)(一對一)、樹形結(jié)構(gòu)(一對多)、圖結(jié)構(gòu)(多對多);數(shù)據(jù)的物理存儲結(jié)構(gòu)按照數(shù)據(jù)對象之間關(guān)系的表示方法分為順序存儲結(jié)構(gòu)和非順序存儲結(jié)構(gòu)。在教學中引入抽象數(shù)據(jù)類型(ADT)觀點介紹數(shù)據(jù)結(jié)構(gòu)技術(shù),采用算法時空分析來判斷算法的好壞。在講授每一個數(shù)據(jù)結(jié)構(gòu)時,以抽象數(shù)據(jù)類型為主線,按照抽象數(shù)據(jù)類型的定義—抽象數(shù)據(jù)類型的設(shè)計—抽象數(shù)據(jù)類型的實現(xiàn)三個層次展開來討論,滲透并應(yīng)用模塊化的思想,在此基礎(chǔ)上介紹數(shù)據(jù)結(jié)構(gòu)的具體應(yīng)用。在教學過程中教師會反復強調(diào)課程的篇章結(jié)構(gòu)及其關(guān)系,數(shù)據(jù)結(jié)構(gòu)課程的章、節(jié)、目,是課程的“骨架”,反應(yīng)了課程內(nèi)容的邏輯關(guān)系,以此加強學生對課程的內(nèi)容體系的理解和掌握。
2.4 課堂上適當進行編程示范教學。教學過程中,我們發(fā)現(xiàn),學生能聽懂老師所講授解題的算法思路,但就是不知道如何用編程語言或算法表達出來。為解決這一問題,在教學中會在課堂上對有代表性的算法進行現(xiàn)場編程演示。課堂上教師先帶著學生先把算法總體思想寫出來,接下來選擇合適的物理存儲結(jié)構(gòu)利用C語言進行編程調(diào)試運行。這種方法可以讓學生掌握將解決問題的思路轉(zhuǎn)變成代碼的全過程,對學生編寫和調(diào)試程序起到很好的示范作用。在編程過程中,教師會邊寫代碼邊講解,引導學生積極獻計獻策一起來解決問題。由于現(xiàn)場編程比較耗費課時,對于比較長的程序,一般教師會在課前完成,留下解決問題的關(guān)鍵步驟在課堂與學生一起編程實現(xiàn)。通過這個過程學生能深刻理解緒論中算法的設(shè)計只取決于將要解決問題的數(shù)據(jù)對象之間的邏輯結(jié)構(gòu),而算法的實現(xiàn)則依賴于數(shù)據(jù)對象及其關(guān)系的存儲結(jié)構(gòu)。同時學生也能認識到用類C語言表示的算法與用C語言編寫的程序有哪些不同。有了現(xiàn)場的變成演示,在上機實踐中,學生直接將教材上的算法照抄到計算機內(nèi)運行的情況大大減少,理解了如何將抽象的數(shù)據(jù)結(jié)構(gòu)理論應(yīng)用到實際解決問題當中去。
2.5 任務(wù)驅(qū)動教學方法的應(yīng)用。所謂“任務(wù)驅(qū)動”就是在學習信息技術(shù)的過程中,學生在教師的幫助下,緊緊圍繞一個共同的任務(wù)活動中心,在強烈的問題動機的驅(qū)動下,通過對學習資源的積極主動應(yīng)用,進行自主探索和互動協(xié)作的學習,并在完成既定任務(wù)的同時,引導學生產(chǎn)生一種學習實踐活動。“任務(wù)驅(qū)動”是一種建立在建構(gòu)主義教學理論基礎(chǔ)上的教學法。它要求任務(wù)的目標性和教學情境的創(chuàng)建。使學生帶著真實的任務(wù)在探索中學習。在這個過程中,學生還會不斷地獲得成就感,可以更大地激發(fā)他們的求知欲望,逐步形成一個感知心智活動的良性循環(huán),從而培養(yǎng)出獨立探索、勇于開拓進取的自學能力。在教學中,我們應(yīng)用了任務(wù)驅(qū)動的教學方法并加以改進,達到了較好的教學效果。我們的做法是根據(jù)不同的場景“任務(wù)”不僅僅是學生的,也是老師的,或者是由老師和學生共同完成的。比如在講解第二章線性表的時候,我們就會根據(jù)課程內(nèi)容,設(shè)計完成一個共同的任務(wù):一元多項式的相加。為了完成這個任務(wù)師生共同找解決的方法,當然任務(wù)的完成需要老師的按既定的方向循序漸進地引導,先講解兩個集合合并到一起的算法,再講解將兩個按值非遞減有序排列的線性表如何合并,一元多項式相加的問題稍加改進就解決了。在完成一些比較大任務(wù)的過程中,我們會將其分解成若干個小任務(wù)讓學生獨立完成。當然,在教學實踐中也不是所有的內(nèi)容都可以通過任務(wù)驅(qū)動的方法實現(xiàn),不能執(zhí)行一刀切。授課教師應(yīng)根據(jù)課程內(nèi)容,學生的能力多方面考慮設(shè)計合適的任務(wù)。任務(wù)太大完不成,容易打消學生的積極性,任務(wù)太小不能起到應(yīng)有的作用。
2.6 系統(tǒng)化實踐教學。為了滿足不同層次學生對實驗題目難度,提升學生對實踐教學的興趣;我們針對不同學生的特點,制定分層次實踐教學的方法。按照實驗的難易程度分為驗證性實驗、設(shè)計性實驗、綜合性實驗三個層次。驗證性實驗根據(jù)數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)內(nèi)容設(shè)計,難度較低。目的是讓學生掌握基本數(shù)據(jù)結(jié)構(gòu)的特點和基本概念,同時掌握基本算法及應(yīng)用。在上機指導中授課教師將驗證性實驗作為主要的考核內(nèi)容,只有對基本算法的完全掌握,才能靈活應(yīng)用。設(shè)計性實驗是在驗證性實驗的基礎(chǔ)上增加難度和深度。根據(jù)特定的數(shù)據(jù)結(jié)構(gòu)有針性設(shè)計題目,必須使用某種數(shù)據(jù)結(jié)構(gòu)解決。授課教師會和學生一起分析問題,引導學生如何解決,如何設(shè)計數(shù)據(jù)結(jié)構(gòu),采用什么樣的算法,但是具體的數(shù)據(jù)結(jié)構(gòu)及算法編程實現(xiàn)需要學生獨立完成。綜合性實驗一般要求綜合使用多種數(shù)據(jù)結(jié)構(gòu)解決一個難度較大的現(xiàn)實問題;主要訓練學生綜合運用知識的能力、協(xié)作能力和創(chuàng)新能力。由于問題難度較大,我們采取將綜合性實驗安排在課程設(shè)計階段。
教學實踐證明,這種重點進行驗證性實驗,適當補充設(shè)計性實驗,通過課程設(shè)計完成綜合性實驗的分層次的實踐教學體系,符合學生的認知規(guī)律和特點,在實踐教學中也取得了較好的教學效果。
3 總結(jié)
數(shù)據(jù)結(jié)構(gòu)課程在計算機專業(yè)的課程體系中具有非常重要的作用。本文通過對數(shù)據(jù)結(jié)構(gòu)課程教學中存在的問題及現(xiàn)狀進行深刻剖析,結(jié)合教學經(jīng)驗有針對性地提出了相應(yīng)的解決方法,從問題的源頭上避免了這些問題的發(fā)生。教學實踐表明,通過在教學中采用以上教學方法,提高了數(shù)據(jù)結(jié)構(gòu)的教學質(zhì)量,并取得了良好的教學效果。
參考文獻:
[1]嚴蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu)(C語言版)[M].清華大學出版社,1997.
[2]余建國,劉雙紅.基于任務(wù)驅(qū)動的協(xié)同教學模式在程序設(shè)計類課程中的研究與實踐[J].科技信息,2009,27:104,83.
[3]陳紅琳.《數(shù)據(jù)結(jié)構(gòu)》課程建設(shè)的探討與實踐[J].現(xiàn)代計算機,2012,10:45-47.
論文摘要:在建構(gòu)式教育理論的指導下,以就業(yè)需求為目標,針對數(shù)據(jù)結(jié)構(gòu)教學中教與學目標不明、學習信心和動力不足、編程基礎(chǔ)薄弱等問題,提出建構(gòu)式的數(shù)據(jù)結(jié)構(gòu)教學方法,在實際教學中取得較好的教學效果,這些措施也可作為其他計算機專業(yè)課程教學的參考。
近年來,在產(chǎn)業(yè)界急需大量軟件開發(fā)人員的情況下,普通本科院校計算機專業(yè)學生的就業(yè)率持續(xù)走低。網(wǎng)絡(luò)、報紙等媒體對計算機本科教育現(xiàn)狀多有批評,甚至出現(xiàn)了大學不如培訓公司的極端觀點,嚴重影響了學生對專業(yè)課程的學習興趣、動力和信心。數(shù)據(jù)結(jié)構(gòu)是計算機專業(yè)的核心基礎(chǔ)課程,上承程序設(shè)計語言、離散數(shù)學,下啟操作系統(tǒng)、編譯原理等課程,其重要性不言而喻。一方面,數(shù)據(jù)結(jié)構(gòu)學科具有難度大、抽象層次高、概念繁雜等特點,學生很難掌握,更不要說將抽象理論與就業(yè)實踐需求相結(jié)合。另一方面,國內(nèi)主流數(shù)據(jù)結(jié)構(gòu)教材和相應(yīng)的傳統(tǒng)教學模式側(cè)重于培養(yǎng)學生的計算機學科基礎(chǔ)理論素養(yǎng),而將如何通過組織數(shù)據(jù)結(jié)構(gòu)教學活動積極推動就業(yè)的問題留給了任課教師[1]。這造成了學生學習數(shù)據(jù)結(jié)構(gòu)的目標不明、信心和動力不足。筆者面向就業(yè)需要明確了數(shù)據(jù)結(jié)構(gòu)的兩大主要教學目標,并在實際教學過程中實踐建構(gòu)式教育理論,嘗試解決學生對專業(yè)認識不清、學習興趣不足、編程基礎(chǔ)薄弱等問題。一些做法得到了學生的認可和配合,成功地激發(fā)了學生的學習主動性、在一定程度上培育了學生的創(chuàng)新精神。
1面向就業(yè)需求的數(shù)據(jù)結(jié)構(gòu)教學目標
教育要服務(wù)于社會生產(chǎn)需求。數(shù)據(jù)結(jié)構(gòu)教學也必須緊扣這一根本目標。本節(jié)從滿足就業(yè)需要的角度闡明了數(shù)據(jù)結(jié)構(gòu)教學的兩個主要目標:
1) 培養(yǎng)超越具體程序設(shè)計語言技巧的編程技術(shù)。
現(xiàn)階段是一個傳統(tǒng)的生產(chǎn)生活方式迅速向電子化、信息化轉(zhuǎn)變的時期。人們需要開發(fā)和維護更多、規(guī)模更大的計算機系統(tǒng)來滿足生產(chǎn)和生活的需要[2]。這就決定了具有熟練編程技術(shù)的程序員在很長時期內(nèi)都將受到產(chǎn)業(yè)界的青睞。大學對學生編程技術(shù)的培養(yǎng)始于程序設(shè)計語言的教學,如c語言,java語言等。但是現(xiàn)今編程語言繁多,各種新概念層出不窮,常常出現(xiàn)學生無所適從或者質(zhì)疑某門語言課程已經(jīng)過時無用的現(xiàn)象。甚至很多教師也在爭論講授何種編程語言。筆者看來掌握編程技術(shù)(而不僅僅是語言),回歸編程的本質(zhì)問題更加重要,無謂地追趕時髦不可取。作為編程語言課程的后續(xù),數(shù)據(jù)結(jié)構(gòu)教學的重要目標就是幫助學生理解編程的本質(zhì)、鍛煉編程技術(shù)以及學習提高編程技術(shù)的方法。
2) 培養(yǎng)圍繞復用的軟件開發(fā)方式。
隨著軟件規(guī)模的日益增大,軟件開發(fā)模式逐漸從“從無到有”的模式過渡到“從有到有”的模式,即復用現(xiàn)有的豐富的軟件資產(chǎn),開發(fā)新的應(yīng)用系統(tǒng)。事實上,復用的思想已經(jīng)被廣泛的用于軟件開發(fā)實踐之中,從各種各樣的程序庫、軟件開發(fā)包、軟件構(gòu)件、web服務(wù)等各種可復用資產(chǎn)已經(jīng)簡化了軟件開發(fā)的難度、提高了軟件開發(fā)的效率也極大地改變了軟件開發(fā)的模式。數(shù)據(jù)結(jié)構(gòu)學科本身就是對軟件復用思想的一種實踐,它通過總結(jié)大量軟件系統(tǒng)中反復出現(xiàn)的數(shù)據(jù)結(jié)構(gòu)(如表、樹、圖、集合等),定義和實現(xiàn)處理這些數(shù)據(jù)結(jié)構(gòu)的基本操作,最終達到能夠在不同項目開發(fā)中反復應(yīng)用的目的。這些基本數(shù)據(jù)結(jié)構(gòu)和算法已經(jīng)被實現(xiàn)為可復用的產(chǎn)品隨著程序設(shè)計語言,如c++ stl、c# collections, java collections等,并得到了廣泛的使用。因此,數(shù)據(jù)結(jié)構(gòu)教學的另一個重要目標就是引導學生習慣圍繞復用的軟件開發(fā)方式,能夠使用和定制已有的數(shù)據(jù)結(jié)構(gòu)和算法庫。
其他傳統(tǒng)的數(shù)據(jù)結(jié)構(gòu)教學目標,如培養(yǎng)學生面向?qū)嶋H問題進行算法設(shè)計和分析的能力,培養(yǎng)學生計算機學科的基本理論素養(yǎng)和思維方式等也非常重要。但普通本科院校學生對理論內(nèi)容的接受能力以及將理論和現(xiàn)實就業(yè)需求相聯(lián)系的能力相對較弱且教學時間有限[3],筆者認為重點突破本節(jié)給出的兩個更具體、更可達的教學目標,并在實現(xiàn)這種具體教學目標的過程中潛移默化地培育學生的計算思維和理論素質(zhì),將會取得更佳的效果。
2建構(gòu)式數(shù)據(jù)結(jié)構(gòu)教學
教學理論研究以及教學實踐反饋均表明,學生主動學習的效果遠較被動地接受老師灌輸?shù)男Ч玫亩唷R虼耍瑸閷崿F(xiàn)上述教學目標,在建構(gòu)式教育理論的指導下,筆者探索并采用了一系列建構(gòu)式教學措施,激發(fā)學生的主動性和興趣,取得了較好效果。
建構(gòu)主義認為,學習并非學習者對教師所授知識的被動接受,而是學習者以自身已有知識和經(jīng)驗為基礎(chǔ)的主動建構(gòu)過程[4]。知識不僅是通過教師傳授而得到,更是學習者在一定的情境中,利用必要的學習資料,通過同化新知識、順化自身知識結(jié)構(gòu)的方式而獲得。建構(gòu)主義提倡在教師指導下的、以學習者為中心的學習,也就是說,既強調(diào)學習者的認知主體作用,又不忽視教師的指導作用,教師是意義建構(gòu)的幫助者、促進者,而不僅僅是知識的傳授者與灌輸者。學生是信息加工的主體、是意義的主動建構(gòu)者,而不僅僅是外部刺激的被動接受者和被灌輸?shù)膶ο蟆O旅鎻睦碚摻虒W和實踐教學兩個方面介紹我們采用的一些教學措施。
2.1理論教學措施
課堂教學是數(shù)據(jù)結(jié)構(gòu)教學活動的主要部分,充分利用課堂教學時間,激發(fā)學生學習數(shù)據(jù)結(jié)構(gòu)的興趣和信心,幫助學生建立學習數(shù)據(jù)結(jié)構(gòu)的環(huán)節(jié)非常重要。我們采用了如下措施:
1) 組織小型討論。
好的開始是成功的一半,好的課堂教學須在上課之初就抓住學生的注意力,讓學生帶著輕松、愉快的心情聽課。我的做法是在課堂的前5分鐘,提出一個學生感興趣的話題,組織若干個有3~5位同學參與的小型討論。到一個學期結(jié)束時,每位同學都有至少一次的發(fā)言機會。討論的主題可以靈活設(shè)置,如時事、技術(shù)、社會熱點等。有時,課堂中間學生比較疲憊、注意力下降的時候,也可以穿插一點討論,改善課堂環(huán)境。大多數(shù)學生非常喜歡這種討論活動,積極參與其中,成為課堂的一部分,從被動上課轉(zhuǎn)變?yōu)橄矚g上課。
2) 重建理論知識所針對的問題。
國內(nèi)的經(jīng)典數(shù)據(jù)結(jié)構(gòu)教材側(cè)重嚴謹?shù)睦碚摚^少討論各種概念、算法出現(xiàn)的背景以及探討的問題是否仍然具有現(xiàn)實價值。而回答這些問題能夠幫助學生重建理論知識所針對的問題原型,重現(xiàn)解決方案的提出、發(fā)展乃至最終成熟的整個過程,更有助于培養(yǎng)學生解決實際問題的能力,養(yǎng)成批判性、創(chuàng)新性思考的習慣。眾所周知,關(guān)于樹的存儲方法很多,有雙親表示法,孩子表示法和二叉鏈表表示法[5],其中以樹的二叉鏈表表示法使用最廣,但其他存儲方法也有其適合的應(yīng)用。例如,在利用樹表示各個集合,求集合中的等價類時,雙親表示法更為合適。每一個集合都用樹的雙親表示法存儲時,并設(shè)樹的根結(jié)點的值為集合名,集合中的每個成員都對應(yīng)一個結(jié)點,這樣很容易找到一個元素所屬的子集(順著雙親指針找樹的根結(jié)點)。
3) 組織“我來講”活動。
數(shù)據(jù)結(jié)構(gòu)涉及很多抽象的概念和算法,初學者很難理解。而教師則對理論內(nèi)容比較精熟,常常傾向于從理論的角度逐步遞進、展開講解,這就增加了學生的學習難度。教師和學生在教學語言上的鴻溝是影響教學效果的一個重要障礙。教師當然可將抽象的理論概念與生活中更形象的概念進行類比,幫助學生理解,也可以將復雜的算法過程用多媒體動畫模擬出來,直觀地展示給學生,幫助學生掌握。但一方面,根據(jù)建構(gòu)主義理論,教師和學生的知識背景不同,由教師設(shè)計概念類比語境和算法模擬動畫實際上仍然是基于教師的知識結(jié)構(gòu)對知識點進行的同化和順化,而不是對學生知識體系的直接建構(gòu)。另一方面,教師的經(jīng)驗和智慧有其局限性,未必總能夠找到最適合的類比語境和動畫模擬。為此,筆者采用了充分發(fā)揮學生智慧的方法,組織“我來講”活動,要求學生通過設(shè)計算法的動畫模擬,創(chuàng)建概念的類比語境等方式進行學習,并隨機選擇學生走上講臺對抽象理論概念和復雜算法進行說明。這樣不但能夠調(diào)動學生思考問題,還能幫助那些無法完成自我知識體系建構(gòu)的同學從學生的視角去理解同一個問題。例如,對于n維數(shù)組是元素為n-1維數(shù)組構(gòu)成的線性表這一遞歸的類型定義,可采用符號推理的方式,培養(yǎng)學生的理論素養(yǎng),而同時可鼓勵學生根據(jù)自己的理解將抽象理論具體化,建立幫助理解和記憶的現(xiàn)實語境。
2.2實踐教學措施
數(shù)據(jù)結(jié)構(gòu)是幫助具有基本編程語言基礎(chǔ)的學生錘煉編程技術(shù)的關(guān)鍵課程。它揭示了程序設(shè)計的基本面,即如何處理相互之間存在一種或多種數(shù)據(jù)關(guān)系的數(shù)據(jù)元素所構(gòu)成的集合、如何設(shè)計算法并分析算法的優(yōu)劣。若沒有相應(yīng)的配套實驗指導學生如何將理論應(yīng)用于實際問題,只是泛泛而談、紙上談兵,學生容易迷失在數(shù)據(jù)結(jié)構(gòu)的一連串復雜概念和算法之中,而不知道學習數(shù)據(jù)結(jié)構(gòu)的意義何在。為實現(xiàn)教學目標,筆者鎖定實驗內(nèi)容設(shè)置和實驗考核等兩個關(guān)鍵環(huán)節(jié),實踐了如下措施,取得了較好效果。
2.2.1實驗內(nèi)容設(shè)置
實驗內(nèi)容設(shè)置是進行實踐教學的最重要部分。從覆蓋知識點的角度看,實驗內(nèi)容須面向數(shù)據(jù)結(jié)構(gòu)教學目標,即實驗內(nèi)容須能夠鍛煉學生的編程技巧,如算法設(shè)計、調(diào)試、測試以及調(diào)優(yōu)等能力,還能夠讓學生體會到圍繞復用開展軟件開發(fā)的威力以及思路。從覆蓋教育對象的角度來看,實驗內(nèi)容須面向大多數(shù)同學并充分考慮優(yōu)秀同學,即實驗內(nèi)容須劃分不同的層次,讓大多數(shù)學生能夠很容易入手,并讓有能力、有余力的學生能夠不斷地深入,直至形成綜合型課程設(shè)計。
基于以上考慮,并借鑒同行經(jīng)驗,筆者開展三個層次的實驗教學活動,一是要求所有學生都完成的實驗內(nèi)容,要求學生采用不同的數(shù)據(jù)結(jié)構(gòu)實現(xiàn)同一個問題并進行對比分析,例如,分別使用靜態(tài)數(shù)組和動態(tài)分配的連續(xù)內(nèi)存區(qū)實現(xiàn)順序表,使用整型、字符型數(shù)組或者鏈表實現(xiàn)長整數(shù)的乘法,使用帶頭結(jié)點或不帶頭結(jié)點的循環(huán)鏈表模擬約瑟夫環(huán)等;二是組織程序設(shè)計競賽,讓部分學有余力的同學能夠在算法設(shè)計、程序?qū)崿F(xiàn)和調(diào)試、優(yōu)化等方面得到鍛煉和提高;三是設(shè)計綜合型課程設(shè)計鍛煉學生解決問題的綜合能力,并通過適當分組,培養(yǎng)學生團隊協(xié)作精神和能力,鍛煉學生解決問題的綜合能力的目標,最終達到以點帶面全面提高學生能力的目的。
2.2.2實驗考核手段
考核手段在教學環(huán)節(jié)中至關(guān)重要。考核手段是學生學習和鍛煉自身能力的風向標。為保證每位同學都能積極完成實驗并有所收獲,避免抄襲和敷衍的現(xiàn)象,筆者采取了綜合型的考核手段。其一,提交實驗成果,即程序及其運行結(jié)果;其二,記錄實驗過程、分析實驗結(jié)果以及總結(jié)實驗得失的實驗報告,對實驗報告進行選優(yōu)講評,培養(yǎng)學生撰寫科學實驗報告的能力;其三,每位同學必須面向教師講解自己編寫的程序,包括主要思路和細節(jié)性語法,優(yōu)秀的同學可走上講臺宣講自己的實驗方案和程序設(shè)計技巧。這就基本杜絕了學生相互之間抄襲程序和實驗報告的現(xiàn)象,使得學生真正能夠思考問題,并盡力動手完成實驗。綜合上述三種手段的綜合型考核方法既能夠達到督促大部分同學完成實驗、鍛煉動手能力目的,又能夠達到培養(yǎng)優(yōu)秀同學的目的。特別地,優(yōu)秀同學宣講活動能夠使學生觀摩到如何從學生的視角從無到有的解決問題的過程,這能夠培養(yǎng)學生解決實際問題的信心并激發(fā)其學習積極性。
3應(yīng)用中遇到的問題
建構(gòu)式教學模式在應(yīng)用和推廣過程中遇到的主要問題來自三個方面。其一,目前學生的課業(yè)負擔較重,習慣于被動“填鴨”而不習慣于主動“求索”,這是推動和開展建構(gòu)式教學模式的主要障礙。其二,建構(gòu)式教學活動,需要師生的密切交流,但現(xiàn)有師資不足難以滿足實際需求。一個可能的解決方法是綜合多門課程和多個老師,建構(gòu)整體的知識框架和學習體系,避免課程教學中的重復勞動,提高師資的利用率。另一個可能的解決方法是利用互聯(lián)網(wǎng)技術(shù),建立在線教學園地。其三,建構(gòu)式教學模式仍然處于探索階段,各學科缺乏建構(gòu)式教學素材。從筆者在實踐教學的體驗來看,應(yīng)盡量從學生的學習背景和能力成長規(guī)律出發(fā)而不僅僅是從學科背景出發(fā),為學生建構(gòu)知識體系設(shè)計更平滑的路線。
4結(jié)語
筆者提出將“培養(yǎng)超越具體程序設(shè)計語言技巧的編程技術(shù)”和“培養(yǎng)圍繞復用的軟件開發(fā)方式”作為普通本科院校的數(shù)據(jù)結(jié)構(gòu)教學目標,在建構(gòu)式教育理論的指導下,設(shè)計并實踐了一系列建構(gòu)式教學措施,分析了應(yīng)用建構(gòu)式教學模式所遇到的一些問題。
未來將開展兩個方面的工作。一是通過問卷調(diào)查、統(tǒng)計分析等手段定量地分析建構(gòu)式教學方法的實際效果;二是創(chuàng)造和積累建構(gòu)式教學素材,如研究數(shù)據(jù)結(jié)構(gòu)課程設(shè)計過程中不同類型學生的知識建構(gòu)路線,挖掘并推廣其中優(yōu)秀的知識建構(gòu)方法。
參考文獻:
[1] 教育部高等學校計算機科學與技術(shù)教學指導委員會. 高等學校計算機科學與技術(shù)專業(yè)發(fā)展戰(zhàn)略研究報告暨專業(yè)規(guī)范(試行)[m]. 北京:高等教育出版社,2006:8-101.
[2] 蔡敏,鄭尚志,梁寶華.“數(shù)據(jù)結(jié)構(gòu)”課程教學改革之我見[j]. 計算機教育,2009(4):50-51.
[3] 揭安全,李云清,楊慶紅,等. 項目教學模式指導的“數(shù)據(jù)結(jié)構(gòu)與算法”教學改革[j]. 計算機教育,2008(22):21-23.
摘要:本文提出了以解決實際問題為目的的立體教學模式,探討了計算機應(yīng)用課程的教學模式,研究了激勵學生提高應(yīng)用能力的方法,研究了與教學模式相配套的教材編寫模式。
關(guān)鍵詞:教學模式;計算機應(yīng)用;主體化;網(wǎng)絡(luò)化
中圖分類號:G642
文獻標識碼:B
為了快速提高學生通過計算機解決實際問題的能力,我們提出以解決實際問題為目的的立體教學模式,教學從要解決的實際問題入手,讓學生知道本課程要解決的問題,然后將這個問題進行分解,最后圍繞解決每個子問題,將要講的理論和實踐知識展開。這樣所講內(nèi)容由解決實際問題連接到一起,構(gòu)成一個立體結(jié)構(gòu),所有子問題解決后,則應(yīng)用問題也隨之解決。這樣一門課完成后,學生不僅學會理論知識,更重要的是學會如何解決實驗問題。
本課題的研究劃分了以下三個層次:應(yīng)用課程的教學模式;研究激勵學生提高應(yīng)用能力的方法;研究與教學模式相配套的教材編寫模式。
1 應(yīng)用教學模式的探索
這一層次就是探索以“解決實際問題為目標的立體化”教學模式,按照新的計算機應(yīng)用課程教學模式思想組織教學試驗。這就要求老師在講課開始時對本課程的應(yīng)用作闡述并布置課程設(shè)計題目,鼓勵學生帶著問題學習,通過不斷的探索性學習,逐漸完成課程設(shè)計。在期中左右開始規(guī)劃,期末交設(shè)計程序及文檔。為此,我們專門印制了《實驗報告》、《課程設(shè)計》、教學任務(wù)書等手冊。每門課要求至少完成五個實驗報告、一份課程設(shè)計。要求每位專業(yè)教師上課前制定教學任務(wù)書并上報系教學委員會審批,教學任務(wù)書含學生學習后達到的能力要求、教學進度、實驗報告、課程設(shè)計項目、作業(yè)次數(shù)、參考資料、網(wǎng)站建設(shè)計劃等,并作為教學檢查的依據(jù),納入教師期末酬金量化。
2 專業(yè)計劃的目標控制體系建設(shè)
專業(yè)教學計劃以培養(yǎng)應(yīng)用性人才為目標,制定了目標控制體系的新教學方案,任課教師教學任務(wù)、學生的學習目標更加明確化。原來教學計劃的原則是最終控制,結(jié)果難以達到目標。
體例:(1) **專業(yè)總目標;(2) 就業(yè)范圍;(3) 第一學年目標;基本技能;基本語言;基礎(chǔ)知識;(4) 第一學期:達到目標;安排課程;考研主干課;按如此模式編制教學計劃,將學生學習最終能力目標分解到每個學期,通過過程控制來達到總目標,使教學計劃更科學、更有可操作性。
3 延伸課堂教學,積極探索立體化、網(wǎng)絡(luò)化的教學模式
啟動系級精品課程建設(shè),并予以獎勵。要求各專業(yè)課基本實現(xiàn)課件上網(wǎng)、作業(yè)上傳、輔導答疑等功能,并鼓勵老師積極申報精品課程。分兩個階段,第一階段:2006年3月開始以“數(shù)據(jù)結(jié)構(gòu)”、“C語言”、“網(wǎng)頁制作”、“操作系統(tǒng)”、“計算機電路基礎(chǔ)”五門專業(yè)課為前導制定了課程建設(shè)研發(fā)團隊,并積極申報院級精品課程。第二階段:2007年1月起所有專業(yè)課開始系級精品課程網(wǎng)站建設(shè),取得較好的效果。
2005年“Delphi程序設(shè)計”被評為院級精品課程。2006年“數(shù)據(jù)結(jié)構(gòu)”、“計算機電路基礎(chǔ)”被評為院級優(yōu)質(zhì)課程。2007年有“數(shù)據(jù)結(jié)構(gòu)”、“計算機網(wǎng)絡(luò)實訓”、“網(wǎng)頁制作技術(shù)”、“計算機組裝與維護”、“C語言程序設(shè)計”、“計算機組成原理”共六門課積極申報院級精品課程。其中“數(shù)據(jù)結(jié)構(gòu)”被評為院級精品課程,“網(wǎng)頁制作技術(shù)”被評為院級優(yōu)質(zhì)課程。
4進行考試方式的改革探索
加強電子試題庫建設(shè),改革應(yīng)用性課程考試方式。向教務(wù)處申請對Flash、Photoshop、網(wǎng)頁設(shè)計及五筆字型應(yīng)用等四門技能型課程由原來的期末筆試改為學生自主式全自動網(wǎng)上測試,并要求計算機科學系所有學生(含已經(jīng)筆試合格的學生)畢業(yè)前必須通過該測試。該申請被教務(wù)處批準,2006~2007學年度第一學期對網(wǎng)頁設(shè)計及五筆字型兩門課試點,受到學生歡迎,效果較好。針對考試中的問題,投入了更多的精力,考試系統(tǒng)進一步改進,2007~2008學年第一學期有計算機應(yīng)用等五門課程進行了機考,擴大了考試科目,進一步擴充了題庫,提高了防作弊能力。
5學生學習競賽的組織與發(fā)動
為了切實提高學生的動手能力,積極組織學生參加各種競賽,特成立了計算機科學系競賽組,系主任任組長,我任副組長,下設(shè)五個競賽小組。2005~2007年,除組織計算機科學系網(wǎng)頁設(shè)計大賽、計算機應(yīng)用技能大賽、五筆字型大賽、Flash設(shè)計大賽、圖像處理大賽等,積極參加棗莊學院組織的各類賽事外,共組織學生參加省/國家競賽5次,項目如下:ACM/ICPC程序設(shè)計競賽、全國數(shù)學建模、齊魯大學生軟件設(shè)計大賽、正保教育杯第三屆全國ITAT教育工程職業(yè)技能大賽、山東省電子產(chǎn)品設(shè)計大賽。在這些競賽中學生均取得較好成績,極大地鼓舞、帶動了學生的學習熱情。如下表所示:
6計算機應(yīng)用課程教材編寫模式的探索
按照以解決實際問題為目標教學模式,探索了計算機應(yīng)用課程教材的編寫,提出應(yīng)用課程教材編寫改革的方向為“立體結(jié)構(gòu)知識層次分布式教材模式”。以解決實際問題為目標的立體化教學設(shè)計教材章節(jié),教材第一章提出能力要求,并給出總體實現(xiàn)案例設(shè)計,每一章設(shè)有能力達標要求并圍繞整本教材的案例組織教學內(nèi)容,教學方式不再呈現(xiàn)傳統(tǒng)從一個知識點到另一個點的線性結(jié)構(gòu)的教學模式。基于新教改思想,我們正按照此模式編寫計算機網(wǎng)絡(luò)實訓、數(shù)據(jù)結(jié)構(gòu)等教材。
7 結(jié)束語
關(guān)鍵詞:指針;C語言;實驗;數(shù)據(jù)結(jié)構(gòu)
中圖分類號:G642 文獻標志碼:A 文章編號:1674-9324(2014)04-0110-03
一、引言
《數(shù)據(jù)結(jié)構(gòu)》作為實踐性很強的計算機專業(yè)的基礎(chǔ)課,教學中必然離不開實踐。針對《數(shù)據(jù)結(jié)構(gòu)》的課程設(shè)計實踐不僅可以幫助學生鞏固和加深對課程內(nèi)容的理解,更重要的是可以進一步鍛煉程序設(shè)計的技能[1]。C語言是數(shù)據(jù)結(jié)構(gòu)實驗中重要的程序設(shè)計語言,指針是C語言中一個非常重要的概念。在C語言中,指針的應(yīng)用非常靈活,對于程序設(shè)計初學者來說比較難掌握,更談不上靈活合理的應(yīng)用。《數(shù)據(jù)結(jié)構(gòu)》中(注:文中的討論圍繞嚴蔚敏老師的《數(shù)據(jù)結(jié)構(gòu)》C語言版教材[2]),為了實現(xiàn)數(shù)據(jù)的存儲結(jié)構(gòu),指針在線性表、樹和圖的存儲中都有重要的應(yīng)用,可以說,數(shù)據(jù)結(jié)構(gòu)的實驗繞不開指針的應(yīng)用,如果學生掌握不好指針,是無法進行數(shù)據(jù)結(jié)構(gòu)實驗學習的。
教學中注意到,學生的主要問題是對指針的本質(zhì)缺乏清晰的理解,知其然不知其所以然,導致在應(yīng)用時只會依葫蘆畫瓢,不會靈活應(yīng)用。針對學生理解和應(yīng)用中的難點問題,剖析了指針的本質(zhì),以此為基礎(chǔ),討論了指針的使用、指針和數(shù)組及指向函數(shù)的指針幾個問題,希望能夠加深學生對指針的理解,并在數(shù)據(jù)結(jié)構(gòu)的實驗中靈活應(yīng)用。
二、指針
1.變量和數(shù)據(jù)類型。變量和數(shù)據(jù)類型是C語言中的基本概念,是否能理解它們的本質(zhì),對后續(xù)指針概念的理解非常重要。但是,由于它們是最基本的東西,教師和學生都認為很好理解,不是很重視。因此,學生對它們的理解往往流于表面,產(chǎn)生模糊的認識,如:變量是會變化的量;對變量名和變量的關(guān)系,變量和數(shù)據(jù)類型的關(guān)系等認識不清。
對變量的理解應(yīng)該強調(diào)變量最本質(zhì)的意義:內(nèi)存中的一塊存儲空間,即所謂變量就是一塊存儲空間,如圖1所示。
圍繞對變量本質(zhì)的理解應(yīng)該強調(diào)幾點:①一塊空間(變量)具有兩個特征,一是這塊空間在內(nèi)存中的起始地址(計算機內(nèi)部16進制地址表示不便,本文中用3位10進制數(shù)示意),表示這塊空間的開始,二是從起始地址開始的空間大小,這兩個特征一起確定了一個變量;②作為內(nèi)存的一塊存儲空間,自然可以存儲不同的值,會變化;③變量的聲明是提出分配存儲空間的要求,沒有分配空間,當然不能存值,不能使用;④為了在程序中方便使用變量,變量可以取一個名字,即變量名。
變量都有數(shù)據(jù)類型,從存儲空間分配的角度看,數(shù)據(jù)類型的本質(zhì)是對分配空間大小的約定。要給一個變量分配存儲空間,涉及兩個東西:分在那,分多大。分在那由當前內(nèi)存情況確定,而分多大則由變量所屬的數(shù)據(jù)類型確定,如int型就分4個字節(jié)大小。
2.指針的概念。指針是C語言中的派生數(shù)據(jù)類型,如int *p,聲明了一個由整型派生的指針變量p,如圖2所示。學生在為什么要用指針、指針變量和原類型之間是什么關(guān)系等問題上往往產(chǎn)生混淆,不能夠清晰理解。
對指針概念的理解應(yīng)該強調(diào)幾點:①指針變量也是變量,聲明了指針變量后同樣需要給該變量分配一塊存儲空間,只是該空間存儲的內(nèi)容有點特殊,是一個地址。②獲取數(shù)據(jù)存儲空間的基本方式有兩種,一是在程序的數(shù)據(jù)說明部分進行聲明,這樣,程序執(zhí)行時存儲空間已經(jīng)預(yù)先分配,并建立了變量名和存儲空間之間的映射,可稱為靜態(tài)分配。二是在程序執(zhí)行的過程中,通過申請(如malloc函數(shù))獲得存儲空間,可稱為動態(tài)分配,這樣的空間無法給予變量名,存取這樣空間的唯一辦法只能通過該空間的地址,即指向該地址的指針來存取。如圖2中圈1所示,malloc函數(shù)申請了一塊大小為4個字節(jié)的空間,空間起始地址是300,為了在后續(xù)程序中使用這塊存儲空間,該地址賦值給指向整型的指針p,p中存儲的內(nèi)容變?yōu)?00。③應(yīng)該強調(diào),作為派生類型,指針變量也是有數(shù)據(jù)類型的,其數(shù)據(jù)類型是指針變量所指向的存儲空間大小的約定。如圖2中定義的p是一個指向整型的指針,強調(diào)這一點有助于學生對指針應(yīng)用的理解。例如,表達式中,出現(xiàn)在指針變量前的*稱為指針運算符,如賦值語句*p=21,其意義是給p中地址所指向的存儲空間賦值,圖2中,p中存有地址300,確定了被賦值空間的起始地址,而p的類型-整型,確定了這塊空間的大小,即*p確定了一塊從300開始,長度為4的存儲空間。變量的本質(zhì)是一塊存儲空間,那么反過來說,一塊確定的存儲空間就是一個變量,*p確定了一塊存儲空間,它等價于變量,給*p賦值等價于給整型變量賦值。
三、指針的應(yīng)用
1.指針和數(shù)組。C語言中,數(shù)組名代表數(shù)組的起始地址,是一個常數(shù),可以看做一個指針。《數(shù)據(jù)結(jié)構(gòu)》中,線性表的順序映像存儲結(jié)構(gòu)是通過動態(tài)申請的數(shù)組實現(xiàn)的,設(shè)線性表為a1,a2,…,an(n=20),數(shù)據(jù)元素類型為整型,其存儲結(jié)構(gòu)的定義如下所示:
#define L_SIZE 20
typedef struct{
int *elem;
int length;?搖?搖?搖 /*已存數(shù)據(jù)的個數(shù)*/
int listsize; ?搖 ?搖 /*數(shù)組容量的大小*/
}Sqlist;
上述代碼主要定義了結(jié)構(gòu)體數(shù)據(jù)類型Sqlist,該結(jié)構(gòu)體類型中包含3個域:elem,length和listsize,其中elem是一個整型的指針變量,用來指向申請存儲空間的起始地址。類型定義后可以聲明該類型的變量,如Sqlist L;線性表的存儲空間(數(shù)組)需要申請,如圖3所示。
malloc函數(shù)申請了一塊大小為80個字節(jié)的存儲空間,該空間的起始地址假設(shè)為100,函數(shù)返回后,地址100被賦值給整型的指針變量L.elem,即指針變量L.elem中存有地址100。
學生對靜態(tài)數(shù)組的使用相對熟練些,但往往不習慣動態(tài)申請數(shù)組的使用,下面以線性表的遍歷為例來說明一下其使用方式。動態(tài)申請數(shù)組中遍歷的實現(xiàn)有兩種常用方式:一是把指針當做數(shù)組名來使用。數(shù)組名是地址,可以看做指針,反之,指針同樣能夠看做是數(shù)組名。遍歷的代碼可以寫為:
for(i=0;i
這里要注意理解中括號[ ]的意義,中括號本質(zhì)上是運算符,它的意義是執(zhí)行操作L.elem+i(這里要關(guān)注指針的類型,即不同類型的指針加i,計算結(jié)果是不同的),找到存儲ai+1這個整型數(shù)據(jù)的4個字節(jié)空間的起始地址,隨后根據(jù)指針的類型(確定大小),存取這4個字節(jié)的存儲空間。
二是通過指針來進行遍歷。遍歷的代碼可以寫為:
for(p=L.elem;p
整型指針p首先被賦值L.elem,圖3中是100,這時p指向數(shù)組中第0號單元的起始地址,通過指針運算符*p存取從100開始的4個字節(jié)空間,即數(shù)組中第0號單元。隨后,通過p的自加運算,指針p后移4個字節(jié)(p是整型指針),依次對數(shù)組中所有元素進行遍歷。從結(jié)果上來看,代碼(1)和代碼(2)是完全等價的。
2.鏈表。線性表的非順序映像存儲結(jié)構(gòu)是鏈表實現(xiàn)的。定義鏈表結(jié)點(結(jié)構(gòu)體),動態(tài)申請結(jié)點存儲空間,線性表每個數(shù)據(jù)元素存儲在一個結(jié)點中,通過指針描述數(shù)據(jù)元數(shù)之間的關(guān)系,其結(jié)點的定義如下所示:
typedef struct LNode{
?搖int data;
?搖struct LNode *next;
} LNode,*LinkList;
上述代碼主要定義了結(jié)構(gòu)體數(shù)據(jù)類型LNode 和指向結(jié)構(gòu)體的指針類型LinkList,該結(jié)構(gòu)體類型中包含2個域:存儲數(shù)據(jù)元素的域data和指針域next,next用來指向本結(jié)點數(shù)據(jù)元數(shù)在邏輯結(jié)構(gòu)中的后繼,鏈表如圖4所示。
仍以線性表的遍歷為例來說明其使用方式,利用指針p來進行遍歷,代碼可以寫為:
p=head->next;
while (p) {
對數(shù)據(jù)元素p->data進行處理;?搖?搖?搖(3)
p=p->next;}
p被賦值p=head->next,指向首元結(jié)點,隨后通過循環(huán)中p=p->next語句,p依次指向后繼結(jié)點,直到鏈表結(jié)束。這里要注意對->操作符的理解,當指針p指向一個結(jié)構(gòu)體存儲空間時,如果需要存取結(jié)構(gòu)體中的某個域,可以使用“p->域名”的方式,如p->data就是存取該結(jié)構(gòu)體中的data域;另有一種等價的方式“*p.域名”,如*p.data,*p確定一塊結(jié)構(gòu)體空間(結(jié)構(gòu)體變量),用“.”操作符存取結(jié)構(gòu)體變量的某個域。
3.指向函數(shù)的指針。函數(shù)載人內(nèi)存時,必定占有一塊存儲空間,可以定義指向函數(shù)的指針,通過指針來調(diào)用函數(shù),例如:
int (*p)( );?搖?搖?搖/* 定義了一個函數(shù)指針,其所指函數(shù)的返回值為整型*/
p=fun;?搖?搖?搖?搖?搖?搖?搖/*設(shè)int fun(int, int);*/
(*p)(a,b)?圳fun(a,b)
首先定義了一個指向函數(shù)的指針p,隨后p被賦值函數(shù)名,即讓p指向函數(shù)fun,p指向fun后,可以通過指向函數(shù)的指針調(diào)用函數(shù),其效果和通過函數(shù)名調(diào)用是等價的。應(yīng)該注意到,這樣用法毫無價值,能通過函數(shù)名調(diào)用,何必還要間接用指針調(diào)用。因此,指向函數(shù)的指針一般用作函數(shù)的形式參數(shù),例如:
Status Sub(int e);
Status Add(int e);?搖?搖?搖/*返回值為Status的兩個函數(shù)*/
void Preorder(BiTree T,status(*visit)(int e)){ ?搖/*遍歷二叉樹的函數(shù)*/
……….
(*visit)(a);?搖?搖/*通過指向函數(shù)的指針調(diào)用函數(shù)*/
………
}
Preorder(T,Sub);
Preorder(T,Add);
假設(shè)有數(shù)據(jù)元素為整型的二叉樹T,Preorder是實現(xiàn)二叉樹的先序遍歷的函數(shù)。上述代碼中,首先給出了兩個函數(shù)返回值為Status的函數(shù)原型,設(shè)Sub是對整數(shù)進行減處理的函數(shù),Add是進行加處理的函數(shù)。那么,Preorder(T,Sub)調(diào)用時,函數(shù)名Sub作為實參傳遞給形參visit(指向函數(shù)的指針),則在遍歷過程中(*visit)(a)所調(diào)用的函數(shù)是Sub;同理,Preorder(T,Add)調(diào)用時,(*visit)(a)所調(diào)用的函數(shù)是Add。這里應(yīng)該強調(diào),為什么要這么做?從上例中看,對二叉樹的遍歷過程是一樣的,通過兩次調(diào)用中visit所指的函數(shù)不同,對二叉樹T中數(shù)據(jù)元素的處理不同,一次是減,一次是加。指向函數(shù)的指針帶來的好處是,如果對數(shù)據(jù)元素的處理有新的變化,如增加乘的處理,僅需要編寫乘的函數(shù)Mul,隨后調(diào)用Preorder(T,Mul)就可實現(xiàn)對二叉樹中數(shù)據(jù)元素的乘處理,不需要改變Preorder函數(shù)。這樣的程序結(jié)構(gòu)非常有利于提高程序的可維護性。
四、小結(jié)
作為實踐性很強的計算機專業(yè)核心課程,《數(shù)據(jù)結(jié)構(gòu)》課程的實驗環(huán)節(jié)非常重要,指針的靈活應(yīng)用是課程實驗中的難點。學生對指針了理解往往流于表面,只會模仿性應(yīng)用,不能深入理解和靈活應(yīng)用。文中,我們結(jié)合實際的教學經(jīng)驗,總結(jié)了指針中的幾個學生不容易掌握的問題,并分析討論了教學中的要點。通過多年的教學實踐,對學生《數(shù)據(jù)結(jié)構(gòu)》課程的學習和提高編程能力是有幫助的。
參考文獻:
[1]陳越,何欽銘,馮雁.“數(shù)據(jù)結(jié)構(gòu)”綜合性課程設(shè)計教學探索與實踐[J].計算機教育,2008,(8):54-55.
[2]嚴蔚敏.數(shù)據(jù)結(jié)構(gòu)(C語言版)[M].北京:清華大學出版社,2009.
1JDK中的數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)是數(shù)據(jù)元素之間的關(guān)系。從概念和實現(xiàn)兩個角度,可將數(shù)據(jù)結(jié)構(gòu)分為數(shù)據(jù)的邏輯結(jié)構(gòu)和數(shù)據(jù)的存儲結(jié)構(gòu)。按照數(shù)據(jù)元素之間前驅(qū)和后繼關(guān)系來分,數(shù)據(jù)的邏輯結(jié)構(gòu)可分為以下4種:集合(Set)、線性表(List)、樹(Tree)和圖(Graph)[2]。數(shù)據(jù)的存儲結(jié)構(gòu)主要包括數(shù)據(jù)元素本身的存儲以及數(shù)據(jù)元素之間關(guān)系表示。數(shù)據(jù)元素之間的關(guān)系在計算機中主要有兩種不同的表示方法:順序映像和非順序映像,并由此得到兩種不同的存儲結(jié)構(gòu):順序存儲結(jié)構(gòu)和鏈式存儲結(jié)構(gòu)。JavaJDK為常用的數(shù)據(jù)結(jié)構(gòu)定義了一些接口(Interface)和實現(xiàn)(Implementation)。這些接口、實現(xiàn)類以及常用的排序、查找等算法統(tǒng)稱為JavaCollections框架(JavaCollectionsFramework)。Collections框架的設(shè)計目的是要滿足如下目標:高性能、一致性、擴展性和輕松編程。Java程序員在具體應(yīng)用時,不必考慮數(shù)據(jù)結(jié)構(gòu)和算法實現(xiàn)細節(jié),只需要用這些類創(chuàng)建出來一些對象,然后直接應(yīng)用即可[3]。Java中把一組對象稱為Collection,也就是說,Collection是對象的容器。Java對Collection中的對象沒有任何前驅(qū)、后繼以及重復性的約束,只是約束了對象類型E。Collection接口定義了其上的3類操作:針對單個元素的基本操作、迭代器和Collection對象之間的批量操作。基本操作包括增加、刪除、判斷是否包含某個元素、判斷是否為空、容器中當前元素的個數(shù)、清空等。批量操作包括:合并兩個Collection容器、從一個容器中移走一些元素、保留兩個容器中相同的元素、判斷一個容器中的元素是否完全包含在另外一個容器中等。接口Collection<E>的子接口有Set<E>和List<E>。集合(Set)在Collection的基礎(chǔ)之上增加了“不允許重復元素”的約束;而List則在Collection基礎(chǔ)之上增加了“元素之間具有前驅(qū)、后繼關(guān)系”的約束:除了第一個元素外,所有元素具有唯一的前驅(qū);除了最后一個元素外,所有元素具有唯一后繼。如果僅關(guān)心數(shù)據(jù)元素是否出現(xiàn),而不關(guān)心數(shù)據(jù)元素之間的次序,則應(yīng)使用Set<E>。Java為集合接口提供了兩個基本的實現(xiàn):HashSet<E>和Tree<Set>。HashSet<E>是Set<E>接口的典型實現(xiàn),大多使用集合的場合就是使用這個實現(xiàn)類。HashSet實現(xiàn)類按哈希算法來存儲集合中的元素,因此具有很好的查找性能。HashSet不能記憶元素之間的順序,包括插入順序。其子類LinkedHashSet<E>也是根據(jù)元素hashCode值來決定元素存儲位置,但它同時使用鏈表維護元素的次序,這樣使得能夠記憶插入順序。由于LinkedHashSet需要維護元素的插入順序,所以性能略低于HashSet,但遍歷集合里的全部元素性能較好。實現(xiàn)類TreeSet<E>可以確保集合元素處于排序狀態(tài),TreeSet并不是根據(jù)元素的插入順序進行排序,而是根據(jù)元素的實際值來進行排序的。TreeSet采用紅黑樹的數(shù)據(jù)結(jié)構(gòu)對元素進行排序,并要求添加進TreeSet中的對象必須實現(xiàn)CompareTo<E>接口。List<E>接口作為Collection<E>接口的子接口,可以使用Collection接口中的全部方法。但是List接口中定義了元素位置和元素范圍的概念,使得List可以根據(jù)元素位置索引(index)來插入、替換、刪除集合元素以及查找指定對象的位置。ArrayList<E>實現(xiàn)類基于數(shù)組實現(xiàn)了List接口,其內(nèi)部封裝了一個動態(tài)再分配的數(shù)組。每個ArrayList對象都有一個capacity屬性,這個屬性表示它們所封裝的數(shù)組的長度,當添加元素超過長度時,capacity會自動增長,其默認值為10。LinkedList<E>內(nèi)部以鏈表來保存集合中的元素,因此隨機訪問容器時的性能較差,但在插入、刪除元素時性能較好。Queue<E>接口用于定義隊列這種數(shù)據(jù)結(jié)構(gòu),隊列是“先進先出”的容器,通常不允許隨機訪問其中的元素。Java中的隊列接口Queue<E>沒有繼承List接口,而是直接繼承了Collection接口。如果使用具有固定容量的隊列,則應(yīng)使用offer()來加入元素,使用poll()來獲取并移出元素,因為add()和remove()方法在因容量原因失敗時拋出異常。如果只是訪問隊首而不移出該元素,使用element()或者peek()方法。LinkedList<E>類實現(xiàn)了Queue<E>接口,因此我們可以把LinkedList當成Queue來用。PriorityQueue是一個比較標準的隊列實現(xiàn)類,它并不是按加入隊列的順序,而是按隊列元素的大小來記憶隊列元素的順序。因此當調(diào)用peek方法或者poll方法來取出隊列中的元素時,并不是取出最先進入隊列的元素,而是取出隊列中最小的元素。Stack<E>實現(xiàn)了List<E>接口,提供了push和pop操作限制線性表中元素的插入和刪除只能在線性表的同一端進行。JDK1.6引入的ArrayDequ<E>實現(xiàn)類被優(yōu)先推薦作為棧使用。ArrayDeque<E>實現(xiàn)了Deque<E>接口。Deque<E>接口定義了雙端隊列,雙端隊列中的元素可以從兩端彈出,其限定插入和刪除操作在表的兩端進行。JavaJDK中沒有直接提供樹和圖的接口和實現(xiàn)類,但是可以通過研究TreeMap的源代碼學習操作樹的一般編寫模式。綜上,數(shù)據(jù)結(jié)構(gòu)與Java面向?qū)ο蟪绦蛟O(shè)計兩門課程內(nèi)容的銜接見表1。
2面向數(shù)據(jù)結(jié)構(gòu)銜接的Java課程實施方案
Java面向?qū)ο蟪绦蛟O(shè)計為1學期的課程。總課時為講授54學時、實驗32學時。其中,與數(shù)據(jù)結(jié)構(gòu)知識點緊密相關(guān)的JavaCollections框架部分為講授6學時、實驗4學時。在講授環(huán)節(jié),按照表1列出的順序進行。在實驗環(huán)節(jié)完成與授課內(nèi)容相關(guān)的驗證性實驗。在課程設(shè)計實踐環(huán)節(jié),要求學生使用Java設(shè)計常見算法,然后閱讀JDK提供的源代碼進行對照。具體方案如圖1所示。比如,在java.util.Collections類中提供了數(shù)據(jù)結(jié)構(gòu)中學生已經(jīng)學過的常見算法,如二分查找、計算元素頻數(shù)、查找最大/最小元素、反轉(zhuǎn)線性表、按照指定距離旋轉(zhuǎn)線性表、隨機排列線性表、交換指定位置上的兩個元素以及排序等。注意,在Java6中Collections.sort()使用的是MergeSort;而在Java7中,內(nèi)部實現(xiàn)換成了TimSort。要求學生按照這些API文檔說明,首先按照數(shù)據(jù)結(jié)構(gòu)課程中的知識設(shè)計自己的算法實現(xiàn),然后與API源代碼進行比較。由于學生使用C語言版的數(shù)據(jù)結(jié)構(gòu)教材,所以在面向Collection編程之前,作為過渡,先讓學生面向數(shù)組編程。哈希表是一種重要的數(shù)據(jù)結(jié)構(gòu),也是實現(xiàn)集合的基本途徑之一。通過研究HashSet的源代碼,可以讓學生理解為什么每個對象都要有hashcode()方法,以及哈希表的編碼特點。由于HashSet的實現(xiàn)是基于HashMap的,所以研究HashSet就要研究HashMap。Map是一種典型的名值對類型,它提供一種Key-Value對應(yīng)保存的數(shù)據(jù)結(jié)構(gòu)。客戶程序通過Key值來訪問對應(yīng)的Value,這個接口并沒有繼承Collection這接口;而其他的類或者接口,不管是List、Set、Stack等都繼承或?qū)崿F(xiàn)了Collection。TreeMap和HashMap算是Java集合類里面比較有難度的數(shù)據(jù)結(jié)構(gòu)。HashMap元素存取的時間復雜度一般是O(1),而TreeMap內(nèi)部對元素的操作復雜度為O(logn)。TreeMap記憶了順序,TreeSet內(nèi)部的實現(xiàn)使用了TreeMap。
3結(jié)語
數(shù)據(jù)結(jié)構(gòu)與程序類課程的關(guān)系問題愈來愈引起關(guān)注[4-6],我們提出面向數(shù)據(jù)結(jié)構(gòu)知識體系的Java課程教學與數(shù)據(jù)結(jié)構(gòu)課程的銜接方案。這個教學方案已經(jīng)在河北師范大學本科計算機專業(yè)實施三屆,取得了較好的效果,學生對算法的理解加深了,解決問題的自信心增強了,也建立了工程意識。
作者:董東 單位:河北師范大學 數(shù)學與信息科學學院