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