畢業(yè)設計(論文)C++數(shù)據(jù)結構算法演示系統(tǒng)設計_第1頁
畢業(yè)設計(論文)C++數(shù)據(jù)結構算法演示系統(tǒng)設計_第2頁
畢業(yè)設計(論文)C++數(shù)據(jù)結構算法演示系統(tǒng)設計_第3頁
畢業(yè)設計(論文)C++數(shù)據(jù)結構算法演示系統(tǒng)設計_第4頁
畢業(yè)設計(論文)C++數(shù)據(jù)結構算法演示系統(tǒng)設計_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、摘要數(shù)據(jù)結構算法演示系統(tǒng)數(shù)據(jù)結構在計算機科學中是一門綜合性的專業(yè)基礎課,它不僅設計到計算機硬件(特別是編碼理論、存儲裝置和存取方法等)的研究范圍,而且和計算機軟件的研究有著更密切的關系,無論是編譯程序還是操作系統(tǒng),都涉及到數(shù)據(jù)元素在存儲器中的分配問題。在研究信息檢索時也必須考慮如何組織數(shù)據(jù),以便查找和存取數(shù)據(jù)元素更方便。因此,它是介于數(shù)學、計算機硬件和計算機軟件三者之間的一門核心課程。在計算機科學中,數(shù)據(jù)結構不僅是一般程序設計的基礎,而且是設計和實現(xiàn)編譯程序、操作系統(tǒng)、數(shù)據(jù)庫系統(tǒng)及其他系統(tǒng)程序和大型應用程序的重要基礎。本文充分利用c+ builder的rad優(yōu)點,設計并建立了一套數(shù)據(jù)結構算法的

2、演示系統(tǒng)。講解了線性表、堆棧和隊列、樹、圖等數(shù)據(jù)結構的概念,該系統(tǒng)具有操作便捷、形象生動等特點,對于深化對數(shù)據(jù)結構算法的理解,提高計算機程序設計水平具有很好的促進作用,而且具有一定的實用價值,能有效地改善數(shù)據(jù)結構算法教學的質量和效率,對于其他類似系統(tǒng)也有很大的借鑒意義。關鍵字:數(shù)據(jù)結構;算法;c+ builderabstractdata structure algorithms demonstration systemdata structures,is a comprehensive professional foundation courses in computer science, n

3、ot only to studied computer hardware design (especially coding theory, storage devices and visit methods), and researched computer software in closer relationship, whether translation or operating system, data elements are involved in the allocation of memory. in information retrieval research, data

4、 must also consider how to organize in order to identify the data elements and visit more convenient. therefore, it is a door core curriculum between mathematics, computer hardware and computer software. in computer science, data structure is not only the basis for general programming, but also the

5、design and realization of heavy editing procedures, operating systems, database systems and other systems procedures and the essential foundation for large-scale applications.the full use of the rad advantage c+ builder design and build a data structure algorithms demonstration system. on the linear

6、 tables, duizhan and britain, trees, maps, and other data structure concept, the system has operated convenient, vivid image characteristics of the data structure to deepen the understanding of algorithms to improve the level of computer programming in good catalyst, but with some practical value to

7、 effectively improve data structure algorithms teaching quality and efficiency for other similar systems.key words: data structure;algorithms;c+ builder目 錄1 緒論12 需求分析22.1 解決問題22.2 具備功能23 系統(tǒng)設計33.1 開發(fā)及使用環(huán)境33.2 系統(tǒng)結構103.3 詳細設計124 系統(tǒng)操作284.1 主菜單操作284.2 線性表操作284.3 樹操作294.4 算法說明操作30結束語30謝 辭32參考文獻33附錄34附錄a 外

8、文翻譯原文部分34附錄b 外文翻譯譯文部分40附錄c 源代碼46 1 緒論數(shù)據(jù)結構是在整個計算機科學與技術領域上廣泛被使用的術語。它用來反映一個數(shù)據(jù)的內部構成,即一個數(shù)據(jù)由那些成分數(shù)據(jù)構成,以什么方式構成,呈什么結構。數(shù)據(jù)結構有邏輯上的數(shù)據(jù)結構和物理上的數(shù)據(jù)結構之分。邏輯上的數(shù)據(jù)結構反映成分數(shù)據(jù)之間的邏輯關系,而物理上的數(shù)據(jù)結構反映成分數(shù)據(jù)在計算機內部的存儲安排。數(shù)據(jù)結構是數(shù)據(jù)存在的形式。 數(shù)據(jù)結構是信息的一種組織方式,其目的是為了提高算法的效率,它通常與一組算法的集合相對應,通過這組算法集合可以對數(shù)據(jù)結構中的數(shù)據(jù)進行某種操作。數(shù)據(jù)結構課程的主要目的是介紹一些常用的數(shù)據(jù)結構,闡明數(shù)據(jù)結構內在的

9、邏輯關系,討論它們在計算機中的存儲表示,并結合各種數(shù)據(jù)結構,討論對它們實行的各種運算的實現(xiàn)算法。很多算法實際上是對某種數(shù)據(jù)結構施行的一種變換,研究算法也就是研究在實施變換過程中數(shù)據(jù)結構的動態(tài)性質。數(shù)據(jù)結構,作為計算機學科的基礎性專業(yè)課程,其在計算機科學中的及其重要,課程學習的好壞,直接關系到學員后期計算機水平的高低。而這門課程一直因為過于抽象,難以理解,而讓人望而止步。如果能夠把這門抽象的課程變得具體而生動,必將提高學習人員興趣,增加其積極性和主動性,也有利于人員的對此課程的學習?;谶@些目的,我們開發(fā)了這個數(shù)據(jù)結構算法演示系統(tǒng),數(shù)據(jù)結構是我們所做的系統(tǒng)的主要理論基礎,我們完成了線性表、堆棧、

10、隊列、樹、圖幾個主要結構,在學習數(shù)據(jù)結構這門課程的時候,我們了解了這些結構的算法,當時也做過一些相關的程序,在此基礎之上,我運用c+ builder開發(fā)工具,把這些算法演示出來。數(shù)據(jù)結構算法演示系統(tǒng)可以演示線性表、堆棧、隊列、樹、圖等幾個基礎結構的算法,輔助一些算法說明,讓使用者更好地掌握算法,在幫助中把演示的具體過程和操作做詳細的介紹。 該系統(tǒng)具有操作簡單、形象生動,能很好地改善人員對數(shù)據(jù)結構課程的學習理解,從很大程度上提高人員的學習質量和效率。2 需求分析2.1 解決問題做為一個數(shù)據(jù)結構演示系統(tǒng),首先我們確定要演示的內容,在本系統(tǒng)中,我們對線性表、堆棧和隊列、樹、圖幾個主要數(shù)據(jù)結構做了講解

11、;接著,對四種算法的說明也是必不可少的,這樣配合演示,可以達到更好地效果;最后,作為我們設計的演示過程,使用者對操作不是太了解,我們有必要做個詳細的操作過程,讓使用者更好地操作系統(tǒng)。2.2 具備功能系統(tǒng)由數(shù)據(jù)結構、操作、幫助、程序四個部分組成?,F(xiàn)分述如下:數(shù)據(jù)結構由線性表、堆棧和隊列、樹、圖等四個部分組成,分別對應數(shù)據(jù)結構的四個部分。線性表又分為鏈表概念、鏈表模型、鏈表操作、雙向鏈表四個部分,堆棧和隊列分為基本堆棧、基本隊列、循環(huán)隊列三個部分,樹分為數(shù)據(jù)二叉樹、結構二叉樹、類二叉樹,圖分為圖表示、圖搜索、最短路徑。操作由線性表說明、堆棧說明、隊列說明、樹說明、圖說明組成,對各數(shù)據(jù)結構的算法說明

12、。幫助由關于和幫助組成,是本系統(tǒng)的一些說明和對演示過程的操作詳細說明。程序部分由退出組成,完成系統(tǒng)的終止。3 系統(tǒng)設計3.1 開發(fā)及使用環(huán)境 c+ builder3.1.1 c+ builder介紹提起borland c/c+,相信業(yè)界的許多朋友都會感慨萬千,因為它曾帶領很多人跨進了windows開發(fā)的大門。和美國inprise公司(原borland公司)其他面向企業(yè)分布式系統(tǒng)的開發(fā)工具(如delphi 、jbuilder )相比,新近推出的最新版本c+ rad(快速應用開發(fā))工具borland c+ builder 4,無論是在開發(fā)環(huán)境、分布式應用系統(tǒng)開發(fā)、支持已有c+資源方面,還是在快速開

13、發(fā)web及internet應用程序、數(shù)據(jù)庫處理等方面,都表現(xiàn)出了其獨特的一面。(1)全新的集成開發(fā)環(huán)境c+ builder保留了使用framework(如:owl、mfc)的開發(fā)方式,融合了visual basic、delphi等開發(fā)工具的面向組件的開發(fā)方式。c+ builder的集成開發(fā)環(huán)境提供了120多個vcl組件,使開發(fā)人員不需太多編碼,就能夠實現(xiàn)很多復雜的功能,體現(xiàn)了軟件的“重用性”原則。c+ builder的用戶界面也非常友好,易于使用,并且采用了停駐式(docking)工具條,可以自由組合集成開發(fā)環(huán)境窗口和工具條的排放方式。在編碼過程中,還可以使用codeexplorer技術對源代

14、碼進行管理。codecompletion技術使編譯器能夠自動列出vcl組件的可用屬性和方法供程序員選擇,而不必手工輸入冗長的代碼。c+ builder的集成開發(fā)環(huán)境如圖1所示。(2)簡化了分布式應用系統(tǒng)的開發(fā)企業(yè)向多層分布式系統(tǒng)跨越已經(jīng)成為了一種必然趨勢,目前分布式運算標準主要有microsoft 的dcom和omg的corba,是否支持這兩種標準決定了開發(fā)工具的適用領域和范圍。c+ builder可以說是目前唯一同時支持corba和com的c+集成開發(fā)環(huán)境,因此既適用于基于orb的分布式開發(fā),又適用于基于com的windows開發(fā)。c+ builder內置了visibroker3。3,它是目

15、前全球分發(fā)數(shù)量最多的corba orb,并且包含了event service和namingservice等標準corba服務,從而為開發(fā)corba應用提供了可能。c+ builder 將corba idl 編譯器集成在其開發(fā)環(huán)境中,通過配合各種向導(wizard),可以快速生成corba client和server的源程序代碼框架,這對于開發(fā)corba產(chǎn)品的朋友來說,確實是非常方便的。圖2顯示了c+ builder中建立corba對象的各種向導。在microsoft com方面,c+ builder 同樣提供了各種向導,可以一步生成com標準組件、ole automation組件及active

16、x組件,您可以在windows環(huán)境下大顯身手。 c+ builder 提供的midas2同時支持corbaiiop、dcom、dce rpc以及tcp/ip等多種連接方式,適用于分布式系統(tǒng)的開發(fā)。比如,非windows環(huán)境上的java應用程序,可以通過corba iiop使用c+ builder開發(fā)出來的應用程序服務器。從而使用戶可以在原有系統(tǒng)基礎之上構建跨平臺、跨程序語言的分布式應用系統(tǒng)。(3)對已有c+資源的支持用戶可能會關心,對于過去開發(fā)的基于borland c+ owl和microsoft mfc的程序,c+ builder是否能夠兼容?回答是肯定的。c+ builder的另一特性就是

17、提供了mfc4。2版的函數(shù)庫,強化了對microsoft visual c+源代碼的兼容性,可以直接編譯msdn與各種sdk中的范例程序。通過mfc向導,還可以生成mfc的代碼框架。除此之外,c+ builder能夠編譯原有的borlandc+ owl程序碼,因此就不必擔心以前的工作白做了!c+ builder中提供了符合ansi/iso標準的c+編輯器,還能夠開發(fā)可移植于非windows平臺的c+程序。(4)快速開發(fā)web及internet應用程序目前,基于internet的開發(fā)已經(jīng)成為一種時尚。c+ builder在開發(fā)web及internet應用方面的功能也非常強大。c+ builder

18、提供了21個internet通信協(xié)議組件,用于internet應用程序的開發(fā)。開發(fā)人員可以建立“零配置”、基于web瀏覽器的“瘦客戶”應用程序。c+ builder同時支持cgi、wincgi、isapi及nsapi等標準,使開發(fā)人員利用現(xiàn)有的開發(fā)技術就可以用可視化的方式開發(fā)跨平臺的web應用程序。運用activeform/atl及webdeploy技術,還可以實現(xiàn)activex組件的web分發(fā)。(5)強大的數(shù)據(jù)庫處理功能c+ builder提供了對oracle8、microsoft sqlserver 7、informix 9、sybase、ibm db 2 universalserver、

19、interbase 5。5等大型數(shù)據(jù)庫的高速驅動程序,并支持oracle8的對象關聯(lián)延伸功能(如圖3所示),如abstract data type、nested tables、variable lengtharrays、object pointers(refs)及external filereference等。同時c+ builder還保留了對microsoftaccess 97、foxpro、visual dbase及paradox等本地數(shù)據(jù)庫的處理能力。因此,無論是大型的數(shù)據(jù)庫應用系統(tǒng)開發(fā),還是小型的數(shù)據(jù)庫管理系統(tǒng),c+ builder都有其用武之地。c+ builder還提供了mts 組

20、件向導,用于快速生成支持microsoft transaction server的com組件。bderesource dispenser使用戶可以在mts中使用bde存取數(shù)據(jù)庫,保證了mts對數(shù)據(jù)庫的兩階段提交(two phasecommit)及資源管理的能力。(6)強大的調試功能c+ builder強化了原有的module view、eventlog view及inspect local variable等調試窗口的功能,并在windows nt環(huán)境中提供多線程調試的新功能,使用戶可以在某一特定過程中跟蹤程序代碼。c+ builder針對多層分布式開發(fā)環(huán)境提供了遠程調試能力,開發(fā)人員可以通過

21、網(wǎng)絡直接對遠端的應用程序服務器進行調試,從而簡化了多層應用系統(tǒng)的開發(fā)和維護工作。(7)其他特點c+ builder還有很多新增的功能,如:針對windows 98提供了pagescroller、monthcalendar等windows 98格式的新組件,并支持windows98的多重屏幕顯示功能及microsoft office97格式的選擇選單和停駐式(docking)工具條。對界面的處理上,可以控制窗口的最大/最小尺寸以及窗口尺寸變動時其中組件的相對位置和比例,等等。總之,c+ builder 的強大功能并不是通過筆者有限的介紹所能夠涵蓋的,在c+海洋里遨游的朋友不妨親自嘗試一下c+ b

22、uilder,體驗一下它的靈活與強大,相信您定會“戀戀不舍”的。3.1.2 c+ builder與visual c+對比首先,從它們的應用程序框架(application frame,有時也稱為對象框架)進行比較。visual c+采用的框架是mfc。mfc不僅僅是人們通常理解的一個類庫。(同樣,del phi和c+builder使用的vcl的概念也不僅僅是一個控件庫。)你如果選擇了mfc,也就選擇了一種程序結構,一種編程風格。mfc早在windows 3.x的時代就出現(xiàn)了,那時的visual c+還是16位的。經(jīng)過這些年的不斷補充和完善,mfc已經(jīng)十分成熟。但由于原型出現(xiàn)得比較早,mfc相比

23、于vcl落后了一個時代。盡管微軟對mfc的更新沒有停止,我也經(jīng)常讀到持只要windows不過時,mfc就不會過時之類觀點的文章,但就象inprise(原borland)的owl框架的淡出一樣,mfc的淡出也是早晚的事。如果mfc青春永駐,微軟的開發(fā)人員也不會私自開發(fā)出基于atl的wtl呀。當然,wtl的地位不能和mfc比,它并不是微軟官方支持的框架,封裝的功能也相當有限。但至少也反襯出了mfc存在的不足。 我以為,最能體現(xiàn)一個應用程序框架的先進性的是它的委托模型,即對windows消息的封裝機制。(對windows api的封裝就不用說了吧。大同小異,也沒什么技術含量。 如果高興,你也可以自己

24、寫一個類庫來封裝。但對windows消息驅動機制的封裝就不是那么容易的了。)最自然的封裝方式是采用虛成員函數(shù)。如果要響應某個消息就重載相應的虛函數(shù)。但出乎我的意料,mfc采用的是古老的宏定義方法。用宏定義方法的好處是省去了虛函數(shù)vtable的系統(tǒng)開銷。(由于windows的消息種類很多,開銷不算太小。)不過帶來的缺點就是映射不太直觀。好在較新版本vc帶的classwizard可以自動生成消息映射代碼,使用起來還是比較方便的。但和vcl的委托模型相比,mfc的映射方法就顯得太落后了。而c+builder對c+語言進行了擴展,以便引入組件、事件處理、屬性等新特性。由于功夫做在編譯器級,生成的源代碼

25、就顯得十分簡潔。但是由于擴展的非標準特性,使用vcl的c+builder的源代碼無法被其它編譯器編譯。而mfc的功夫做在源代碼級,雖然消息映射代碼較為復雜且不直觀,但兼容性非常好。只要你有mfc庫的源代碼(隨vc企業(yè)版的光盤提供),你的mfc程序理論上用任何符合ansi標準的編譯器均可編譯通過。c+builder 3以上版本可以原封不動直接編譯visual c+程序,很多人認為這是c+builder的兼容性好,實際上很大程度應歸功于mfc的兼容性好。微軟辛辛苦苦用標準方法寫mfc,卻為對手制造了方便。不知他們作何感想?而因為c+builder對語言作了擴展,vc不能編譯c+builder的程序

26、??磥碓谶@方面vc要輸給c+builder了。而且vcl所支持的組件、屬性等都是mfc所缺乏的特性。雖然vc也能支持組件,但要通過appwizard先生成一個包裹類(wrapper),不如vcl來得簡潔。有很多人使用c+builder就是沖著控件板上那一大堆組件來的,vc雖然能使用的組件也很多(也許不比c+builder少),但由于不方便而對rad程序員沒有吸引力。 c+builder的vcl比visual c+的mfc先進的另一個特性是異常處理。但令人啼笑皆非的是,它的異常處理代碼有bug,有時會無端拋出異常。不知道在最新的版本中有沒有改正了。而vc的框架mfc也不是一無是處。經(jīng)歷了那么多年

27、的發(fā)展和完善,mfc功能非常全面,而且十分穩(wěn)定,bug很少。其中你可能遇到的bug更少。而且有第三方的專門工具幫助你避開這些bug。如此規(guī)模的一個類庫,能做到這一點不容易。不要小看了這一點,很多專業(yè)程序員就是為這個選擇vc的。而c+builder的vcl的bug就相對較多了,而且有些它自己帶的示例程序都有錯誤??磥韎nprise還有很長的路要走。 再從它們的易用性比較。vc有classwizard、sourcebrowser等一系列工具,還附帶visual sourcesafe、visual modeler等強大的工具,易用性非常好。(vc自帶建模工具visual modeler,也許說明了它

28、才是工程級的開發(fā)平臺,與c+builder的定位不同。)它所帶的msdn這部開發(fā)者的百科全書更是讓你沒有找不到的,只有想不到的。而且它的autocomplete之類小功能也比c+builder要體貼。c+builder的新版本雖然也提供了這一功能,但它的提示要等好幾秒才出來,有時你不經(jīng)意間把鼠標停在某一處,也要等硬盤響好幾秒,這可是在566mhz的賽揚ii上呀。不要笑我瑣碎,有時一個開發(fā)工具的成熟和易用,就是從這些小地方體現(xiàn)出來的。c+builder作為rad工具,理應強調易用性。但與vc相比還顯出不成熟。這是不應該的。 再來看看它們的可移植性。inprise正在開發(fā)c+builder和del

29、phi的linux版本, 代號為kylix。也許通過kylix,用vcl構架編寫的windows程序向linux移植成為可能。但這只是可能。因為在目前inprise的兼容性工作做得并不好。c+builder可以編譯vc程序還要多謝微軟使用標準方法寫mfc,而它自己各個版本之間兼容性卻不太好。低版本的c+builder不能使用高版本的vcl組件(這還別去說它),而高版本的c+builder竟然不能使用低版本的vcl組件。真是豈有此理,我很少看見軟件有不向下兼容的。如果windows 98不能運行95的程序,windows 95不能運行3.x的程序,win 3.x不能運行dos程序,你 還會用wi

30、ndows嗎?如果不是c+builder的其它某些方面太出色,光是這個向下不兼容就足以讓我拋棄它。而且雖說通過捆綁編譯器,c+builder可以編譯delphi的object pascal代碼,但c+builder仍不能使用為delphi開發(fā)的vcl組件。所以一個組件有for d1/d 2/d3/d4/d5/c1/c3/c4/c5這些不同版本是常有的事,而且隨著c+builder版本的升級可 能還會增加。希望inprise能先解決同門兄弟的兼容性問題。而微軟的vc就沒有這類問題 mfc1.0的程序也可以毫無障礙地在vc6.0下編譯通過。 再來看看它們的前景吧。實際上,技術的進步在很多時候是此消

31、彼長的。當初borland的turbo c和borland c+幾乎是唯一的選擇。微軟的quick c(現(xiàn)在還有人知道這個產(chǎn)品嗎?)和microsoft c/c+從來也沒有成為過主流。但borland c+又流行了多少年呢?不久就被新崛起的microsoft visual c/c+壓下去了?,F(xiàn)在的c+builder又有后來居上的態(tài)勢,如果穩(wěn)定性再提高一些,bug再少一些,有希望成為主流。但inspires的總體實力不及微軟,這也是無可爭議的。從c+builder 5的release notes中的known issues部分,以及它們的幫助文檔的規(guī)模和質量都可以看出。(哪個同類產(chǎn)品的幫助文檔能

32、和msdn比呢?)inprise公司應從netscape吸取教訓,不要讓c+builder成為第二個netscape communicator。(communicator也是一度技術領先,甚至曾占據(jù)了大部分的瀏覽器市場,但似乎后勁不足,而且 6.0 pr1、2中bug多多,現(xiàn)在被ie壓得抬不起頭。)c+builder是inspires的旗艦產(chǎn)品之一,前景應當還是比較樂觀的,而且inspires已經(jīng)在向linux進軍了,而微軟還遲遲沒有動作,難道非要到linux成燎原之勢(或許已經(jīng)成燎原之勢了)才會奮起占領這個新興市場?似乎他們對linux的態(tài)度與幾年前對互聯(lián)網(wǎng)的興起的反應遲緩有些相似。但后來.

33、唉,真希望inprise不要步netscape的后塵。c+builder是一個很有前途的開發(fā)工具。遺憾的是,inprise公司delphi的創(chuàng)始人已經(jīng)跳槽到微軟去主持visual j+項目了。但愿對inprise沖擊不會太大。微軟的visual c+的前景又怎樣呢?visual studio 7.0不久就要推出了。不知能不能在保持穩(wěn)定性的同時在技術的先進性上趕上c+builder。另外,這一版本將加強網(wǎng)絡開發(fā)的特性??磥砦④涬m然被判解體,開發(fā)實力可是一點沒打折扣。 就技術(主要指應用框架)來說,c+builder目前領先于visual c+。但多多少少的不盡人意之處對inprise想說愛你不容

34、易。而vc盡管發(fā)展到今日已十分完善,但mfc框架已是明日黃花了。如果不使用mfc,目前又沒有合適的替代品。wfc是支持組件、屬性和事件的,但那是visual j+里邊用的;atl也很先進,但是用來進行com/activex開發(fā)的;基于atl的wtl也不錯,可惜是非官方作品,也未必比vcl先進。微軟最近提出了c#(讀作c sharp)語言方案,但那屬于和java同一類的東西。看來是金無足赤啊。根據(jù) 你的需要做選擇吧。實際上visual c+和c+builder也不是單單競爭關系。它們在許多領域并不重疊,甚至是互補的。到底怎樣取舍,要根據(jù)你的項目特性決定。如果你開發(fā)系統(tǒng)底層的東西,需要極好的兼容性

35、和穩(wěn)定性,選visual c+吧。你可以只調用windows的各種api,不用mfc。如果你寫傳統(tǒng)的windows桌面應用程序,visual c+的mfc框架是正統(tǒng)的選擇。如果你為企業(yè)開發(fā)數(shù)據(jù)庫、信息管理系統(tǒng)等高層應用(高層是相對于低層/底層而言的,不是說技術高級或低級。)而且有比較緊的期限限制,選c+builder比較好。如果你用的語言是object pascal,delphi是唯一的選擇(如果gnu pascal等免費編譯器不考慮的話)。如果你原先用delphi(object pascal語言),現(xiàn)在想改學 c+,應當先c+builder。熟悉的界面和相同的框架會讓你的轉軌事半功倍。 3.

36、1.3 bcb的調試程序的bugs越少,最終用戶對這個程序的評價越高。而開發(fā)人員事先對bugs的處理越多,最終用戶能提供的關于bugs的信息就越多,也越準確,這樣,開發(fā)人員在接到最終用戶反映之后,就能夠快速找到出現(xiàn)bugs的那部分代碼,并以最快速度發(fā)布程序的升級包。 (1)寫易讀的代碼 第一點,大概也是最重要的一點,就是寫干凈易讀的代碼。易讀的代碼是很有價值的。請想象一下,如果隨便掃視一眼代碼或注釋,就能立刻知道這段代碼的的作用,以及在寫代碼的時候為什么要這樣寫,當時的思路是什么,那么就可以節(jié)約大量時間。這樣的代碼,在寫的時候可能會稍稍慢一些,不過,當你調試程序時,就不會花上幾個小時來尋找bu

37、gs,相反,你可以快速,簡單的完成除錯工作。這時,你就會覺得多花一些時間使程序易讀是很值得的。所以,在寫程序的時候,應該養(yǎng)成自己的風格,或是讀一讀scott的關于代碼風格的文章。 (2)使用exceptions和exception的處理方法 除去一些少數(shù)的情況,開發(fā)人員不可能總是依靠于集成的調試工具。所以,學會用其它的方法來找到煩人的bugs是很重要的。一些重要的、處理的錯誤可能會在窗體之外發(fā)生。在c+標準制定出來之前的黑暗日子里,在程序里面發(fā)出發(fā)生錯誤的信號,通常是通過返回錯誤代碼完成的(現(xiàn)在這種方法仍然應用于ole技術和一些winapi函數(shù)),這樣的處理方法很容易就會被忽略。(比如說,你經(jīng)

38、常檢查winapi函數(shù)的返回值嗎?)所以,出現(xiàn)問題的可能性并不小。由于以上的原因,需要一個這樣的機制,它不能忽略這些錯誤,而且,這個機制應該能被我們控制和自定義的。在這樣的需求下,異常處理機制出現(xiàn)了。需要一個特殊的錯誤類型嗎?簡單,定義一個新的異常類型就行了(和定義一個類的方法差不多),然后拋出(throw)它。 c+builder定義了try catch () 機制。這和剛剛定義的異常機制的結構很相似。這個機制完全可以按照需要自定義。要使用異常處理了,只要把要執(zhí)行的代碼放到try塊里面,為了讓程序知道出現(xiàn)異常后應該做什么,還需要定義一個catch()或是_finally塊。catch()語句

39、里面可以指定一個要捕捉的類型或是變量,甚至可以用它來捕捉樹結構或是繼承類的異常,如果捕捉了基類的異常,它就能捕捉到繼承這個基類的所有的類的異常。比如,在vcl中,所有的異常都是繼承于exception類。所以,catch(exception& e)可以捕捉到除了esocketerror的所有vcl異常。為了讓這個機制更強大,c+builder中還定義了catch()語句。(沒錯,就是三個點)使用這條語句可以捕捉到所有的異常。還有更多的功能嗎?當然,你可以添加更多的catch()語句,可以向使用ifelse if語句那樣使用它。注意,在一系列的catch()語句中,錯誤不會被重復的捕捉,也就是說

40、,如果前面的catch()語句捕捉到了錯誤,后面的catch()語句將不會捕捉這條錯誤。 這個機制還有更多的功能。如果你想處理異常,但是不想在處理的位置停止,那么可以重新拋出異常。這時,程序將繼續(xù)尋找下一個catch()語句來處理這個異常。這個方法和“throw”差不多。這樣,你處理過的異常會再次被拋出,繼續(xù)尋找下一個catch語句來處理它。 最后一個要說的是_finally(這不是標準的用法,是borland添加的一個好方法),在_finally程序塊中代碼,無論是否發(fā)生異常都會被執(zhí)行。這是一個清理程序中使用new分配的本地變量,設置用作旗標的變量值為正常的好位置。(比如,把一個等待狀態(tài)的光

41、標圖標設置為正常光標。) 就是這些了。有時間的話,請看看c+builder幫助文件中的exception類以及繼承exception的類。這些將對于理解本節(jié)所說的內容有很大幫助。 (3)使用記錄機制 不可能總是用調試器來調試代碼,在某些情況下,可能無法使用內部集成的調試器,這時候,就不得不依靠其他手段調試程序了。(比如:windows nt服務程序,isapi/cgi程序,實時應用程序等等)。這時候,有經(jīng)驗的程序員可能會借助古老的調試方法,例如,使用一些分類的記錄機制來確定程序實際運行的過程?,F(xiàn)在有一系列的方法可以簡單的完成這樣的工作。下面將介紹3種方法。 第一個方法:outputdebugs

42、tring。(winapi: void outputdebugstring(lpctstr lpoutputstring);)很幸運,微軟徹底的實現(xiàn)了調試子系統(tǒng)。它包括的一些特點可能讓你想把自己的記錄系統(tǒng)扔掉。應用程序在調試器進程中運行時outputdebugstring將用c字符串把調試器輸出的信息打印出來。如果程序沒有在調試器進程中運行,它將忽略這些調用。它會很好的在客戶的機器上運行,不會彈出信息窗口。如果在發(fā)布給客戶的時候,忘記去掉這些代碼程序僅僅會變慢一點,不會有別的不良后果。 第二個方法:使用了gexperts,通過 dbugint.pas接口進行調試。它是個可以稱之為偉大的程序,你

43、可以把它分發(fā)給客戶。和outputdebugstring一樣,如果客戶沒有這個程序,它就根本什么也不作。(它會自動檢測機器上是否安裝了客戶端)。要使用dbugintf,它很容易被加入到你的工程中,加入#include dbugintf.hpp(要把它加入工程,然后會編譯它的pascal文件)。然后,你就可以直接使用senddebug(要送到記錄文件的字符串); 或者,你需要它更機警一些,可以使用senddebugex(它給tmsgdlgtype增加了一個新的消息類型)sendmethodenter, sendmethodexit, sendseparator等等(用法都差不多)。如果你打算給最

44、終用戶分發(fā)客戶端 (gdebug.exe),不要忘記include所需要的程序包。gexperts可以在 得到,它是免費的。 第三個方法:大概是最艱苦的方法,就是使用自己的記錄控制。這個方法可能不是想象的這么簡單??赡苁紫葧氲健霸诖绑w上扔一個richedit,把它設置為只讀的,然后往里面寫記錄”是這樣吧?理論上不錯,但是,實施起來首先,使用richedit控件來做記錄,會大大降低應用程序的速度,還會在內存中造成碎片,甚至丟失內存。通常,在運行10分鐘左右之后,會使整個計算機的速度變慢!所以,如果希望在自己的記錄中能夠使用彩色和圖標,那么最好自己創(chuàng)建

45、一個組件。如果沒有這么高的要求,那么有一個簡單有效的方法,就是使用listbox控件作記錄,把listbox的style屬性設置為lbownerdrawfixed,這樣句柄將會自繪。(gexperts的控制臺就是用這樣的方法制作的)。 (4)將記錄和異常處理結合使用 不用總是擔心可能會發(fā)生什么偶然的異常。一般來說,通過很多的bugs測試后(盡量折磨程序,看看它會不會崩潰),應用程序在運行是應該不會出現(xiàn)什么錯誤。下面的這個技術,建議組件開發(fā)者,在第一次把組件放在ide環(huán)境測試的時候,很應該遵守。一個在ide中產(chǎn)生的異常會導致很多問題,甚至可能無法重新啟動ide也不能恢復。這個技術很簡單。在代碼中

46、每一個函數(shù)或是主要的函數(shù)中加入: try /函數(shù)的代碼 catch(exception &e) senddebugmessage(“exception caught in classname:functionname of type:” +e.classname() +” with the message:”+e.message); ; 把字符串中classname 和 functionname 替換成相應的類名和函數(shù)名。在出現(xiàn)錯誤時,你會立刻知道錯誤發(fā)生的位置。這樣也就不至于強制重起ide的了。 classname()給了什么樣的幫助呢?它只是用于返回字符串“exception”嗎?每一次,

47、e都被聲明為異常類型?這是vcl另一個優(yōu)秀的地方,所有的類都從tobject繼承,所以,這些類都能自動獲得正確的類型和基類的類型,所有的更多的信息都可以在這里找到。(請參見tobject的幫助)所以,盡管使用了exception &e,其中的e.classname()將返回捕獲到的產(chǎn)生異常的實際類名。得到這些好處需要付出的代價是編譯出來的可執(zhí)行文件變大了一些。所有的delphi/cbuilder用戶都注意到了這一點,但是說沒有付出就沒有收獲。在http:/www.bytamin- 3.2 系統(tǒng)結構主菜單模塊由數(shù)據(jù)結構、操作、幫助、程序四個部分組成。數(shù)據(jù)結構模板由線性表、堆棧和隊列、樹、圖等四個

48、部分組成。線性表又分為鏈表概念、鏈表模型、鏈表操作、雙向鏈表四個部分,堆棧和隊列分為基本堆棧、基本隊列、循環(huán)隊列三個部分,樹分為數(shù)據(jù)二叉樹、結構二叉樹、類二叉樹,圖分為圖表示、圖搜索、最短路徑。操作模板由線性表說明、堆棧說明、隊列說明、樹說明、圖說明組成。幫助模板由關于和幫助組成。程序模塊由退出組成。系統(tǒng)的功能模塊如圖3-1所示。本系統(tǒng)是由我與另外一個同學合作完成的,根據(jù)系統(tǒng)的結構,我們對各自的任務做了明確的分工。我在本系統(tǒng)中所做的工作是:1、詳細分析了系統(tǒng)需求,提出了系統(tǒng)設計方案,并進行了論證;2、分析了rad設計方法的利弊,并選定了設計方案。3、主菜單、線性表、樹、操作四部分模塊的設計。

49、鏈表概念 鏈表模型退出程序鏈表操作雙向鏈表線性表基本堆?;娟犃卸褩:完犃袛?shù)據(jù)結構循環(huán)隊列數(shù)組二叉樹樹結構二叉樹操作二叉樹圖圖表示進入系統(tǒng)線性表說明圖搜索最短路徑操作堆棧說明隊列說明樹說明圖說明關于幫助幫助圖3-1 系統(tǒng)模塊圖3.3 詳細設計3.3.1 主菜單(1)主菜單主要由一個菜單控件、一個顯示文本、三個按紐、二個可供長文本輸入/出等七個控件組成。如圖3-2所示:圖3-2 主菜單的顯示圖(2)設計思想:開始作為一個演示系統(tǒng)的菜單,應給人一個直觀的感覺,有個醒目的標題,通過一個菜單控件,連接我們設計的各種數(shù)據(jù)結構的算法演示;兩個文本輸入,用于對算法的說明,輔助使用者對算法的學習;作為一個系統(tǒng)

50、,一個幫助模塊是不可缺少的。主菜單的流程圖如圖3-3所示。幫助操作數(shù)據(jù)結構程序線性表說明圖說明幫助關于樹說明隊列說明堆棧說明圖樹堆棧和隊列線性表退出圖3-3 主菜單流程圖(3)控件介紹:c+ builder的組件工具箱(component palette)提供各種制作組件的工具,包括文字標簽、文本框、圖象組件等。在本系統(tǒng)中,用到了mainmenu(建立主菜單)、popupmemu(建立彈出式菜單元件)、label(在窗體上顯示文本信息的工具)、edit(建立文本框的工具)、memo(可以讓用戶輸入文字信息,功能較文字標簽更多元化)、button(在窗體上建立命令按紐組件,在窗體上單擊此按紐時,

51、可以執(zhí)行對應的程序代碼)、listbox(在窗體建立列表框組件,提供數(shù)據(jù)選項)、combobox(它可建立下拉式列表,是列表框與文本框的組合)、scrollbar(用來建立滾動條組件)、groupbox(在窗體上建立框架組件)、radiogroup(建立選擇群組組件)、panel(存放其他組件的容器組件)、actionlist(存放執(zhí)行動作的組件);bitbin(可有圖標的按紐)、stinggrid(字符串)、image(顯示圖象圖片)、shape(基本圖形的建立)、bevel(建立邊框面板)、tabcontrol(建立標簽集)、imagelist(圖象序列)、richedit(多功能編輯)、

52、statusbar(狀態(tài)顯示)、timer(時間時間控制)這些組件。3.3.2 線性表模塊(1)在菜單中,我們通過調用winexec函數(shù),以執(zhí)行外部命令的方式,調用鏈表概念.exe程序,來完成鏈表概念的演示。源代碼如下: newfilename=extractfilepath(application-exename)+鏈表概念.exe; i=winexec(newfilename.c_str(),sw_shownormal); 在鏈表概念的實現(xiàn)中,比較數(shù)組與鏈表的區(qū)別,兩者最明顯的差別在于存儲空間的配置上,數(shù)組是固定配置存儲空間,因此存取上受到限制,如果超過范圍則會產(chǎn)生無法預期的狀況。此程序是

53、用一組地址連續(xù)的存儲單位依次存儲線性表的數(shù)據(jù)元素,以此實現(xiàn)線性表的順序存儲結構,這種存儲結構的線性表叫順序表。如圖3-4所示。圖3-4 鏈表概念顯示圖 圖3-5 鏈表概念流程圖開始輸入數(shù)據(jù)選擇按紐顯示鏈表順序退出結束(2)在菜單中,我們通過調用winexec函數(shù),以執(zhí)行外部命令的方式,調用鏈表模型.exe程序,來完成鏈表模型的演示。源代碼如下: newfilename=extractfilepath(application-exename)+鏈表模型.exe; i=winexec(newfilename.c_str(),sw_shownormal); 在鏈表模型的實現(xiàn)中,此程序是一個用c+類方

54、式編寫的鏈表模型。線性表的鏈式存儲結構的特點是用一組任意的存儲單元存儲線性表的數(shù)據(jù)元素(這組存儲單元可以是連續(xù)的,也可以是不連續(xù)的)。因此,為了表示每個數(shù)據(jù)元素與其直接后繼數(shù)據(jù)元素之間的邏輯關系,對數(shù)據(jù)元素來說,除了存儲其本身的信息之外,還需存儲一個指示其直接后繼的信息。根據(jù)以上思想,我設計該程序的運行頁面如圖3-6所示。圖3-6 鏈表模型顯示圖開始輸入內容選擇爭先奪后列席結束圖3-7 鏈表模型流程圖(3)在菜單中,我們通過調用winexec函數(shù),以執(zhí)行外部命令的方式,調用鏈表操作.exe程序,來完成鏈表操作的演示。源代碼如下: newfilename=extractfilepath(appl

55、ication-exename)+鏈表操作.exe; i=winexec(newfilename.c_str(),sw_shownormal); 在鏈表操作的實現(xiàn)中,此程序是鏈表的基本操作模型,在這種存儲結構中,容易實現(xiàn)線性表的某些操作, 在此程序中,我們重點實現(xiàn)了鏈表的插入和刪除。假設我們要在線性表的兩個數(shù)據(jù)元素a和b之間插入一個數(shù)據(jù)元素x,已知p為其鏈表存儲結構中指向接點a的指針,如圖3-8(a)所示:ababxpps(a)(b)圖3-8 在單鏈表中插入結點時指針變化狀況為插入數(shù)據(jù)元素x,首先要生成一個數(shù)據(jù)域為x的結點,然后插入在單鏈表中。根據(jù)插入操作的邏輯定義,還需要修改結點a中的指針域,令其指向結點x,而結點x中的指針域應指向結點b,從而實現(xiàn)3個元素a、b和x之間邏輯關系的變化。插入后的單鏈表如圖(b)所示。假設s為指向結點x的指針,則上述指針修改用語句描述即為:s-next=p-next ; p-next=s;反之,如圖3-9所示在線性表中刪除元素b時,為在單鏈表中實現(xiàn)元素a、b和c之間的邏輯關

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論