




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 蘭州商學院隴橋學院 工學系課程設計報告設 計 題 目:哈夫曼(huffman)編譯碼器 系 別: 專 業 (方 向): 年 級、 班: 學 生 姓 名: 學 生 學 號: 指 導 教 師: 年 月日 目 錄哈夫曼(huffman )編譯碼器3一、 編譯碼器開發的背景3二、系統的分析與設計3(一)系統功能要求3(二)系統模塊結構設計4三、系統的設計與實現6(一)main()6(二)運算71. 權值運算quanzhi()72. 印二叉樹函數huffmantree( )73.編譯碼運算huffmancode()94. 輸出運算 shuchu()9四、系統測試10(一)測試主函數10(二)測試印二叉
2、樹函數10(三) 測試譯碼運算函數11五、總結12六、附件(代碼、部分圖表)13哈夫曼(huffman )編譯碼器1、 編譯碼器開發的背景 利用哈夫曼編碼進行通信可以大大提高信道利用率,縮短信息傳輸時間,降低傳輸成本。但是,這要求在發送端通過一個編碼系統對待傳數據預先編碼,在接收端將傳來的數據進行譯碼(復原)。對于雙工信道(即可以雙向傳輸信息的信道),每端都需要一個完整的編/譯碼系統。二、系統的分析與設計(一)系統功能要求一個完整的系統應具有以下功能:1) I:初始化(Initialization)。從終端讀入字符集大小n,以及n個字符和n個權值,建立哈夫曼樹,并將它存于文件hfmTree中。
3、2) E:編碼(Encoding)。利用以建好的哈夫曼樹(如不在內存,則從文件hfmTree中讀入),對文件ToBeTran中的正文進行編碼,然后將結果存入文件CodeFile中。3) D:譯碼(Decoding)。利用已建好的哈夫曼樹將文件CodeFile中的代碼進行譯碼,結果存入文件TextFile中。4) P:印代碼文件(Print)。將文件CodeFile以緊湊格式顯示在終端上,每行50個代碼。同時將此字符形式的編碼文件寫入文件CodePrin中。5) T:印哈夫曼樹(Tree Printing)。將已在內存中的哈夫曼樹以直觀的方式(樹或凹入表形式)顯示在終端上,同時將此字符形式的哈夫
4、曼樹寫入文件TreePrint中。(二)系統模塊結構設計通過對系統功能的分析,哈夫曼(huffman)編譯碼器功能如圖(1)所示。哈夫曼(huffman )編譯碼器初 始 化輸出二叉樹編 譯 碼輸出 代碼選 擇 操 作 圖(1)哈夫曼(huffman)編譯碼器功能圖通過上圖的功能分析,把整個系統分為四個模塊:1.初始化模塊,該模塊主要實現:輸入二叉樹的結點數,以及要加密的句子,建立哈夫曼樹。2.輸出二叉樹模塊,該運算模塊主要實現:將輸入的字符串中每個字符出現的次數當作權值,建立二叉樹,將二叉樹的parent,weight,lchild,rchild輸出。3.譯碼模塊,該操作主要實現:對編碼后的
5、代碼進行譯碼,然后輸出。4.輸出模塊,該操作主要進行表頭的輸出。開始是 用戶選擇否y=1否y=2 輸入葉子節點數y=3對輸入的句子進行編碼 輸入句子 退出系統輸出每個字符的編碼建立二叉樹,輸出二叉樹 結束 圖流程圖三、系統的設計與實現(一)main()輸出1.輸出二叉樹操作2.進行輸出二叉樹操作3.退出編譯碼操作系統,并讓用戶選擇所進行的操作,對其調用。 該模塊的具體代碼如下所示:void main()int i,n,s=1; hnodetype huffnodemaxnode;while(s) shuchu(); scanf("%d",&i); switch(i)
6、 case 1: haffmantree(huffnode,&n); break; case 2: haffmancode(); break; case 3: s=0; break; 分析:首先輸出一個主菜單,方便用戶進行操作,用switch語句調用函數使用戶對其進行選擇要執行的操作(1.輸出二叉樹操作,2.進行編譯碼操作,3.退出程序)。(二)運算 該模塊的具體代碼如下所示:1. 權值運算quanzhi() 分析:此函數用于對一串字符進行求權值運算,利用循環將一串字符中每個字符的個數設定為權值。void quanzhi(int tmaxleaf,char smaxleaf,int n
7、)/求權值函數,將句子中的字符出現的個數當作權值int i,j,h;for(i=0;i<n;i+)for(j=0;j<n;j+)if(si=sj)h+;ti=h;2. 印二叉樹函數huffmantree( )void haffmantree(hnodetype huffnodemaxnode,int *m)int i,j,n,k;int m1,m2,x1,x2;char smaxleaf,tmaxleaf; printf("輸入葉子結點個數:");scanf("%d",&n);for(i=0;i<2*n-1;i+)/數組huff
8、node初始化huffnodei.weight=0; huffnodei.parent=-1;huffnodei.lchild=-1;huffnodei.rchild=-1;printf("輸入要編譯的句子的n"); for(i=0;i<n;i+) printf("第%d個結點",i+1);scanf("%d",&huffnodei.weight);getchar();printf("印二叉樹:n"); for(i=0;i<n;i+)quanzhi(t,s,n); k=huffnodei.wei
9、ght;for(i=0;i<n-1;i+)/構造哈夫曼樹m1=m2=maxvalue; x1=x2=0;for(j=0;j<n+i;j+)/選取最小和次小兩個權值if(huffnodej.parent=-1&&huffnodej.weight<m1)m2=m1;x2=x1;m1=huffnodej.weight;x1=j;elseif(huffnodej.parent=-1&&huffnodej.weight<m2)m2=huffnodej.weight;x2=j;/將找出的兩棵子樹合并為一顆子樹 huffnodex1.parent=n+
10、i; huffnodex2.parent=n+i; huffnoden+i.weight=huffnodex1.weight+huffnodex2.weight; huffnoden+i.lchild=x1; huffnoden+i.rchild=x2;for(i=0;i<2*n-1;i+)printf(" %4d",k); printf(" %4d",huffnodei.lchild);printf(" %4d",huffnodei.rchild);printf(" %4dn",huffnodei.pare
11、nt);*m=n;3.編譯碼運算huffmancode()void haffmancode()hnodetype huffnodemaxnode;hcodetype huffcodemaxleaf,cd;int i,j,c,p,n=0;haffmantree(huffnode,&n);for(i=0;i<n;i+)cd.start=n-1;c=i;p=huffnodec.parent;while(p!=-1)if(huffnodep.lchild=c)cd.bitcd.start=0;elsecd.bitcd.start=1;cd.start-;c=p;p=huffnodec.p
12、arent;for(j=cd.start+1;j<n;j+)huffcodei.bitj=cd.bitj;huffcodei.start=cd.start;for(i=0;i<n;i+)printf("第%d個譯碼為:",i+1);for(j=huffcodei.start+1;j<n;j+)printf("%4d",huffcodei.bitj);printf("n");4. 輸出運算 shuchu()void shuchu()printf("*n");printf("* |* 哈夫曼
13、樹的編譯碼 * | *n");printf("* |* 1.輸出二叉樹操作 * | *n");printf("* |* 2.進行編譯碼操作 * | *n");printf("* |* 3.退出編譯碼操作系統* | *n");printf("*n"); printf("請選擇要進行的操作:");四、系統測試(一)測試主函數main()函數該測試主要進行對主函數調用以及輸出的測試,測試的結果:(二)測試印二叉樹函數 測試選擇1,選擇1操作首先輸入葉子節點數,然后輸入要編譯的句子,分別輸入第
14、n+1個節點,然后系統會將輸入字符的個數當作權值進行編譯輸出二叉樹,測試結果為:(3) 測試譯碼運算函數測試選擇2,輸入要選擇的操作2,然后按要求依次輸入需要的值,系統會根據輸入的數據進行譯碼操作,最后輸出譯碼。輸出結果為: (4) 測試退出函數 測試選擇3進行退出,測試結果為:五、總結系統功能:系統完成了將一段字符串進行哈夫曼加密,用戶將自己的選擇輸入程序,然后按照程序的提示進行輸入,系統將根據輸入進行編碼、譯碼操作,然后印出編譯的二叉樹,以及每個字符的譯碼。不足:系統沒有將印哈夫曼樹操作完成,系統沒有將字符的權值根據大小將左孩子設為最小權值,將次小權值設為右孩子,導致加密有許多種,哈夫曼樹
15、也創建了許多種,輸出的譯碼不唯一。收獲:通過一學期數據結構的學習,我發現數據結構比較難,沒有完整的自己獨立完成一個程序。但也學到了許多東西,學會了以前不會的函數調用,在編程時,有許多小問題還是不能夠及時的發現,老是被一點小問題卡住導致程序不執行或輸出死循環,一些程序的指針還不太熟悉。 通過這次程序設計,我發現了許多自己的不足,對一些算法還不能熟練運用,不能將所學的運用到程序中,一些語句還是不太懂;同時,也有一些收獲,對函數調用能夠熟練運用,也明白了結構體的作用,掌握了最優二叉樹的建立和原理,對哈夫曼樹有了更深一步的了解。六、附件(代碼、部分圖表) /*哈弗曼樹*/#include <st
16、dio.h>#define maxvalue 1000/定義最大權值#define maxleaf 50/定義哈夫曼樹中葉子結點個數#define maxnode maxleaf*2-1/定義哈夫曼樹中結點個數整數常量maxnode#define maxbit 100/定義哈夫曼樹的最大長度整數常量typedef struct/定義結構體int weight;int parent;int lchild;int rchild;hnodetype;typedef structint bitmaxbit;int start;hcodetype; /求權值函數void quanzhi(int t
17、maxleaf,char smaxleaf,int n)/求權值函數,將句子中的字符出現的個數當作權值int i,j,h;for(i=0;i<n;i+)for(j=0;j<n;j+)if(si=sj)h+;ti=h; /印二叉樹函數void haffmantree(hnodetype huffnodemaxnode,int *m)int i,j,n,k;int m1,m2,x1,x2;char smaxleaf,tmaxleaf; printf("輸入葉子結點個數:");scanf("%d",&n);for(i=0;i<2*n-
18、1;i+)/數組huffnode初始化huffnodei.weight=0; huffnodei.parent=-1;huffnodei.lchild=-1;huffnodei.rchild=-1;printf("輸入要編譯的句子的n"); for(i=0;i<n;i+) printf("第%d個結點",i+1);scanf("%d",&huffnodei.weight);getchar();printf("印二叉樹:n"); for(i=0;i<n;i+)quanzhi(t,s,n); k=h
19、uffnodei.weight;for(i=0;i<n-1;i+)/構造哈夫曼樹m1=m2=maxvalue; x1=x2=0;for(j=0;j<n+i;j+)/選取最小和次小兩個權值if(huffnodej.parent=-1&&huffnodej.weight<m1)m2=m1;x2=x1;m1=huffnodej.weight;x1=j;elseif(huffnodej.parent=-1&&huffnodej.weight<m2)m2=huffnodej.weight;x2=j;/將找出的兩棵子樹合并為一顆子樹 huffnode
20、x1.parent=n+i; huffnodex2.parent=n+i; huffnoden+i.weight=huffnodex1.weight+huffnodex2.weight; huffnoden+i.lchild=x1; huffnoden+i.rchild=x2;for(i=0;i<2*n-1;i+)printf(" %4d",k); printf(" %4d",huffnodei.lchild);printf(" %4d",huffnodei.rchild);printf(" %4dn",hu
21、ffnodei.parent);*m=n; /編譯碼函數void haffmancode()hnodetype huffnodemaxnode;hcodetype huffcodemaxleaf,cd;int i,j,c,p,n=0;haffmantree(huffnode,&n);for(i=0;i<n;i+)cd.start=n-1;c=i;p=huffnodec.parent;while(p!=-1)if(huffnodep.lchild=c)cd.bitcd.start=0;elsecd.bitcd.start=1;cd.start-;c=p;p=huffnodec.parent;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑工程咨詢合同協議
- 建筑物資采購合同協議
- 工程轉包合同抽成協議
- 建筑工程合作協議合同
- 高層商品房出售合同協議
- 合唱排練指導合同協議
- 2025年國際金融理財師模擬題的科學設計與編制試題及答案
- 銀行業務效率提升策略試題及答案
- 2025年特許金融分析師參加考試準備試題及答案
- 參數估計的統計推斷方法重點基礎知識點
- 人教版六年級下冊科學全冊教案
- 2024福建中閩能源股份有限公司招聘12人筆試參考題庫附帶答案詳解
- 2025年江西省旅游集團股份有限公司招聘筆試參考題庫含答案解析
- 分析化學考試題(附參考答案)
- 《外科補液原則》課件
- 《墨家思想》課件
- 浙江省2025年1月首考高考英語試卷試題真題(含答案)
- 川教版(2024)小學信息技術三年級上冊《跨學科主題活動-在線健康小達人》教學實錄
- 機械專業英語
- 高空作業車(剪叉式、曲臂式)驗收表
- 廣東省廣州市2024屆高三下學期一??荚?政治 含解析
評論
0/150
提交評論