摘 要:數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)專(zhuān)業(yè)的基礎(chǔ)核心課程,實(shí)踐教學(xué)是其必要的組成部分。本文針對(duì)新疆大學(xué)學(xué)生在數(shù)據(jù)結(jié)構(gòu)課程實(shí)踐教學(xué)環(huán)節(jié)中存在的一些問(wèn)題,提出了規(guī)范的實(shí)習(xí)操作步驟。通過(guò)規(guī)范的實(shí)習(xí)操作步驟培養(yǎng)學(xué)生科學(xué)化的工作作風(fēng),有效地避免課程實(shí)踐中的錯(cuò)誤,指導(dǎo)學(xué)生設(shè)計(jì)良好的數(shù)據(jù)結(jié)構(gòu)及算法,編寫(xiě)出優(yōu)美的程序。
關(guān)鍵詞:數(shù)據(jù)結(jié)構(gòu);精品課程;實(shí)踐教學(xué);算法
基金項(xiàng)目:新疆大學(xué)2008年精品課程建設(shè)項(xiàng)目(2008[146號(hào)])。
作者簡(jiǎn)介:崔青,女,講師,研究方向?yàn)閿?shù)據(jù)結(jié)構(gòu)及程序設(shè)計(jì);劉淑嫻,女,講師,研究方向?yàn)閿?shù)據(jù)結(jié)構(gòu);張振宇,男,副教授,研究方向?yàn)閿?shù)據(jù)結(jié)構(gòu)。
數(shù)據(jù)結(jié)構(gòu)是對(duì)計(jì)算機(jī)程序設(shè)計(jì)要求較高的電子信息類(lèi)各專(zhuān)業(yè)的基礎(chǔ)核心課程,有著較強(qiáng)的技術(shù)性和實(shí)踐性。它主要是培養(yǎng)學(xué)生的算法設(shè)計(jì)與分析的基本理論知識(shí)與技能,該課程強(qiáng)調(diào)理論和實(shí)踐的統(tǒng)一,突出的是對(duì)學(xué)生動(dòng)手能力的培養(yǎng)。為了幫助學(xué)生更好地學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)方面的知識(shí),充分理解和掌握算法設(shè)計(jì)所需要的技術(shù),為信息類(lèi)后續(xù)專(zhuān)業(yè)課程的學(xué)習(xí)打下一個(gè)好的基礎(chǔ),上機(jī)實(shí)習(xí)就顯得十分重要。實(shí)習(xí)過(guò)程中,要求學(xué)生運(yùn)用所學(xué)知識(shí),結(jié)合一些典型問(wèn)題,經(jīng)過(guò)分析、設(shè)計(jì)、編碼、調(diào)試等各環(huán)節(jié)的訓(xùn)練,去深刻理解、進(jìn)而達(dá)到牢固掌握所用到的一些技術(shù),提高學(xué)生組織數(shù)據(jù)及編寫(xiě)大型程序的能力。
如今,隨著計(jì)算機(jī)技術(shù)以及計(jì)算機(jī)性能的提高,軟件開(kāi)發(fā)的復(fù)雜度也日趨增加,一種常用的軟件開(kāi)發(fā)方法是將開(kāi)發(fā)過(guò)程按工程化理論分為四個(gè)階段:分析、設(shè)計(jì)、實(shí)現(xiàn)和維護(hù)。雖然數(shù)據(jù)結(jié)構(gòu)這門(mén)課程的實(shí)習(xí)題的復(fù)雜度遠(yuǎn)不能跟實(shí)際中真正的軟件系統(tǒng)比較,但為了培養(yǎng)一名軟件工作者所應(yīng)具備的科學(xué)工作的方法和作風(fēng),規(guī)范的實(shí)習(xí)操作步驟是必不可少的[1]。
1 實(shí)習(xí)操作規(guī)范的重要性
上機(jī)實(shí)習(xí)是對(duì)學(xué)生的一種全面綜合訓(xùn)練,是與課堂教學(xué)、自主學(xué)習(xí)和課后練習(xí)相輔相成的必不可少的一個(gè)教學(xué)環(huán)節(jié)。實(shí)習(xí)能夠幫助學(xué)生學(xué)會(huì)如何把書(shū)上學(xué)到的知識(shí)用于解決實(shí)際問(wèn)題,培養(yǎng)他們開(kāi)發(fā)軟件所需要的動(dòng)手能力。實(shí)習(xí)操作還能使書(shū)上的知識(shí)變“活”,幫助學(xué)生深化理解和靈活掌握教學(xué)內(nèi)容。實(shí)習(xí)題通常是軟件設(shè)計(jì)的綜合訓(xùn)練,包括分析問(wèn)題、總體設(shè)計(jì)、界面設(shè)計(jì)、程序設(shè)計(jì)基本技能和技巧、協(xié)同合作、乃至一整套軟件工作規(guī)范的訓(xùn)練。此外,更重要的一點(diǎn)是:計(jì)算機(jī)是比任何教師都嚴(yán)格的檢查者[3]。
在以往的教學(xué)實(shí)踐中,經(jīng)常發(fā)現(xiàn)很多學(xué)生抱怨說(shuō)這門(mén)課學(xué)不明白,實(shí)習(xí)操作時(shí)不知從何下手,設(shè)計(jì)算法時(shí)沒(méi)有任何頭緒,甚至有些已經(jīng)用偽代碼表示的算法都很難用具體的程序設(shè)計(jì)語(yǔ)言實(shí)現(xiàn),程序出錯(cuò)了,有時(shí)花一兩個(gè)小時(shí)才找出一個(gè)錯(cuò)誤,甚至是一無(wú)所獲,使學(xué)生很受打擊。實(shí)際上,在實(shí)習(xí)操作過(guò)程中按步驟規(guī)范有效的展開(kāi)程序設(shè)計(jì)是有效克服這種情況的重要手段之一。但是,真正在進(jìn)行實(shí)驗(yàn)教學(xué)時(shí),我發(fā)現(xiàn)有些學(xué)生不屑于按實(shí)習(xí)步驟規(guī)范去做,他們有些人直接在電腦前編寫(xiě)代碼,甚至對(duì)于實(shí)習(xí)步驟的要求和建議看都不看一遍,認(rèn)為那是浪費(fèi)時(shí)間,這對(duì)該課程的學(xué)習(xí)是及其有害的。正確的實(shí)習(xí)步驟規(guī)范不僅可以培養(yǎng)學(xué)生科學(xué)化的工作作風(fēng),而且還能有效地避免錯(cuò)誤[2]。
2 實(shí)習(xí)操作步驟規(guī)范
從多年來(lái)教學(xué)實(shí)習(xí)的經(jīng)驗(yàn)看,在初學(xué)階段執(zhí)行嚴(yán)格的實(shí)習(xí)步驟規(guī)范(包括上機(jī)操作規(guī)范),機(jī)時(shí)利用率會(huì)大大提高,有助于養(yǎng)成良好的程序編制風(fēng)格,培養(yǎng)嚴(yán)謹(jǐn)、科學(xué)、高效的工作方式。根據(jù)數(shù)據(jù)結(jié)構(gòu)課程的特點(diǎn),以及多年的教學(xué)經(jīng)驗(yàn)我總結(jié)出以下具體的實(shí)習(xí)步驟規(guī)范[3]。
首先建議3~4個(gè)同學(xué)組成一個(gè)小組,設(shè)組長(zhǎng)一人,由組長(zhǎng)負(fù)責(zé)提交階段成果,組員之間明確各自的任務(wù),以達(dá)到相互研究、討論、互相學(xué)習(xí)、共同提高的目的。這也是以后程序設(shè)計(jì)人員所要具備的最基本素質(zhì)之一:團(tuán)隊(duì)協(xié)作素質(zhì)。
1) 問(wèn)題分析與任務(wù)定義[1]。
一般地,實(shí)習(xí)題目的語(yǔ)言敘述相對(duì)來(lái)講比較簡(jiǎn)單,或者不同的人理解時(shí)會(huì)產(chǎn)生歧義。因此,在進(jìn)行設(shè)計(jì)之前,最重要的是充分分析和理解問(wèn)題,明確問(wèn)題任務(wù):要求做什么,限制條件是什么。注意:這個(gè)步驟強(qiáng)調(diào)的是做什么,而不是怎么做。所以,在對(duì)問(wèn)題進(jìn)行描述時(shí)應(yīng)避開(kāi)算法和所涉及的數(shù)據(jù)類(lèi)型,而是對(duì)所需完成的任務(wù)作出明確的回答。明確規(guī)定:
輸入的形式和值的范圍;
輸出的形式和值的范圍;
程序所能達(dá)到的功能;
準(zhǔn)備測(cè)試數(shù)據(jù):包括正確的輸入及其輸出結(jié)果和非法的輸入及其輸出結(jié)果;
提交相應(yīng)階段文檔。
2) 結(jié)構(gòu)設(shè)計(jì)與算法設(shè)計(jì)。
在設(shè)計(jì)這一步驟中,按照以數(shù)據(jù)結(jié)構(gòu)為中心的原則劃分模塊,對(duì)問(wèn)題描述中涉及到的操作對(duì)象定義相應(yīng)的數(shù)據(jù)類(lèi)型,并按照算法所要達(dá)到的功能劃分模塊,定義主程序模塊和各抽象數(shù)據(jù)類(lèi)型;定義主程序的流程以及各程序模塊之間的層次(調(diào)用)關(guān)系。在此基礎(chǔ)上,寫(xiě)出算法框架。算法設(shè)計(jì)時(shí)考慮的因素較多,這一步的工作將直接影響最終程序的性能和執(zhí)行效率。要綜合考慮系統(tǒng)功能,系統(tǒng)結(jié)構(gòu)要簡(jiǎn)單、合理、清晰并且易于調(diào)試。設(shè)計(jì)算法過(guò)程中,圍繞原則:正確性、可讀性、健壯性、高效率和低存儲(chǔ)量,提交相應(yīng)項(xiàng)目規(guī)劃文檔。
3) 詳細(xì)設(shè)計(jì)和編碼。
詳細(xì)設(shè)計(jì)的目的是對(duì)算法設(shè)計(jì)的進(jìn)一步求精。實(shí)現(xiàn)算法設(shè)計(jì)中定義的所有數(shù)據(jù)類(lèi)型,用IF、WHILE和賦值語(yǔ)句等對(duì)每個(gè)操作按照算法規(guī)范只需要用偽代碼表示過(guò)程或函數(shù)。利用偽代碼的目的是避免過(guò)早陷入語(yǔ)言細(xì)節(jié)。最后再對(duì)詳細(xì)設(shè)計(jì)的結(jié)果進(jìn)一步求精,用高級(jí)語(yǔ)言表示出來(lái)。
編碼時(shí)要考慮如何編寫(xiě)才能較快地完成調(diào)試是特別要注意的問(wèn)題。一般地,每個(gè)子程序(或過(guò)程、函數(shù))通常不要太長(zhǎng),不要超過(guò)40行為宜,最長(zhǎng)不要超過(guò)60行,必要時(shí)可再分割成較小的過(guò)程,子程序(或過(guò)程、函數(shù))包含的程序行數(shù)太多,易于造成理解上的困難??刂苅f、while 等語(yǔ)句的連續(xù)嵌套的深度,分支過(guò)多時(shí)應(yīng)考慮使用switch語(yǔ)句。對(duì)每一段程序完成的功能和重要變量都應(yīng)加以注釋?zhuān)@會(huì)對(duì)程序的調(diào)試提供很多方便。另外,根據(jù)情況可以在程序中設(shè)立若干調(diào)試點(diǎn),可以輸出若干提示信息,用于驗(yàn)證和自己的設(shè)想是否一致。對(duì)于必要的輸入輸出,必須對(duì)它們的作用加以注釋說(shuō)明,否則,在調(diào)試程序時(shí)無(wú)法了解需要輸入什么,輸出的又是什么。同時(shí),一定要按格式書(shū)寫(xiě)程序,分清每條語(yǔ)句的層次,便于發(fā)現(xiàn)語(yǔ)法錯(cuò)誤。
4) 靜態(tài)檢查。
在上機(jī)前,學(xué)生需要將程序編碼以高級(jí)語(yǔ)言文本的形式實(shí)現(xiàn),自己對(duì)程序先做認(rèn)真的靜態(tài)檢查。大多數(shù)初學(xué)者編好程序后處于以下兩種狀態(tài)之一:一是對(duì)自己“精心制作的程序”的正確性深信不疑;另一種則是認(rèn)為上機(jī)前的任務(wù)已經(jīng)完成,尋找錯(cuò)誤是上機(jī)的工作,這兩種態(tài)度都是不可取的。對(duì)初學(xué)者來(lái)說(shuō),當(dāng)編寫(xiě)的程序長(zhǎng)度超過(guò)40行時(shí),通常大多會(huì)含有語(yǔ)法錯(cuò)誤或邏輯錯(cuò)誤,上機(jī)動(dòng)態(tài)調(diào)試絕對(duì)代替不了靜態(tài)檢查,否則調(diào)試的效率將是極低的。靜態(tài)檢查一般有兩種方法:一是用一組測(cè)試數(shù)據(jù)手動(dòng)執(zhí)行程序(通常先檢查單個(gè)模塊);二是通過(guò)與同學(xué)一起或給別人講解自己的程序而深入全面地理解程序的邏輯。
5) 上機(jī)準(zhǔn)備和上機(jī)調(diào)試程序。
上機(jī)準(zhǔn)備應(yīng)做到以下幾個(gè)方面:首先,熟悉機(jī)器的用戶(hù)手冊(cè);其次,熟悉高級(jí)語(yǔ)言用戶(hù)手冊(cè)或程序設(shè)計(jì)指導(dǎo)書(shū);熟悉最常用的命令;最后,掌握好調(diào)試工具,考慮調(diào)試方案。如果機(jī)器上沒(méi)有現(xiàn)成的調(diào)試工具可供利用,可以自己先設(shè)計(jì)一些以供使用。上機(jī)調(diào)試時(shí)分模塊進(jìn)行,應(yīng)該做到自底向上,先調(diào)試底層模塊(過(guò)程或函數(shù)),再調(diào)試上層模塊,必要時(shí)可另寫(xiě)一個(gè)調(diào)用驅(qū)動(dòng)程序。這種表面看上去麻煩的工作實(shí)際上可以大大降低調(diào)試所面臨的復(fù)雜性,從而提高調(diào)試的工作效率。調(diào)試過(guò)程中遇到的各種異常現(xiàn)象往往是預(yù)料不到的,此時(shí)不要糾結(jié),應(yīng)該借助系統(tǒng)提供的調(diào)試工具確定錯(cuò)誤,最后,整個(gè)程序進(jìn)行聯(lián)調(diào)。調(diào)試正確后,認(rèn)真整理源程序及其注釋?zhuān)瑢в型暾⑨屒腋袷搅己玫脑闯绦蚯鍐?、測(cè)試用例和運(yùn)行結(jié)果加以打印輸出。
6) 實(shí)習(xí)報(bào)告的整理。
最后是實(shí)習(xí)報(bào)告的整理。在程序開(kāi)發(fā)過(guò)程中,逐步形成各種必要的文檔及資料。主要包括以下幾個(gè)部分的工作:首先進(jìn)行需求及規(guī)格說(shuō)明 ,進(jìn)行問(wèn)題描述,弄清求解的問(wèn)題是什么;其次,說(shuō)明存儲(chǔ)結(jié)構(gòu)、主要的算法設(shè)計(jì)思想,并進(jìn)行子程序(過(guò)程或函數(shù))的規(guī)格說(shuō)明,通過(guò)調(diào)用關(guān)系圖表示它們之間的調(diào)用關(guān)系;第三,在詳細(xì)設(shè)計(jì)過(guò)程中,主要算法的框架要能夠?qū)崿F(xiàn);第四,形成用戶(hù)手冊(cè),進(jìn)行程序的使用說(shuō)明,并用調(diào)試報(bào)告來(lái)體現(xiàn)問(wèn)題是如何解決的;最后,認(rèn)真進(jìn)行實(shí)習(xí)總結(jié),在調(diào)試過(guò)程中與同學(xué)之間的討論和分析、對(duì)程序的改進(jìn)設(shè)想、收獲的經(jīng)驗(yàn)與體會(huì)、主要算法的時(shí)空復(fù)雜度等方面都可以寫(xiě)進(jìn)報(bào)告中。做好這一步工作非常重要,通過(guò)整理和填寫(xiě)實(shí)習(xí)報(bào)告的過(guò)程,學(xué)生能夠更深刻的認(rèn)識(shí)到自己在實(shí)驗(yàn)中存在的問(wèn)題,加強(qiáng)自身設(shè)計(jì)思維的訓(xùn)練,也能不斷提高和積累解決實(shí)際問(wèn)題的動(dòng)手能力,是學(xué)生對(duì)自身進(jìn)行修正和完善的過(guò)程[4]。
3 結(jié)語(yǔ)
以上是數(shù)據(jù)結(jié)構(gòu)這門(mén)課程經(jīng)過(guò)多年教學(xué)經(jīng)驗(yàn)總結(jié)形成的具體的實(shí)習(xí)步驟規(guī)范。掌握數(shù)據(jù)結(jié)構(gòu)和算法的基本理論是很重要的,同時(shí)利用面向?qū)ο蟮姆椒ǎM(jìn)行數(shù)據(jù)抽象、設(shè)計(jì)抽象數(shù)據(jù)類(lèi)型,編寫(xiě)優(yōu)美的程序的能力訓(xùn)練同樣是非常必要的。這對(duì)于進(jìn)一步引導(dǎo)同學(xué)獨(dú)立完成和解決工程實(shí)踐中的數(shù)據(jù)結(jié)構(gòu)和算法的問(wèn)題,靈活運(yùn)用所學(xué)的理論知識(shí),做到融會(huì)貫通,是很有意義的。目前在教授該課程時(shí),要求學(xué)生能夠做到正確利用實(shí)習(xí)步驟規(guī)范,以此來(lái)提高學(xué)生算法設(shè)計(jì)與分析的技能以及上機(jī)實(shí)踐的效率,真正達(dá)到理論與實(shí)踐的統(tǒng)一,培養(yǎng)學(xué)生科學(xué)的工作作風(fēng)和動(dòng)手能力,效果不錯(cuò)。
參考文獻(xiàn):
[1] 顧翔.“數(shù)據(jù)結(jié)構(gòu)”實(shí)踐教學(xué)探討[J]. 信