版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計</b></p><p><b> 設(shè)計說明書</b></p><p><b> 計算機與通信學(xué)院</b></p><p> 2011年 6月 23 日</p><p><b> 一、課題任務(wù)與說明</b&g
2、t;</p><p> 1.編輯一個哈夫曼編譯器系統(tǒng)程序</p><p><b> 2.問題描述</b></p><p> 設(shè)某編碼系統(tǒng)共有n個字符,使用頻率分別為{w1,w2,…,wn},設(shè)計一個不等長編碼方案,使得該編碼系統(tǒng)的空間效率最好。</p><p><b> 3.所具有的功能:</b&
3、gt;</p><p> (1) 為一字符文本編碼功能:將一字符文本復(fù)制到指定的文本中,并保存到指定路徑,讓程序自動為它編碼。</p><p> (2) 為部分字符編碼功能:輸入部分字符與對應(yīng)的字符頻率,讓程序為之編碼(需注意輸入格式)。</p><p> (3) 保存輸出到文本功能:將編碼結(jié)果輸出到文本。</p><p> (4)
4、輸出保存文本信息功能:將功能3保存的文本信息輸出到屏幕上,用于查看結(jié)果是否正確。</p><p><b> 4.設(shè)計要求</b></p><p> ?。?)設(shè)計數(shù)據(jù)結(jié)構(gòu);</p><p> (2)設(shè)計編碼算法;</p><p> ?。?)分析時間復(fù)雜度和空間復(fù)雜度。</p><p> ?。?)
5、字符和頻度如下:</p><p> 字符 空格 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z</p><p> 頻度 186 64 13 22 32 103 21 15 47 57 1 2 32 20 57 63 15 1 48 51 80 23 8 18 1 16</p><p><b>
6、5.設(shè)計內(nèi)容與步驟</b></p><p> ?。?)選擇合適的數(shù)據(jù)結(jié)構(gòu)</p><p> ?。?)結(jié)點結(jié)構(gòu)的設(shè)計</p><p> ?。?)算法設(shè)計與分析</p><p> ?。?)程序設(shè)計、實現(xiàn)、調(diào)試</p><p> ?。?)課程設(shè)計說明書</p><p> 6.設(shè)計工作計劃
7、與進度安排</p><p> ?。?)設(shè)計工作4學(xué)時</p><p> ?。?)實現(xiàn)與調(diào)試16學(xué)時</p><p> ?。?)課程設(shè)計說明書4學(xué)時</p><p><b> 二、算法設(shè)計</b></p><p> Huffman編碼是一種可變長編碼方式,是由美國數(shù)學(xué)家David Huffman
8、創(chuàng)立的,是二叉樹的一種特殊轉(zhuǎn)化形式。編碼的原理是:將使用次數(shù)多的代碼轉(zhuǎn)換成長度較短的代碼,而使用次數(shù)少的可以使用較長的編碼,并且保持編碼的唯一可解性。Huffman算法的最根本的原則是:累計的(字符的統(tǒng)計數(shù)字*字符的編碼長度)為最小,也就是權(quán)值(字符的統(tǒng)計數(shù)字*字符的編碼長度)的和最小。</p><p> 三、程序的功能設(shè)計</p><p> 為實現(xiàn)系統(tǒng)功能,本程序主要分為五個模塊。
9、它們分別為:</p><p><b> 1.初始化功能模塊</b></p><p> 此功能模塊的功能為從鍵盤接收字符集大小n,以及n各字符和n個權(quán)值。</p><p> 2.建立哈弗曼樹的功能模塊</p><p> 此模塊功能為使用1中或從一文本中得到的數(shù)據(jù)按照教材的構(gòu)造哈夫曼樹的算法構(gòu)造哈夫曼樹。</p
10、><p> 3.建立哈夫曼編碼與譯碼的功能模塊</p><p> 此模塊功能為讀入相關(guān)的字符信息進行哈夫曼編碼,并將譯碼結(jié)果輸出,在必要時也可保存到文件中。</p><p> 其中各個函數(shù)的功能分別如下:</p><p> notesave函數(shù)用于保存輸出的結(jié)果;</p><p> hfmtree函數(shù)用于建立結(jié)點
11、哈夫曼樹并輸出最終結(jié)果;</p><p> readnote函數(shù)用于讀取目標文本字符信息;</p><p><b> 4.流程圖:</b></p><p><b> 四、函數(shù)編碼及調(diào)試</b></p><p> 由于本人能力有限難免不會在編碼與調(diào)試過程中遇到這樣或那樣的問題,但通過長時間的改
12、正,查詢資料與詢問,終于能將出現(xiàn)一些致命錯誤得以修正。例如:在輸入編碼結(jié)果信息時由于少了一個很不明顯的Getchar()的接收Enter的函數(shù),后面的就全亂了使程序出現(xiàn)了不能達到意料之中的效果。還有先是運行完一個函數(shù)后就跳出了整個運行程序不能再繼續(xù),后來通過查閱書籍,明白再主函數(shù)中加一個For語句就可以避免這一問題。第三個問題就是由于調(diào)用完一個函數(shù)后顯示的信息還是留在運行界面,但它們的確有沒什么用且占用界面,不美觀,后來通過詢問同學(xué)得知
13、,在每個要調(diào)用的函數(shù)后加一個system("cls")語句就可達到清除上屏信息的功能。</p><p><b> 五、總結(jié)</b></p><p> 該程序主要用于哈夫曼編碼,并在必要時保存數(shù)據(jù)。做法主要是用一個主函數(shù)MAIN,用它達到顯示歡迎界面,提示選擇操作與調(diào)用其它函數(shù)功能(用到Switch函數(shù)),這樣使得程序簡單,易讀,運行效果也好。但
14、由于能力有限,該程序在時間與空間復(fù)雜度上有待作改正。</p><p><b> 參考文獻:</b></p><p> ?。?) 劉振鵬、張小莉等編著;數(shù)據(jù)結(jié)構(gòu)(第二版).中國鐵道出版社。</p><p> ?。?) 石強、羅文浩等編著;數(shù)據(jù)結(jié)果習題解答與實驗指導(dǎo)(第二版).中國鐵道出版社。</p><p> ?。?)
15、劉克成 主編;C語言程序設(shè)計.中國鐵道出版社。</p><p> 附全部代碼(正常運行VC++6.0):</p><p> #include<stdio.h></p><p> #include<conio.h></p><p> #include<string.h></p><
16、p> #include<stdlib.h></p><p> #define MAXLEAF 27</p><p> #define MAXNODE MAXLEAF*2-1</p><p> #define MAXBIT 25</p><p> #define MAXVALUE 2000</p>&l
17、t;p> #define H "\t\t =======================================\n"</p><p> typedef struct{</p><p> int parent;</p><p> int weight;</p><p> int lchild
18、;</p><p> int rchild;</p><p><b> }hfm_n;</b></p><p> typedef struct{</p><p> int bit[MAXBIT];</p><p> int start;</p><p><b
19、> }hfm_c;</b></p><p> void notesave(int n,char a[],hfm_c hfm_code[])</p><p><b> {</b></p><p><b> FILE *fp;</b></p><p> int i=0,j;&
20、lt;/p><p><b> char c;</b></p><p> if((fp=fopen("d:\\notesave.txt","w"))==NULL)</p><p><b> {</b></p><p> printf("\n Can
21、not open file!\n");</p><p> getchar();</p><p><b> exit(1);</b></p><p><b> }</b></p><p> for(i=0;i<n;i++)</p><p><b&g
22、t; {</b></p><p> fputc(a[i],fp);</p><p> fputs("-->",fp);</p><p> for(j=hfm_code[i].start+1;j<n;j++)</p><p><b> {</b></p>
23、<p> c=char(48+hfm_code[i].bit[j]);</p><p> fputc(c,fp);</p><p><b> }</b></p><p> fputs(" ",fp);</p><p> if((i+1)%3==0) fputs("\n&
24、quot;,fp);</p><p><b> }</b></p><p> fclose(fp);</p><p> printf("\n 保存成功!\n");</p><p><b> }</b></p><p> hfm_n *hfmtre
25、e(int n,char a[],int s[])</p><p><b> {</b></p><p> hfm_n hfm_node[MAXNODE];</p><p> hfm_c hfm_code[MAXLEAF],cd;</p><p> int i,j,m1,m2,x1,x2,c,p;</p&g
26、t;<p><b> char ch1;</b></p><p> for(i=0;i<2*n-1;i++)</p><p><b> {</b></p><p> hfm_node[i].weight=0;</p><p> hfm_node[i].parent=-1
27、;</p><p> hfm_node[i].lchild=-1;</p><p> hfm_node[i].rchild=-1;</p><p><b> }</b></p><p> for(i=0;i<n;i++)</p><p> hfm_node[i].weight=s[
28、i];</p><p> for(i=0;i<n-1;i++)</p><p><b> {</b></p><p> m1=m2=MAXVALUE;</p><p><b> x1=x2=0;</b></p><p> for(j=0;j<n+i;j+
29、+)</p><p><b> {</b></p><p> if(hfm_node[j].parent==-1&&hfm_node[j].weight<m1)</p><p><b> {</b></p><p><b> m2=m1;</b>&
30、lt;/p><p><b> x2=x1;</b></p><p> m1=hfm_node[j].weight;</p><p><b> x1=j;</b></p><p><b> }</b></p><p><b> else&l
31、t;/b></p><p> if(hfm_node[j].parent==-1&&hfm_node[j].weight<m2)</p><p><b> {</b></p><p> m2=hfm_node[j].weight;</p><p><b> x2=j;<
32、/b></p><p><b> }</b></p><p><b> }</b></p><p> hfm_node[x1].parent=hfm_node[x2].parent=n+i;</p><p> hfm_node[n+i].weight=hfm_node[x1].weig
33、ht+hfm_node[x2].weight;</p><p> hfm_node[n+i].lchild=x1;</p><p> hfm_node[n+i].rchild=x2;</p><p><b> }</b></p><p> for(i=0;i<n;i++)</p><p&
34、gt;<b> {</b></p><p> cd.start=n-1;</p><p><b> c=i;</b></p><p> p=hfm_node[c].parent;</p><p> while(p!=-1)</p><p><b> {&
35、lt;/b></p><p> if(hfm_node[p].lchild==c)</p><p> cd.bit[cd.start]=0;</p><p><b> else</b></p><p> cd.bit[cd.start]=1;</p><p> cd.start--
36、;</p><p><b> c=p;</b></p><p> p=hfm_node[c].parent;</p><p><b> }</b></p><p> for(j=cd.start+1;j<n;j++)</p><p> hfm_code[i].
37、bit[j]=cd.bit[j];</p><p> hfm_code[i].start=cd.start;</p><p><b> }</b></p><p> printf("\n\n 所有編碼:\n ");</p><p> for(i=0;i<n;i++)</p>
38、<p> printf("%c",a[i]);</p><p> printf("<===>");</p><p> for(i=0,c=0;i<n;i++)</p><p> for(j=hfm_code[i].start+1;j<n;j++)</p><p&g
39、t;<b> {</b></p><p> printf("%d",hfm_code[i].bit[j]);</p><p><b> c++;</b></p><p> if(c==48||(c-48)%78==0) printf("\n ");</p>&l
40、t;p><b> }</b></p><p> printf("\n\n 各字符對應(yīng)的編碼:\n");</p><p> for(i=0;i<n;i++)</p><p><b> {</b></p><p> printf(" ");&
41、lt;/p><p> printf("%c-->",a[i]);</p><p> for(j=hfm_code[i].start+1;j<n;j++)</p><p> printf("%d",hfm_code[i].bit[j]);</p><p> printf(" &
42、quot;);</p><p> if((i+1)%5==0) printf("\n");</p><p><b> }</b></p><p> printf("\n\n 是否將結(jié)果保存到--->路徑D:\\ notesave (y/n)?");</p><p>
43、ch1=getchar();getchar();</p><p> if(ch1=='y'||ch1=='Y')</p><p> notesave(n,a,hfm_code);</p><p> return NULL;</p><p><b> }</b></p>
44、<p> int readnote()</p><p><b> {</b></p><p><b> FILE *fp;</b></p><p> int i,j,b[26],s[26],k;</p><p> char a[26],ch,ch1='n';&l
45、t;/p><p> memset(b,0,sizeof(b));</p><p> if((fp=fopen("d:\\note.txt","r"))==NULL)</p><p><b> {</b></p><p> printf("\n Cannot open
46、the file of note!");</p><p> printf("\n Please creat a new text!\n");</p><p><b> ch1='y';</b></p><p><b> }</b></p><p>
47、 if(ch1=='y')</p><p><b> {</b></p><p> printf("\n 此功能你要做的只是將要編碼的字符文本復(fù)制到下面文本并將它命名為note并\</p><p> \n 保存到--->D:\\...\</p><p> \n 需注意的是一定要是
48、字符文本且文本保存路徑是D盤下.\n ");</p><p> system("notepad");printf("\n 保存好文本后,請按任意鍵繼續(xù)....");</p><p> getchar();</p><p> if((fp=fopen("d:\\note.txt","
49、r"))==NULL)</p><p><b> {</b></p><p> printf("\n Open files fail!");</p><p> getchar();</p><p><b> exit(1);</b></p><
50、;p><b> }</b></p><p><b> }</b></p><p> while((ch=fgetc(fp))!=EOF)</p><p><b> {</b></p><p> if(sizeof(ch)!=1) break;</p>
51、<p> k=int(ch);</p><p> if(k>=65&&k<=90)</p><p> b[k-65]++;</p><p> if(k>=97&&k<=122) </p><p> b[k-97]++;</p><p>&l
52、t;b> }</b></p><p> fclose(fp);</p><p> printf("\n 文本中各字符的頻率為:\n");</p><p> for(i=0,j=0;i<26;i++)</p><p> if(b[i]!=0) </p><p>&l
53、t;b> {</b></p><p> ch=char(i+65); a[j]=ch;s[j]=b[i];</p><p> printf(" %c--->%d ",a[j],s[j]); j++;</p><p> if(j%6==0) printf("\n");</p><
54、;p><b> }</b></p><p> hfmtree(j,a,s);</p><p><b> return 1;</b></p><p><b> }</b></p><p> void main()</p><p><b
55、> {</b></p><p> int i,h,n=0,b[26];</p><p> char a[26],c[30],ch,ch1;</p><p><b> for(;;)</b></p><p><b> {</b></p><p>
56、printf("\n\n\n\t\t <<-\1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1->>\n");</p><p> printf("\t\t =======* * * * * * * * * * * * * *=======\n");</p>&
57、lt;p> printf("\t\t =====>>*歡迎使用本哈夫曼編碼系統(tǒng)!*<<=====\n");</p><p> printf("\t\t = *__*__*__*__*__*__*__*__* =\n");</p><p> printf("\t\t
58、 = |_ _ _ _ 功能選項!_ _ _ _| =\n");</p><p> printf("\t\t = ------------/ \\----------- =\n");</p><p> printf("\t\t = |
59、 | =\n");</p><p> printf("\t\t = | 1.為一字符文本編碼. | =\n");</p><p> printf("\t\t = | | =\n");</p><p&g
60、t; printf("\t\t = | 2.輸入部分字符與相應(yīng)頻率為之編碼.| =\n");</p><p> printf("\t\t = | | =\n");</p><p> printf("\t\t = | 3.退出程序.
61、 | =\n");</p><p> printf("\t\t = | | =\n");</p><p> printf("\t\t = | 4.打開保存的文本. | =\n");</p>
62、<p> printf("\t\t = | | =\n");</p><p> printf("\t\t = ------------------------------------- =\n");</p><p> printf(H);</p&
63、gt;<p> printf("\n\t\t 請選擇某功能選項(1~4):");</p><p> scanf("%d",&h);getchar();</p><p><b> switch(h)</b></p><p><b> {</b></
64、p><p> case 1: system("cls");printf("\n 功能1:為一字符文本編碼!\n");readnote();break;</p><p> case 2: system("cls");printf("\n 功能2:輸入部分字符與相應(yīng)頻率為之編碼!\n");</p>&
65、lt;p> printf("\n ===>輸入格式應(yīng)為:字符+空格\n ===>例如:a b c.....\</p><p> \n ===>對應(yīng)的字符頻率格式也應(yīng)如此.\n");</p><p><b> do</b></p><p><b> {</b></p&
66、gt;<p> printf("\n 請輸入葉子結(jié)點個數(shù):");</p><p> if(scanf("%d",&n)!=1||sizeof(n)!=4)</p><p><b> {</b></p><p><b> ch='s';</b&g
67、t;</p><p> printf("\n Input worry!\n Please input again.\n");</p><p><b> }</b></p><p> else ch='n';</p><p> getchar();</p><
68、p> }while(ch=='s');</p><p><b> do</b></p><p><b> {</b></p><p> printf("\n =======>請輸入相應(yīng)個字符:");</p><p> for(i=0;i<
69、;n;i++)</p><p><b> {</b></p><p> a[i]=getchar();</p><p> ch1=getchar();</p><p><b> }</b></p><p> if(ch1!='\n') gets(c)
70、;</p><p> printf("\n 請輸入相應(yīng)字符對應(yīng)的頻率:");</p><p> for(i=0;i<n;i++)</p><p> scanf("%d",&b[i]);</p><p> ch1=getchar();</p><p> if
71、(ch1!='\n') gets(c);</p><p> printf("\n 確認所有數(shù)據(jù)無誤后請按'Enter'(否則按'y')");</p><p> ch=getchar();</p><p> }while(ch=='y'||ch=='Y');<
72、;/p><p> hfmtree(n,a,b);break;</p><p> case 3: printf("\n\n\n");printf(H);printf("\t\t\t\t \1歡迎下次使用\1\n");printf(H);</p><p> printf("\t\t");return;<
73、/p><p> case 4: printf("\nNotesave 中的信息:\n");system("type d:\\notesave.txt");break;</p><p> default: printf("\t\t \a輸入有誤!\t");getchar();break;</p><p>&
74、lt;b> }</b></p><p> printf("\n ");</p><p> system("pause");</p><p> system("cls");</p><p><b> }</b></p>&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--哈夫曼編編譯器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告----哈夫曼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告---哈夫曼編碼器
- 哈夫曼課程設(shè)計報告--哈夫曼編譯碼器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---哈夫曼編碼
- 哈夫曼樹_數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---哈夫曼編碼器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計----哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---哈夫曼編碼器
- 哈夫曼樹_數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計哈夫曼編碼
- 赫夫曼編譯碼器數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-哈夫曼編碼譯碼器
- 數(shù)據(jù)結(jié)構(gòu) 課程設(shè)計之哈夫曼編碼
- 應(yīng)用數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---哈夫曼樹
- 哈夫曼編譯碼器課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--哈夫曼編碼和譯碼報告
評論
0/150
提交評論