龐曉瓊
文章編號:1672-5913(2009)01-0053-03
摘要:本文針對傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)教學(xué)過程中出現(xiàn)的問題,提出一種案例驅(qū)動的數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)教學(xué)方式,以幫助學(xué)生理解和掌握分析問題、解決問題的方法,提高自主學(xué)習(xí)能力,鍛煉設(shè)計(jì)創(chuàng)新能力。實(shí)踐表明,此教學(xué)方式能夠彌補(bǔ)傳統(tǒng)教學(xué)的不足,開闊學(xué)生的思路,提高自主完成率,達(dá)到課程設(shè)計(jì)目的。
關(guān)鍵詞:課程設(shè)計(jì);數(shù)據(jù)結(jié)構(gòu);案例驅(qū)動;教學(xué)改革
中圖分類號:G642
文獻(xiàn)標(biāo)識碼:B
1引言
數(shù)據(jù)結(jié)構(gòu)課程是計(jì)算機(jī)相關(guān)專業(yè)的專業(yè)基礎(chǔ)課程,屬于專業(yè)課程體系中的核心課程。該課程著眼于對基本數(shù)據(jù)結(jié)構(gòu)進(jìn)行闡述和分析、講解基本數(shù)據(jù)結(jié)構(gòu)的應(yīng)用并介紹典型的基本算法等三個(gè)方面,內(nèi)容比較抽象枯燥,掌握起來相對困難。數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)是一門獨(dú)立的實(shí)驗(yàn)環(huán)節(jié),是對數(shù)據(jù)結(jié)構(gòu)課程教學(xué)理論的延伸和補(bǔ)充,是對理論知識的綜合應(yīng)用,其目的是發(fā)揮學(xué)生的主動性,培養(yǎng)學(xué)生分析實(shí)際問題并加以解決的能力,鍛煉學(xué)生的設(shè)計(jì)創(chuàng)新能力。
傳統(tǒng)的數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)教學(xué)輕講授,主要以對學(xué)生的單獨(dú)輔導(dǎo)為主,督促學(xué)生完成課程設(shè)計(jì)。這種方式存在后文所提及的一些問題,隨著互聯(lián)網(wǎng)資源的日益豐富,部分問題更加突出了。為了能讓學(xué)生通過課程設(shè)計(jì)更好的掌握數(shù)據(jù)結(jié)構(gòu)的內(nèi)容,我們設(shè)計(jì)了案例驅(qū)動的數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)教學(xué)改革,實(shí)踐證明,該項(xiàng)教改能夠填補(bǔ)傳統(tǒng)教學(xué)過程的不足。
2傳統(tǒng)教學(xué)過程中暴露的問題
(1) 缺乏駕馭全局的能力。本科二年級學(xué)生計(jì)算機(jī)建模能力弱,沒有軟件工程的思想,因而缺乏駕馭全局的能力。軟件工程課程一般都開設(shè)在數(shù)據(jù)結(jié)構(gòu)課程之后,在進(jìn)行數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)前,學(xué)生也基本沒有分析、編寫較大程序的經(jīng)驗(yàn),這種情況造成了學(xué)生拿到問題后不知該從何下手和如何規(guī)劃好課程設(shè)計(jì)的整個(gè)過程。
(2) 生搬硬套基本數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)教材中都是最原始的數(shù)據(jù)結(jié)構(gòu),不進(jìn)行擴(kuò)展和修改基本上是不能直接用到課程設(shè)計(jì)中解決實(shí)際問題的,而采用多種數(shù)據(jù)結(jié)構(gòu)解決問題并加以比較找尋最優(yōu)方案對于學(xué)生來說就更為困難。
(3) 對高級程序語言掌握不到位。數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)是需要用高級程序語言來編寫的,學(xué)生對該程序語言的掌握程度直接影響到課程設(shè)計(jì)的質(zhì)量,常見的問題包括:變量定義不規(guī)范、函數(shù)功能劃分不合理、代碼可讀性較差、文件讀寫掌握不好、調(diào)試程序能力較弱等。
(4) 照搬、照抄他人課程設(shè)計(jì)的現(xiàn)象存在。由于完成課程設(shè)計(jì)的時(shí)間有限,有的學(xué)生在無法自主完成的情況下,通過網(wǎng)絡(luò)、書籍等方式來查找解題方法。本來通過查閱資料消化吸收他人的解題思路來求解自己的課程設(shè)計(jì)問題是毋庸置疑的正規(guī)途徑,然而一方面課程設(shè)計(jì)的題目每個(gè)學(xué)校每屆學(xué)生都相對比較固定,致使存在抄襲往屆學(xué)生程序的現(xiàn)象,另一方面互聯(lián)網(wǎng)的發(fā)展使得查找相似題目的課程設(shè)計(jì)源代碼并非難事。此外,市面上還存在著大量快餐式的課程設(shè)計(jì)書籍在售,這類書籍良莠不齊,多是搜集、羅列了若干課程設(shè)計(jì)題目,源碼、光盤附上,草草分析講解了事。許多學(xué)生也習(xí)慣了這種快餐式的學(xué)習(xí),能做到獨(dú)立思考、舉一反三的越來越少。
3案例驅(qū)動的數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)教學(xué)改革特點(diǎn)
案例驅(qū)動的數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)教學(xué)改革是將案例教學(xué)法引入數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)教學(xué)中,教師通過講解一個(gè)完整的案例分析解決過程,輔以多媒體的手段與學(xué)生交流、互動,達(dá)到培養(yǎng)學(xué)生分析并解決實(shí)際問題的能力,鍛煉學(xué)生的設(shè)計(jì)創(chuàng)新能力的目的,同時(shí)也彌補(bǔ)了目前數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)教學(xué)重實(shí)踐、輕講授的不足,豐富該項(xiàng)課程設(shè)計(jì)的教學(xué)內(nèi)容。該方法有以下特點(diǎn):
(1) 提前熟悉軟件工程思想。案例的分析解決過程就是一個(gè)實(shí)踐軟件工程思想的過程,學(xué)生可以在講解的過程中體會軟件開發(fā)的完整流程,進(jìn)而對自己的課程設(shè)計(jì)有全局性的考慮。
(2) 舉一反三,定制合適的數(shù)據(jù)結(jié)構(gòu)。對于案例講解中所涉及到的數(shù)據(jù)結(jié)構(gòu),教師將進(jìn)行細(xì)致的分析。采用不同數(shù)據(jù)結(jié)構(gòu)解決同一問題,在性能和功能上會有所區(qū)別,學(xué)生可以在與教師的互動討論中提高對各種數(shù)據(jù)結(jié)構(gòu)的認(rèn)識,從而設(shè)計(jì)適合解決自己課程設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu),甚至能夠采取多種解法。
(3) 養(yǎng)成良好的編程習(xí)慣。優(yōu)秀的代碼就像優(yōu)美的文章一樣能使閱讀者心情舒暢,教師講解的案例都是代碼級別的,定義規(guī)范、流程清楚、可讀性強(qiáng)、具備參考價(jià)值,這樣就促使學(xué)生養(yǎng)成良好的編程習(xí)慣。教師以多媒體手段演示代碼的編制調(diào)試過程,使學(xué)生對編程環(huán)境更加熟悉,能夠靈活運(yùn)用跟蹤、斷點(diǎn)等調(diào)試手段,開發(fā)過程事半功倍。
(4) 最大限度避免抄襲課程設(shè)計(jì)的現(xiàn)象。大多數(shù)學(xué)生事實(shí)上都希望能夠自主完成課程設(shè)計(jì),只是因?yàn)椴粫霾艑?dǎo)致抄襲往屆學(xué)生或是市售相關(guān)書籍源碼的現(xiàn)象存在。授之以魚不如授之以漁,通過對典型案例的講授,教師教給了學(xué)生解決課程設(shè)計(jì)的方法,學(xué)生找到了突破口,便愿意通過自己的努力完成任務(wù),自己能制作“大餐”,也就不再求助于“快餐”了。
4典型數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)案例分析
“活期儲蓄帳目管理”是常見的數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)題目,下面以其講解過程為例簡單描述一下案例驅(qū)動的數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)教學(xué)的過程。
此課程設(shè)計(jì)需要實(shí)現(xiàn)的功能一般是:(1)采用交互工作方式;(2)實(shí)現(xiàn)儲戶開戶;(3)實(shí)現(xiàn)儲戶銷戶;(4)向某賬戶存款;(5)從某賬戶取款;(6)排序顯示所有賬戶信息;(7)查詢某賬戶余額;(8)查詢某賬戶交易記錄;(9)所有賬戶及其交易信息存儲至文件,程序運(yùn)行時(shí)從文件中讀入。該課程設(shè)計(jì)考察的知識點(diǎn)包括:選擇并構(gòu)造數(shù)據(jù)結(jié)構(gòu);使用與特定數(shù)據(jù)結(jié)構(gòu)相應(yīng)的算法來實(shí)現(xiàn)具體功能;對文件讀寫結(jié)構(gòu)化數(shù)據(jù);對程序設(shè)計(jì)語言的靈活運(yùn)用等。
首先應(yīng)對題目進(jìn)行大致的分析,該題目包括兩方面的信息。一方面是儲戶的信息,可設(shè)計(jì)為包含賬號、姓名和余額等字段;另一方面是交易記錄信息,可設(shè)計(jì)為包括賬號、存取時(shí)間、存取標(biāo)志、金額等字段,兩方面信息通過賬號字段關(guān)聯(lián)起來。使用順序存儲結(jié)構(gòu)、鏈?zhǔn)酱鎯Y(jié)構(gòu)或樹形結(jié)構(gòu)都可以存儲這些信息,但其中各有利弊。順序存儲結(jié)構(gòu)設(shè)計(jì)簡單,但容量固定,賬戶插入刪除需要進(jìn)行記錄的移動,單個(gè)賬戶的交易記錄信息存儲不易連續(xù)導(dǎo)致列舉時(shí)需要對全部交易記錄進(jìn)行完整遍歷,對已排序順序表查找某一記錄時(shí)可以采用特定算法(如二分法)提高效率,總體上來說實(shí)用性和整體效率相對較差。鏈?zhǔn)酱鎯Y(jié)構(gòu)設(shè)計(jì)略復(fù)雜,容量不設(shè)上限,賬戶插入刪除較方便,采用鏈?zhǔn)浇Y(jié)構(gòu)存儲的交易記錄形式上連續(xù),列舉時(shí)很方便,但在查找某一記錄時(shí)需要遍歷整個(gè)鏈表效率較低,總體上來說實(shí)用性和整體效率中上。樹形存儲結(jié)構(gòu)相對最復(fù)雜,容量也不設(shè)上限,插入、刪除算法也相對復(fù)雜,采用特殊樹形結(jié)構(gòu)(如二叉排序樹)能夠提高查找記錄時(shí)的效率,交易記錄仍可采用鏈?zhǔn)浇Y(jié)構(gòu)存儲,總體上來說實(shí)用性和整體效率較好,現(xiàn)實(shí)中的數(shù)據(jù)庫管理系統(tǒng)(DBMS)多是用樹形結(jié)構(gòu)來實(shí)現(xiàn)的。從實(shí)現(xiàn)難度上來說,順序存儲最簡單,鏈?zhǔn)酱鎯Υ沃?,樹形存儲最難。因此,對學(xué)生一般要求其用鏈?zhǔn)酱鎯韺?shí)現(xiàn),對能力較強(qiáng)的學(xué)生可以鼓勵(lì)其用樹形存儲來實(shí)現(xiàn),以鏈?zhǔn)酱鎯槔^續(xù)討論。
賬戶信息和存取記錄之間是通過賬號來關(guān)聯(lián)的,在鏈?zhǔn)酱鎯Y(jié)構(gòu)中可以用指針來表示兩者的聯(lián)系,即每個(gè)賬戶節(jié)點(diǎn)(數(shù)據(jù)域可包含賬號、姓名和余額等字段)具有兩個(gè)指針域,一個(gè)指針指向下一個(gè)賬戶節(jié)點(diǎn),另一個(gè)指針域指向該賬戶的存取記錄鏈表(存取記錄節(jié)點(diǎn)的數(shù)據(jù)域可包含存取時(shí)間、存取標(biāo)志、金額等字段),如下圖所示。
從功能上分析,儲戶開戶、儲戶銷戶就是在賬戶鏈表中進(jìn)行插入和刪除操作;對賬戶存、取款時(shí),首先找到相應(yīng)賬戶,然后添加一條存取記錄,同時(shí)修正該賬戶的余額;排序顯示所有賬戶信息,就是對賬戶記錄依據(jù)某一關(guān)鍵字進(jìn)行排序并顯示排序結(jié)果;查詢某賬戶余額,就是遍歷賬戶鏈表,找到對應(yīng)記錄并顯示出來;查詢某賬戶交易記錄,就是先找到該賬戶,然后遍歷顯示該賬戶對應(yīng)的存取記錄鏈表。可以看出,對賬戶鏈表進(jìn)行遍歷查詢在賬戶存取款、查詢余額和查詢存取記錄是都有用到,因此在設(shè)計(jì)時(shí),可以考慮編寫查詢賬戶函數(shù),以供其他功能模塊調(diào)用。
在文件存取方面,存取時(shí)都是以存儲節(jié)點(diǎn)為單位進(jìn)行的,即一次性存取一個(gè)結(jié)構(gòu)體。該課程設(shè)計(jì)有其特殊之處,有兩種類型的結(jié)構(gòu)體需要存取,即賬戶信息和存取款記錄,這兩種結(jié)構(gòu)體所占用的空間不盡相同,若是都保存在一個(gè)數(shù)據(jù)文件中則需要一定的技巧。以保存記錄到文件為例,可以采用存一個(gè)賬戶信息,再存一個(gè)整形數(shù),該整形數(shù)的數(shù)值為此賬戶對應(yīng)存取記錄節(jié)點(diǎn)的數(shù)量,然后再逐一保存每條存取記錄,存儲完畢后再用相同方法保存下一個(gè)賬戶的記錄。讀取文件過程則是存儲過程的逆過程,這樣可以保證存取時(shí),賬戶信息和存取記錄一一對應(yīng),不至于混淆。
在確定了上述思路后,便可以著手編碼,值得注意的是數(shù)據(jù)結(jié)構(gòu)的定義。由于采用了鏈?zhǔn)浇Y(jié)構(gòu),許多同學(xué)便直接將鏈?zhǔn)浇Y(jié)構(gòu)的節(jié)點(diǎn)(包括指針域)直接存儲到文件中。事實(shí)上,這個(gè)指針域是沒有保存價(jià)值的,尤其在讀取時(shí)如果也將指針域讀出并賦值,將很有可能導(dǎo)致不可預(yù)知的錯(cuò)誤??梢圆扇〉姆椒ㄊ?,先定義只包含數(shù)據(jù)域的數(shù)據(jù)結(jié)構(gòu)體,再定義鏈表節(jié)點(diǎn)結(jié)構(gòu)體將數(shù)據(jù)結(jié)構(gòu)體封裝起來并加上指針域,在文件讀寫時(shí)只對數(shù)據(jù)結(jié)構(gòu)體進(jìn)行操作。給出該課程設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)參考定義如下:
typedef struct log //存取記錄
{
char DateTime[25]; //存取時(shí)間
char W_D; //存取標(biāo)志
float Amount; //存取金額
} log;
typedef struct node_log //存取記錄節(jié)點(diǎn)
{
log data; //存取記錄
struct node_log *next; //下一存取記錄節(jié)點(diǎn)指針
} node_log, *p_node_log;
typedef struct account //賬戶記錄
{
char ID[10]; //賬號
char Name[10]; //姓名
float Balance; //余額
} account;
typedef struct node_account //賬戶記錄節(jié)點(diǎn)
{
account data; //賬戶記錄
struct node_log *nlog; //存取記錄節(jié)點(diǎn)指針
struct node_account *next; //下一賬戶記錄節(jié)點(diǎn)指針
} node_account, *p_node_account;
其他功能模塊便可以參照數(shù)據(jù)結(jié)構(gòu)教材上的相關(guān)算法設(shè)計(jì)實(shí)現(xiàn)。
5結(jié)果與結(jié)論
我們將來自3個(gè)不同專業(yè)(計(jì)算機(jī)、網(wǎng)絡(luò)工程、軟件工程)10個(gè)班級的57名同學(xué)分成了兩組,一組(試驗(yàn)組)通過上述方法進(jìn)行了課程設(shè)計(jì)教學(xué),一組(對照組)仍采用傳統(tǒng)方法教學(xué),課程設(shè)計(jì)題目相同。課程設(shè)計(jì)對比統(tǒng)計(jì)情況如下表,其中試驗(yàn)組優(yōu)良率達(dá)到44%,不合格率13%,對照組優(yōu)良率21%,不合格率26%。同時(shí),試驗(yàn)組采用了多種方式來實(shí)現(xiàn)了課程設(shè)計(jì),且雷同情況較少,對照組多數(shù)采用順序存儲方式實(shí)現(xiàn),程序雷同情況較多。很明顯,試驗(yàn)組的學(xué)生思路更加開闊,自主完成率更高。
時(shí)代在變遷,信息獲取更加便捷,部分學(xué)生的學(xué)習(xí)積極性在某種程度上也發(fā)生了蛻變,隨之的教學(xué)方式也應(yīng)有所改變,教師應(yīng)從正面加以引導(dǎo)。在以案例驅(qū)動的數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)教學(xué)改革實(shí)踐中,教師通過對典型案例的細(xì)致分析,比較不同數(shù)據(jù)結(jié)構(gòu)的優(yōu)缺點(diǎn),一方面使學(xué)生更加牢固的掌握了數(shù)據(jù)結(jié)構(gòu)知識,另一方面讓學(xué)生找到入手之門,激發(fā)學(xué)習(xí)興趣,提高動手能力,更重要的是能讓學(xué)生掌握分析和解決問題的方法,自主完成課程設(shè)計(jì),這對今后其他課程的學(xué)習(xí)也是有所裨益的。
參考文獻(xiàn):
[1] 張培,肖天慶. 基于網(wǎng)絡(luò)環(huán)境下教學(xué)設(shè)計(jì)與課程開發(fā)的合作模式研究[J]. 電化教育研究,2007,(9):60-63.
[2] 吳宏偉,張殿龍,梅險(xiǎn). 高校網(wǎng)絡(luò)輔助教學(xué)的探索與實(shí)踐[J]. 計(jì)算機(jī)教育,2007,(7):18-21.
[3] 張敏霞. 程序設(shè)計(jì)語言課程教學(xué)方法改革的探索與實(shí)踐[J]. 中國高教研究,2004,(2):90.
[4] 姜芳,楊晉明. 淺析研究性教學(xué)在高校教學(xué)中的運(yùn)用[J]. 教育與現(xiàn)代化,2004,(1):13-16.
[5] 嚴(yán)蔚敏等. 數(shù)據(jù)結(jié)構(gòu)[M]. 北京:清華大學(xué)出版社,2006.