版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告</p><p> ( 2011 -- 2012 年度第 學(xué)期)</p><p> 課程名稱: </p><p> 題 目: </p><p> 院 系: </p
2、><p> 班 級(jí): </p><p> 學(xué) 號(hào): </p><p> 姓 名: </p><p> 指導(dǎo)教師: </p><p> 設(shè)計(jì)周數(shù):
3、兩周 </p><p> 日期:2012 年 月 日</p><p><b> 目錄</b></p><p><b> 一.設(shè)計(jì)目的3</b></p><p><b> 二、需求分析3</b></p><p> 2.1選題的意
4、義及背景3</p><p> 2.2 輸入/輸出形式和輸出值的范圍4</p><p><b> 三.概要設(shè)計(jì)4</b></p><p><b> 3.1設(shè)計(jì)思想4</b></p><p> 3.2函數(shù)間的關(guān)系4</p><p><b> 四、詳細(xì)
5、設(shè)計(jì)5</b></p><p> 4.1哈夫曼的主要結(jié)構(gòu)5</p><p> 4.1.1結(jié)構(gòu)定義5</p><p> 4.1.2主要函數(shù)聲明及功能描述6</p><p><b> 4.2源程序7</b></p><p> 4.2.1頭文件7</p>
6、<p> 4.2.2源文件8</p><p> 五.程序測(cè)試結(jié)果及問(wèn)題分析14</p><p> 5.1程序測(cè)試結(jié)果14</p><p> 5.2 問(wèn)題分析15</p><p><b> 六.總結(jié)15</b></p><p><b> 七.參考文獻(xiàn)16&
7、lt;/b></p><p><b> 一.設(shè)計(jì)目的</b></p><p> 數(shù)據(jù)結(jié)構(gòu)作為一門學(xué)科主要研究數(shù)據(jù)的各種邏輯結(jié)構(gòu)和存儲(chǔ)結(jié)構(gòu),以及對(duì)數(shù)據(jù)的各種操作。因此,主要有三個(gè)方面的內(nèi)容:數(shù)據(jù)的邏輯結(jié)構(gòu);數(shù)據(jù)的物理存儲(chǔ)結(jié)構(gòu);對(duì)數(shù)據(jù)的操作(或算法)。通常,算法的設(shè)計(jì)取決于數(shù)據(jù)的邏輯結(jié)構(gòu),算法的實(shí)現(xiàn)取決于數(shù)據(jù)的物理存儲(chǔ)結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)是信息的一種組織方式,其目的是
8、為了提高算法的效率,它通常與一組算法的集合相對(duì)應(yīng),通過(guò)這組算法集合可以對(duì)數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)進(jìn)行某種操作。</p><p> 在當(dāng)今信息時(shí)代,信息技術(shù)己成為當(dāng)代知識(shí)經(jīng)濟(jì)的核心技術(shù)。我們時(shí)刻都在和數(shù)據(jù)打交道。比如人們?cè)谕獬龉ぷ鲿r(shí)找最短路徑,在銀行查詢存款、通過(guò)互聯(lián)網(wǎng)查新聞、以及遠(yuǎn)程教育報(bào)名等,所有這些都在與數(shù)據(jù)發(fā)生關(guān)系。實(shí)際上,現(xiàn)實(shí)世界中的實(shí)體經(jīng)過(guò)抽象以后,就可以成為計(jì)算機(jī)上所處理的數(shù)據(jù)。</p>&l
9、t;p> 數(shù)據(jù)結(jié)構(gòu)課程主要是研究非數(shù)值計(jì)算的程序設(shè)計(jì)問(wèn)題中所出現(xiàn)的計(jì)算機(jī)操作對(duì)象以及它們之間的關(guān)系和操作的學(xué)科。數(shù)據(jù)結(jié)構(gòu)是介于數(shù)學(xué)、計(jì)算機(jī)軟件和計(jì)算機(jī)硬件之間的一門計(jì)算機(jī)專業(yè)的核心課程,它是計(jì)算機(jī)程序設(shè)計(jì)、數(shù)據(jù)庫(kù)、操作系統(tǒng)、編譯原理及人工智能等的重要基礎(chǔ),廣泛的應(yīng)用于信息學(xué)、系統(tǒng)工程等各種領(lǐng)域。</p><p> 學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)是為了將實(shí)際問(wèn)題中所涉及的對(duì)象在計(jì)算機(jī)中表示出來(lái)并對(duì)它們進(jìn)行處理。通過(guò)課程設(shè)計(jì)
10、可以提高學(xué)生的思維能力,促進(jìn)學(xué)生的綜合應(yīng)用能力和專業(yè)素質(zhì)的提高。通過(guò)此次課程設(shè)計(jì)主要達(dá)到以下目的:</p><p> 了解并掌握數(shù)據(jù)結(jié)構(gòu)與算法的設(shè)計(jì)方法,具備初步的獨(dú)立分析和設(shè)計(jì)能力;</p><p> 初步掌握軟件開(kāi)發(fā)過(guò)程的問(wèn)題分析、系統(tǒng)設(shè)計(jì)、程序編碼、測(cè)試等基本方法和技能;</p><p> 提高綜合運(yùn)用所學(xué)的理論知識(shí)和方法獨(dú)立分析和解決問(wèn)題的能力;<
11、;/p><p> 訓(xùn)練用系統(tǒng)的觀點(diǎn)和軟件開(kāi)發(fā)一般規(guī)范進(jìn)行軟件開(kāi)發(fā),培養(yǎng)軟件工作者所應(yīng)具備的科學(xué)的工作方法和作風(fēng)。</p><p><b> 二、需求分析</b></p><p> 2.1選題的意義及背景</p><p> 鍛煉我們的編碼能力,真正理解數(shù)據(jù)結(jié)構(gòu)的編碼思想,并且鍛煉我們的動(dòng)手能力和成員間的配合,提高程序編
12、寫能力。</p><p> 在信息傳遞時(shí),希望長(zhǎng)度能盡可能短,即采用最短碼。赫夫曼編碼的應(yīng)用,就是采用這種有效的數(shù)據(jù)壓縮技術(shù)可以節(jié)省數(shù)據(jù)文件的存儲(chǔ)空間和計(jì)算機(jī)網(wǎng)絡(luò)的傳送時(shí)間。</p><p> 2.2 輸入/輸出形式和輸出值的范圍</p><p> 輸入信息以加載存檔的reading.txt文件為方式,加載不成功,提示出錯(cuò)信息,加載成功后,系統(tǒng)對(duì)其編碼,并按照
13、選擇對(duì)各種相關(guān)信息存檔。</p><p><b> 三.概要設(shè)計(jì)</b></p><p><b> 3.1設(shè)計(jì)思想</b></p><p> 哈夫曼樹(shù)用鄰接矩陣作為存儲(chǔ)結(jié)構(gòu),借助靜態(tài)鏈表來(lái)實(shí)現(xiàn)遍歷。 </p><p> 利用多重結(jié)構(gòu)體的形式設(shè)計(jì)出所需的變量類型,還有基本的文件讀寫知識(shí),同時(shí)借
14、助九大子函數(shù)結(jié)合一個(gè)主函數(shù)設(shè)計(jì)了此課程內(nèi)容,第一部分為信息的讀寫及統(tǒng)計(jì);第二部分為哈夫曼樹(shù)及其編碼的建立,再將編碼信息寫進(jìn)文件;第三部分為給信息加密在寫進(jìn)文件,再對(duì)其翻譯。最后的主函數(shù)是整個(gè)程序的組織者,利用switch選擇循環(huán)將九大子函數(shù)聯(lián)系起來(lái),畫龍點(diǎn)睛。這樣整個(gè)程序的基本流程就出來(lái)了,再根據(jù)此流出設(shè)計(jì)出源程序。 </p><p><b> 3.2函數(shù)間的關(guān)系</b></p>
15、;<p><b> 程序流程:</b></p><p><b> 三大模塊:</b></p><p><b> 四、詳細(xì)設(shè)計(jì)</b></p><p> 4.1哈夫曼的主要結(jié)構(gòu) </p><p> 4.1.1結(jié)構(gòu)定義:</p><p&
16、gt; #define MAXVALUE 1000//定義最大權(quán)值</p><p> #define MAXBIT 100//定義哈夫曼樹(shù)中葉子結(jié)點(diǎn)個(gè)數(shù)</p><p> typedef struct</p><p><b> { </b></p><p> char data;//字符值</p&
17、gt;<p> int num;//某個(gè)值的字符出現(xiàn)的次數(shù)</p><p> }TotalNode; //統(tǒng)計(jì)結(jié)點(diǎn),包括字符種類和出現(xiàn)次數(shù)</p><p> typedef struct</p><p><b> { </b></p><p> TotalNode tot[300];//統(tǒng)計(jì)
18、結(jié)點(diǎn)數(shù)組</p><p> int num;//統(tǒng)計(jì)數(shù)組中含有的字符個(gè)數(shù)</p><p> }Total; //統(tǒng)計(jì)結(jié)構(gòu)體,包括統(tǒng)計(jì)數(shù)組和字符種類數(shù)</p><p> typedef struct</p><p><b> { </b></p><p> char mes[300
19、];//字符數(shù)組</p><p> int num;//總字符數(shù)</p><p> }Message; //信息結(jié)構(gòu)體,包括字符數(shù)組和總字符數(shù)</p><p> typedef struct{</p><p> int locked[500];//密碼數(shù)組</p><p> int num;//密碼總數(shù)<
20、;/p><p> }Locking; //哈夫曼編碼后的密文信息</p><p> typedef struct</p><p><b> { </b></p><p> char data;//字符</p><p> int weight;//權(quán)值</p><p
21、> int parent;//雙親結(jié)點(diǎn)在數(shù)組HuffNode[]中的序號(hào)</p><p> int lchild;//左孩子結(jié)點(diǎn)在數(shù)組HuffNode[]中的序號(hào)</p><p> int rchild;//右孩子結(jié)點(diǎn)在數(shù)組HuffNode[]中的序號(hào)</p><p> }HNodetype; //哈夫曼樹(shù)結(jié)點(diǎn)類型,包括左右孩子,權(quán)值和信息</p
22、><p> typedef struct</p><p><b> { </b></p><p> int bit[MAXBIT];</p><p> int start;</p><p> }HCodetype; //哈夫曼編碼結(jié)構(gòu)體,包括編碼數(shù)組和起始位</p><p
23、> 4.1.2主要函數(shù)聲明及功能描述如下:</p><p> void reading_file(Message *message);</p><p> //從文件中讀取信息</p><p> void writing_file(Message *message);</p><p><b> //將信息寫進(jìn)文件<
24、;/b></p><p> void total_message(Message *message,Total *total);</p><p> //統(tǒng)計(jì)信息中各字符的出現(xiàn)次數(shù)</p><p> void HaffmanTree(Total *total,HNodetype HuffNode[]);</p><p><b&
25、gt; //構(gòu)建哈夫曼樹(shù)</b></p><p> void HaffmanCode(HNodetype HuffNode[],HCodetype HuffCode[],Total *total);</p><p><b> //建立哈夫曼編碼</b></p><p> void writing_HCode(HNodetyp
26、e HuffNode[],HCodetype HuffCode[],Total *total);</p><p> //將編碼規(guī)則寫進(jìn)文件</p><p> 文件信息的加密,文件的寫入,將編碼后的信息寫進(jìn)文件各程序的聲明如下:</p><p> void lock(Message *message,HNodetype HuffNode[],HCodetype
27、HuffCode[],Total *total,Locking *locking);</p><p> //給文件信息加密編碼</p><p> void writing_lock(Locking *locking);</p><p> //將已編碼信息寫進(jìn)文件</p><p> void writing_translate(Lock
28、ing *locking,HCodetype HuffCode[],HNodetype HuffNode[],Total *total);</p><p> //將已編碼信息翻譯過(guò)來(lái)并寫進(jìn)文件</p><p><b> 4.2源程序 </b></p><p> 4.2.1頭文件head.h</p><p> #d
29、efine MAXVALUE 1000//定義最大權(quán)值</p><p> #define MAXBIT 100//定義哈夫曼樹(shù)中葉子結(jié)點(diǎn)個(gè)數(shù)</p><p> typedef struct</p><p><b> { </b></p><p> char data;//字符值</p>&l
30、t;p> int num;//某個(gè)值的字符出現(xiàn)的次數(shù)</p><p> }TotalNode; //統(tǒng)計(jì)結(jié)點(diǎn),包括字符種類和出現(xiàn)次數(shù)</p><p> typedef struct</p><p><b> { </b></p><p> TotalNode tot[300];//統(tǒng)計(jì)結(jié)點(diǎn)數(shù)組<
31、;/p><p> int num;//統(tǒng)計(jì)數(shù)組中含有的字符個(gè)數(shù)</p><p> }Total; //統(tǒng)計(jì)結(jié)構(gòu)體,包括統(tǒng)計(jì)數(shù)組和字符種類數(shù)</p><p> typedef struct</p><p><b> { </b></p><p> char mes[300];//字符數(shù)
32、組</p><p> int num;//總字符數(shù)</p><p> }Message; //信息結(jié)構(gòu)體,包括字符數(shù)組和總字符數(shù)</p><p> typedef struct{</p><p> int locked[500];//密碼數(shù)組</p><p> int num;//密碼總數(shù)</p>
33、<p> }Locking; //哈夫曼編碼后的密文信息</p><p> typedef struct</p><p><b> { </b></p><p> char data;//字符</p><p> int weight;//權(quán)值</p><p> i
34、nt parent;//雙親結(jié)點(diǎn)在數(shù)組HuffNode[]中的序號(hào)</p><p> int lchild;//左孩子結(jié)點(diǎn)在數(shù)組HuffNode[]中的序號(hào)</p><p> int rchild;//右孩子結(jié)點(diǎn)在數(shù)組HuffNode[]中的序號(hào)</p><p> }HNodetype; //哈夫曼樹(shù)結(jié)點(diǎn)類型,包括左右孩子,權(quán)值和信息</p>&
35、lt;p> typedef struct</p><p><b> { </b></p><p> int bit[MAXBIT];</p><p> int start;</p><p> }HCodetype; //哈夫曼編碼結(jié)構(gòu)體,包括編碼數(shù)組和起始位</p><p> v
36、oid reading_file(Message *message);//從文件中讀取信息</p><p> void writing_file(Message *message);//將信息寫進(jìn)文件</p><p> void total_message(Message *message,Total *total);//統(tǒng)計(jì)信息中各字符的次數(shù)</p><p>
37、 void HaffmanTree(Total *total,HNodetype HuffNode[]);//構(gòu)建哈夫曼樹(shù)</p><p> void HaffmanCode(HNodetype HuffNode[],HCodetype HuffCode[],Total *total);//建立哈夫曼編碼</p><p> void writing_HCode(HNodetype H
38、uffNode[],HCodetype HuffCode[],Total *total);//將編碼規(guī)則寫進(jìn)文件</p><p> void lock(Message *message,HNodetype HuffNode[],HCodetype HuffCode[],Total *total,Locking *locking);//給文件信息加密編碼</p><p> void wr
39、iting_lock(Locking *locking);//將已編碼信息寫進(jìn)文件</p><p> void writing_translate(Locking *locking,HCodetype HuffCode[],HNodetype HuffNode[],Total *total);//將已編碼信息翻譯過(guò)來(lái)并寫進(jìn)文件</p><p> 4.2.2源文件source.cpp&l
40、t;/p><p> #include"head.h"</p><p> #include<iostream></p><p> #include<fstream></p><p> using namespace std;</p><p> int main()<
41、/p><p><b> {</b></p><p> int i,j,choice,mark=0;//mark標(biāo)記文件信息是否讀入到內(nèi)存中</p><p> HNodetype HuffNode[500];//保存哈夫曼樹(shù)中各結(jié)點(diǎn)信息</p><p> HCodetype HuffCode[300];</p&g
42、t;<p> Locking *locking;</p><p> Total *total;</p><p> Message *message;</p><p> locking=new Locking;</p><p> locking->num=0;</p><p> total
43、=new Total;</p><p> total->num=0;</p><p> message=new Message;</p><p> message->num=0; //初始化變量</p><p><b> while(1)</b></p><p><b&g
44、t; {</b></p><p> cout<<"********************************************************************************";</p><p> cout<<"*1:從文件讀取信息 2:顯示編碼規(guī)則 3:
45、將原文件信息寫進(jìn)文件 *";</p><p> cout<<"*4:將編碼規(guī)則寫進(jìn)文件 5:將編碼后的信息寫進(jìn)文件 6:將譯碼后的信息寫進(jìn)文件 7:退出 *";</p><p> cout<<"********************************************************
46、************************"<<endl;</p><p> cout<<"請(qǐng)輸入操作代碼:";</p><p> cin>>choice;</p><p> switch(choice)</p><p><b> {</b>
47、</p><p><b> case 1:</b></p><p> reading_file(message);//從文件中讀取信息</p><p><b> mark=1;</b></p><p><b> break;</b></p><p&g
48、t; case 2://顯示編碼規(guī)則</p><p> if(mark==0)cout<<"請(qǐng)先從文件中讀取信息!"<<endl;</p><p><b> else</b></p><p><b> {</b></p><p> total_m
49、essage(message,total);//統(tǒng)計(jì)信息中各字符的出現(xiàn)次數(shù)</p><p> HaffmanTree(total,HuffNode);//構(gòu)建哈夫曼樹(shù)</p><p> HaffmanCode(HuffNode,HuffCode,total);//建立哈夫曼編碼</p><p> for(i=0;i<total->num;i++)/
50、/顯示編碼規(guī)則</p><p><b> { </b></p><p> cout<<total->tot[i].data<<" ";</p><p> for(j=HuffCode[i].start+1;j<total->num;j++)</p><
51、p> cout<<HuffCode[i].bit[j];</p><p> cout<<endl;</p><p><b> }</b></p><p><b> }</b></p><p> break; </p><p>
52、; case 3://將原文件信息寫進(jìn)文件</p><p> if(mark==0)cout<<"請(qǐng)先從文件中讀取信息!"<<endl;</p><p><b> else</b></p><p> writing_file(message);//將信息寫進(jìn)文件</p><
53、p><b> break;</b></p><p> case 4://將編碼規(guī)則寫進(jìn)文件</p><p> if(mark==0)cout<<"請(qǐng)先從文件中讀取信息!"<<endl;</p><p><b> else</b></p><p&g
54、t;<b> {</b></p><p> total_message(message,total);//統(tǒng)計(jì)信息中各字符的出現(xiàn)次數(shù)</p><p> HaffmanTree(total,HuffNode);//構(gòu)建哈夫曼樹(shù)</p><p> HaffmanCode(HuffNode,HuffCode,total);//建立哈夫曼編碼&
55、lt;/p><p> writing_HCode(HuffNode,HuffCode,total);//將編碼規(guī)則寫進(jìn)文件</p><p><b> }</b></p><p><b> break;</b></p><p> 根據(jù)選擇的不同進(jìn)入不同的運(yùn)行界面,發(fā)揮各程序的功能:</p&g
56、t;<p> //將編碼后的信息寫進(jìn)文件</p><p><b> case 5:</b></p><p> if(mark==0)cout<<"請(qǐng)先從文件中讀取信息!"<<endl;</p><p><b> else</b></p><
57、;p><b> {</b></p><p> total_message(message,total);//統(tǒng)計(jì)信息中各字符的出現(xiàn)次數(shù)</p><p> HaffmanTree(total,HuffNode);//構(gòu)建哈夫曼樹(shù)</p><p> HaffmanCode(HuffNode,HuffCode,total);//建立哈夫
58、曼編碼</p><p> lock(message,HuffNode,HuffCode,total,locking);//給文件信息加密編碼</p><p> writing_lock(locking);//將已編碼信息寫進(jìn)文件</p><p><b> }</b></p><p><b> break
59、;</b></p><p> //將譯碼后的信息寫進(jìn)文件 </p><p><b> case 6:</b></p><p> if(mark==0)cout<<"請(qǐng)先從文件中讀取信息!"<<endl;</p><p><b> else<
60、;/b></p><p><b> {</b></p><p> total_message(message,total);//統(tǒng)計(jì)信息中各字符的出現(xiàn)次數(shù)</p><p> HaffmanTree(total,HuffNode);//構(gòu)建哈夫曼樹(shù)</p><p> HaffmanCode(HuffNode,
61、HuffCode,total);//建立哈夫曼編碼</p><p> writing_translate(locking,HuffCode,HuffNode,total);//將已編碼信息翻譯過(guò)來(lái)并寫進(jìn)文件</p><p><b> }</b></p><p><b> break;</b></p>&
62、lt;p><b> case 7:</b></p><p><b> exit(1);</b></p><p><b> default:</b></p><p> cout<<"輸入錯(cuò)誤,請(qǐng)重新選擇"<<endl;</p>&l
63、t;p><b> }</b></p><p><b> }</b></p><p> for(i=0;i<locking->num;i++)</p><p> if(locking->locked[i]==-1)cout<<" ";</p>&l
64、t;p><b> else</b></p><p> cout<<locking->locked[i]; </p><p> cout<<endl;</p><p> for(i=0;i<total->num;i++)</p><p> cout<<t
65、otal->tot[i].data<<" "<<total->tot[i].num<<endl;</p><p> for(i=0;i<2*(total->num)-1;i++)</p><p> cout<<HuffNode[i].parent<<" ";<
66、;/p><p> cout<<endl; </p><p><b> return 0;</b></p><p><b> }</b></p><p> 注釋1:此段程序功能:給文件信息加密編碼。通過(guò)調(diào)用哈夫曼樹(shù)的遍歷函數(shù)遍歷信息,創(chuàng)立一個(gè)備用數(shù)組locked,逐次遍歷搜
67、索信息對(duì)應(yīng)的編碼,一旦找到對(duì)應(yīng)的編碼便將該信息對(duì)應(yīng)的編碼寫進(jìn)locked數(shù)組,每加進(jìn)一個(gè)編碼便將locked數(shù)組總數(shù)加1。</p><p> void lock(Message *message,HNodetype HuffNode[],HCodetype HuffCode[],Total *total,Locking *locking)</p><p><b> {<
68、/b></p><p> int i,j,m;</p><p> for(i=0;i<message->num;i++)//遍歷信息</p><p><b> {</b></p><p> if(message->mes[i]==' ')//碰到空格則以-1形式保存進(jìn)loc
69、ked數(shù)組中</p><p><b> {</b></p><p> locking->locked[locking->num]=-1;</p><p> locking->num++;</p><p><b> }</b></p><p><
70、b> else</b></p><p> for(j=0;j<total->num;j++)//搜索信息對(duì)應(yīng)的編碼</p><p><b> {</b></p><p> if(HuffNode[j].data==message->mes[i])//找到與信息對(duì)應(yīng)的編碼則寫進(jìn)locked數(shù)組</
71、p><p> for(m=HuffCode[j].start+1;m<total->num;m++)</p><p><b> {</b></p><p> locking->locked[locking->num]=HuffCode[j].bit[m];</p><p> locking-&
72、gt;num++;//locked數(shù)組總數(shù)加1</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> 注釋
73、2:此段程序功能:將哈夫曼編碼后的密文信息寫進(jìn)文件。通過(guò)文件的打開(kāi),若失敗返回打開(kāi)文件失敗,若成功便將已編碼信息寫進(jìn)文件,返回已編碼信息寫進(jìn)文件成功。</p><p> void writing_lock(Locking *locking)</p><p><b> {</b></p><p><b> int i;</b
74、></p><p> ofstream outfile("c:\\locking.txt",ios::in|ios::out);</p><p> if(!outfile)//打開(kāi)失敗則結(jié)束</p><p><b> {</b></p><p> cout<<"打開(kāi)
75、c:\\locking.txt文件失敗"<<endl;</p><p><b> exit(1);</b></p><p><b> }</b></p><p> for(i=0;i<locking->num;i++)//寫文件</p><p> if(lo
76、cking->locked[i]==-1)</p><p> outfile.put(' ');</p><p><b> else</b></p><p> outfile<<locking->locked[i];</p><p> cout<<"已
77、編碼信息寫進(jìn)文件成功"<<endl;</p><p> outfile.close();//關(guān)閉文件</p><p><b> }</b></p><p> 注釋3:此段程序功能:將已編碼入文件的信息翻譯過(guò)來(lái)并再次寫進(jìn)文件。先打開(kāi)文件,若失敗返回打開(kāi)文件失敗,若成功打開(kāi)則進(jìn)行數(shù)組初始化,從文件中查找從min開(kāi)始到ma
78、x的編碼對(duì)應(yīng)的信息,若對(duì)應(yīng)編碼比所給編碼短則不在比較,若找到對(duì)應(yīng)信息,則寫進(jìn)文件。然后再次進(jìn)行數(shù)組初始化將翻譯信息寫進(jìn)文件并返回翻譯信息寫進(jìn)文件成功。</p><p> void writing_translate(Locking *locking,HCodetype HuffCode[],HNodetype HuffNode[],Total *total)</p><p><b&
79、gt; {</b></p><p> int i,j,mark[100],start[100],min,max;</p><p> ofstream outfile("c:\\translate.txt",ios::in|ios::out);//打開(kāi)文件</p><p> if(!outfile)//打開(kāi)失敗則結(jié)束</p
80、><p> {cout<<"打開(kāi)c:\\translate.txt文件失敗"<<endl;</p><p><b> exit(1);</b></p><p><b> }</b></p><p> for(i=0;i<total->num
81、;i++)//start數(shù)組初始化</p><p><b> {</b></p><p> start[i]=HuffCode[i].start+1;</p><p><b> }</b></p><p> for(i=0;i<total->num;i++)//mark數(shù)組初始化
82、</p><p><b> {</b></p><p> mark[i]=1;</p><p><b> }</b></p><p><b> min=0;</b></p><p> for(max=0;max<locking->n
83、um;max++)//寫文件</p><p><b> {</b></p><p> if(locking->locked[max]==-1)//碰到空格信息則直接輸出空格</p><p><b> {</b></p><p> outfile.put(' ');<
84、;/p><p><b> min++;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> for(i=min;i<=max;
85、i++)//查找從min開(kāi)始到max的編碼對(duì)應(yīng)的信息</p><p><b> {</b></p><p> for(j=0;j<total->num;j++) { </p><p> if(start[j]==total->num+1)</p>&
86、lt;p> mark[j]=0;//對(duì)應(yīng)編碼比所給編碼短則不在比較</p><p> if(mark[j]==1&&locking->locked[i]==HuffCode[j].bit[start[j]])</p><p> start[j]++;</p><p><b> else</b></p&g
87、t;<p> mark[j]=0;</p><p><b> }</b></p><p><b> }</b></p><p> for(i=0;i<total->num;i++)//找到對(duì)應(yīng)信息,則寫進(jìn)文件</p><p><b> {</b&g
88、t;</p><p> if(mark[i]==1&&start[i]==total->num)</p><p><b> {</b></p><p> outfile.put(HuffNode[i].data);</p><p><b> break;</b><
89、/p><p><b> }</b></p><p><b> }</b></p><p> if(i!=total->num)</p><p> min=max+1;</p><p> for(i=0;i<total->num;i++)//start數(shù)
90、組初始化</p><p><b> {</b></p><p> start[i]=HuffCode[i].start+1;</p><p><b> }</b></p><p> for(i=0;i<total->num;i++)//mark數(shù)組初始化</p>&
91、lt;p><b> {</b></p><p> mark[i]=1;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> cout&
92、lt;<"翻譯信息寫進(jìn)文件成功"<<endl;</p><p> outfile.close();//關(guān)閉文件</p><p><b> }</b></p><p> 五.程序測(cè)試結(jié)果及問(wèn)題分析</p><p> 5.1程序測(cè)試結(jié)果:</p><p>
93、 圖1存放原信息的文檔reading.txt截圖</p><p> 選擇“將編碼后的信息寫進(jìn)文件”,則將編碼后的信息寫進(jìn)locking.txt中。如圖2和3所示:</p><p> 圖2 將編碼后的信息寫入文件截圖</p><p> 圖3 存放編碼后的信息文檔locking.txt截圖</p><p> 選擇“將譯碼后的信息寫進(jìn)文件
94、”,則將譯碼后的信息寫進(jìn)translate.txt中。如圖4和5所示:</p><p> 圖4將譯碼后的信息寫進(jìn)文件截圖</p><p> 圖5存放譯碼后的信息文檔translate.txt截圖</p><p><b> 5.2 問(wèn)題分析:</b></p><p> 在整個(gè)程序運(yùn)行中總是出現(xiàn)打開(kāi)head.h失敗,
95、開(kāi)始以為是機(jī)子問(wèn)題,等我們?cè)嚵撕芏嗯_(tái)機(jī)子還是出現(xiàn)同樣的問(wèn)題后,才發(fā)現(xiàn)將head.H文件跟原文件建在不同的工程里,系統(tǒng)無(wú)法在原文件中將head.h打開(kāi),并在代碼復(fù)制中有時(shí)會(huì)復(fù)制兩次導(dǎo)致很多代碼出現(xiàn)重復(fù)定義的錯(cuò)誤。還有時(shí)會(huì)忘了建一reading.text文件,導(dǎo)致程序運(yùn)行時(shí)老出現(xiàn)打開(kāi)文件失敗的錯(cuò)誤。知道這些錯(cuò)誤后經(jīng)過(guò)小組討論分析修正錯(cuò)誤,認(rèn)真仔細(xì)檢查每一步,最后也終于將程序完整運(yùn)行出來(lái)了。</p><p><b
96、> 六.總結(jié)</b></p><p> 在這兩個(gè)星期中,自己用vc++做了一個(gè)哈夫曼樹(shù)的應(yīng)用系統(tǒng),分別實(shí)現(xiàn)了系統(tǒng)的各大功能。在這次項(xiàng)目中,很用心去做,但是,在項(xiàng)目中也出現(xiàn)了很多的問(wèn)題,最大的問(wèn)題就是對(duì)程序設(shè)計(jì)框架結(jié)構(gòu)的不了解,在實(shí)現(xiàn)代碼與功能的連接時(shí)經(jīng)常會(huì)出現(xiàn)各種不同的錯(cuò)誤,在實(shí)現(xiàn)一些功能時(shí)系統(tǒng)常常會(huì)報(bào)錯(cuò)。許多錯(cuò)誤不知從哪修改,以致托了整個(gè)設(shè)計(jì)的后腿。課程設(shè)計(jì)中,既回顧了很多以前的東西,也發(fā)
97、現(xiàn)了很多的問(wèn)題,以前都沒(méi)遇見(jiàn)過(guò)的,收獲很大。</p><p> 通過(guò)本次數(shù)據(jù)結(jié)構(gòu)的課程設(shè)計(jì),我學(xué)習(xí)了很多在上課沒(méi)懂的知識(shí),并對(duì)求哈夫曼樹(shù)及哈夫曼編碼/譯碼的算法有了更加深刻的了解,更鞏固了課堂中學(xué)習(xí)有關(guān)于哈夫曼編碼的知識(shí), 此次哈夫曼樹(shù)的應(yīng)用系統(tǒng)的設(shè)計(jì)讓自己對(duì)數(shù)據(jù)結(jié)構(gòu)的了解更深入,可以把它同實(shí)際相結(jié)合,同時(shí),又讓我們學(xué)會(huì)了如何更好的從網(wǎng)上查找資料,還有同班上同學(xué)的交流。雖然我對(duì)數(shù)據(jù)結(jié)構(gòu)有了一定的掌握,但是到了真
98、正使用,做課設(shè)的時(shí)候還是遇到了許多的問(wèn)題。 在仔細(xì)研究過(guò)課設(shè)要求和功能需求后,我有了初步的想法。 在整個(gè)設(shè)計(jì)過(guò)程中,通過(guò)怎樣對(duì)把各個(gè)管理信息連接起來(lái)的分析,鍛煉了對(duì)事情的分析能力,通過(guò)怎樣解決過(guò)程中出現(xiàn)的問(wèn)題,提高了我們查找文獻(xiàn)的能力、對(duì)網(wǎng)絡(luò)資源的利用能力和和其他同學(xué)的交流溝通能力。而且,經(jīng)歷這次的課程設(shè)計(jì),也學(xué)會(huì)了自學(xué)和分工協(xié)作。編寫程序是件細(xì)心活,稍不留神就會(huì)出錯(cuò),這就必須要求我們對(duì)待事情要認(rèn)真!在編寫程序的過(guò)程中,錯(cuò)誤不斷出現(xiàn),不
99、同的類型(如少寫了一個(gè)符號(hào),寫錯(cuò)了字母,用錯(cuò)了函數(shù)等等)層出不窮,這考驗(yàn)我們待事細(xì)心,耐心,能不能堅(jiān)持到底,不能半途而廢。</p><p> 每一次的課程設(shè)計(jì),都是讓我們對(duì)原有的知識(shí)從了解表面到深入本質(zhì),從個(gè)體學(xué)習(xí)到整體把握的跳躍,對(duì)新知識(shí)的汲取,更是把課本的知識(shí)應(yīng)用到實(shí)際中,讓我們了解了我們的學(xué)習(xí)有什么用,能夠解決什么樣的問(wèn)題,增加了自信和學(xué)習(xí)的動(dòng)力。</p><p> 總之,通過(guò)這
100、次的課程設(shè)計(jì),我們收獲匪淺首先由衷感謝老師提供這樣一個(gè)鍛煉自己的機(jī)會(huì),感受到學(xué)來(lái)的知識(shí)不只是用來(lái)完成試卷的。一向慣于獨(dú)立思考的自己學(xué)會(huì)了積極的同同學(xué)、朋友交流,取長(zhǎng)補(bǔ)短,共同進(jìn)步。課程設(shè)計(jì)使自己發(fā)現(xiàn)考試并不是最重要,最重要的是能運(yùn)用所學(xué)的知識(shí)。在整個(gè)課程設(shè)計(jì)的學(xué)習(xí)過(guò)程中,不再是用學(xué)到的知識(shí)解題,而是在實(shí)際運(yùn)用時(shí)遇到什么學(xué)什么,重在把知識(shí)應(yīng)用于實(shí)際。</p><p><b> 七.參考文獻(xiàn)</b&
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----huffman編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)——課程設(shè)計(jì)報(bào)告模板
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告 (2)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告 (4)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)實(shí)習(xí)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告.doc
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告 (3)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告 (2)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告 (2)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--鏈表
評(píng)論
0/150
提交評(píng)論