版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 課 程 設(shè) 計 報 告</p><p> 題目: 《哈夫曼編碼》 </p><p> 院 系: 計算機科學(xué)與應(yīng)用系</p><p> 專業(yè)年級: 計算機科學(xué)與技術(shù) </p><p> 學(xué) 號: </p><p>
2、學(xué)生姓名: </p><p> 指導(dǎo)老師: </p><p> 2013年06月25日</p><p><b> 目 錄</b></p><p> 1.設(shè)計任務(wù)書………………………………………………………………3</p>&
3、lt;p> 1.1題目與要求…………………………………………………………3</p><p> 1.2涉及知識點…………………………………………………………3</p><p> 1.3輸入輸出分析………………………………………………………3</p><p> 1.4測試數(shù)據(jù)分析………………………………………………………3</p><p
4、> 2.概要設(shè)計…………………………………………………………………4</p><p> 2.1結(jié)構(gòu)體類型定義及函數(shù)聲明………………………………………4</p><p> 2.2主程序流程…………………………………………………………5</p><p> 3.詳細設(shè)計…………………………………………………………………7</p><p&g
5、t; 3.1數(shù)據(jù)類型實現(xiàn)………………………………………………………7</p><p> 3.2程序偽碼……………………………………………………………</p><p> 3.3程序主要流程圖……………………………………………………</p><p> 4.調(diào)試分析…………………………………………………………………</p><p> 4.
6、1問題分析及回顧……………………………………………………</p><p> 4.2算法時空分析………………………………………………………</p><p> 4.3設(shè)想改進……………………………………………………………</p><p> 4.4經(jīng)驗和體會…………………………………………………………</p><p> 5.用戶使用說明……
7、………………………………………………………</p><p> 5.1操作說明及詳細步驟………………………………………………</p><p> 6.測試結(jié)果…………………………………………………………………</p><p> 6.1測試數(shù)據(jù)及結(jié)果……………………………………………………</p><p> 7.參考文獻…………………………
8、………………………………………</p><p> 8.致謝………………………………………………………………………</p><p><b> 設(shè)計任務(wù)書</b></p><p><b> 1.1題目與要求</b></p><p><b> 題目:哈夫曼編碼</b><
9、/p><p><b> 要求:</b></p><p> 1、I:初始化(Initialization),從終端讀入字符集大小n,以及n個字符和n個權(quán)值,建立哈夫曼樹,并將它存于文件hfmTree中。2、E:編碼(Encoding),利用已建好的哈夫曼樹(如不在內(nèi)存,則從文件hfmTree中讀人),對文件ToBeTran中的正文進行編碼,然后將結(jié)果存入文件CodeF
10、ile中。3、D:譯碼(Decoding),利用已建好的哈夫曼樹將文件CodeFile中的代碼進行譯碼,結(jié)果存入文件TextFile中。4、P:輸出代碼文件(Print),將文件CodeFile以緊湊格式顯示在終端上,每行50個代碼。同時將此字符形式的編碼文件寫入文件CodePrin中。5、T:輸出哈夫曼樹(TreePrinting),將已在內(nèi)存中的哈夫曼樹以直觀的方式(樹或凹人表形式)顯示在終端上,同時將此字符形式的哈夫曼樹寫入
11、文件TreePrint中。</p><p><b> 1.2設(shè)計知識點</b></p><p> 哈夫曼樹的建立,哈夫曼編碼的生成,對編碼信息的翻譯,文件、結(jié)構(gòu)體、指針、鏈表、數(shù)組、循環(huán)語句、選擇語句、輸入輸出控制等。</p><p><b> 1.3輸入輸出分析</b></p><p>
12、 對于用戶輸入數(shù)據(jù)進行存儲,統(tǒng)計各字符出現(xiàn)的頻率,然后通過Huffman編碼得到的各種字符的Huffman編碼。此時程序需要輸入一串Huffman代碼串。輸入完畢程序會判斷輸入的代碼串是否合法,若合法則輸出譯碼結(jié)果。</p><p><b> 1.4測試數(shù)據(jù)分析</b></p><p> 用下表給出的字符集和頻度的實際統(tǒng)計數(shù)據(jù)建立哈夫曼樹,并實現(xiàn)以下報文的編碼和譯
13、碼:“aabbccdd”。字符 a b c d e f g h ij k l m n o p q r s t u v w x y z權(quán)值 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26</p><p><b> 概要設(shè)計</b></p><p> 2.1結(jié)構(gòu)體類型及
14、函數(shù)聲明</p><p> 1. 哈夫曼樹類型(樹形結(jié)構(gòu)):</p><p> void main(void){ int i; void settree(void); //建立樹 void code(void); //對文件編碼 void decode(void); // 譯碼 void disp(void); root=(s
15、truct node*)malloc(sizeof(struct node)); puts("*******************哈夫曼編/譯碼器演示******************************");</p><p><b> 建立編碼</b></p><p> void settree(void){ int
16、 i,j,k; struct node *p1,*p2,*tmp,*p; void go(struct node *); void setcode(struct node *);//建立每一個字符的編碼 void printtree(struct node *); puts("輸入字符集的大?。?quot;); scanf("%d",&n)
17、; while(getchar()!='\n') continue;</p><p><b> }</b></p><p><b> 詳細設(shè)計</b></p><p><b> 3.1數(shù)據(jù)類型實現(xiàn)</b></p><p> 1、哈夫
18、曼編碼采用一個字符串數(shù)組存儲。2、用戶界面可以設(shè)計為“菜單”方式:顯示上述功能符號,再加上“Q”,表示退出運行Quit。請用戶鍵入一個選擇功能符。此功能執(zhí)行完畢后再顯示此菜單,直至某次用戶選擇了“Q”為止。3、在程序的一次執(zhí)行過程中,第一次執(zhí)行I、D或C命令之后,哈夫曼樹已經(jīng)在內(nèi)存了,不必再讀入。每次執(zhí)行中不一定執(zhí)行I命令,因為文件hfmTree可能早已建好。</p><p> 3.Main函數(shù)流程圖<
19、;/p><p><b> 問題分析及回顧</b></p><p><b> 4.1</b></p><p> 問題一:哈夫曼樹的建立</p><p><b> 問題二:編譯進行</b></p><p><b> 4.4經(jīng)驗與體會</
20、b></p><p> 此次課程設(shè)計,我編寫程序的時候遇到了不少問題,在攻克這些問題,最終實現(xiàn)課題任務(wù)的過程中,我學(xué)到了不少東西:</p><p> 首先,在完成一個課題之前,要仔細理解課題要求。通過這次課程設(shè)計,我更加深入了理解了哈夫曼編碼的過程,以及利用哈夫曼編碼對數(shù)據(jù)進行壓縮的優(yōu)越性,并且使我能夠更熟練地運用樹形的數(shù)據(jù)結(jié)構(gòu)。并且體會到了在學(xué)習(xí)中,要嚴格要求自己,不能因為一點
21、點的成功就驕傲自滿,停止不前。</p><p><b> 5.用戶使用說明</b></p><p><b> 進入程序:</b></p><p><b> 圖 1.程序開始</b></p><p><b> 程序提示:</b></p>
22、<p> 圖2. 輸入字符集的大小</p><p><b> 輸入</b></p><p><b> 編譯</b></p><p><b> 參考文獻</b></p><p> 1.《數(shù)據(jù)結(jié)構(gòu)(C語言描述)》;出版社:中國水利水電出版社;主編:馬秋菊;&l
23、t;/p><p> 2.嚴蔚敏 《數(shù)據(jù)結(jié)構(gòu)》(C語言版) 清華大學(xué)出版社</p><p> 3.wenku.baidu.com ;百度文庫</p><p><b> 源程序:</b></p><p> #include<stdio.h></p><p> #include<
24、string.h></p><p> #include<stdlib.h></p><p> #include<ctype.h></p><p><b> int n;</b></p><p> struct node{</p><p><b>
25、int w;</b></p><p><b> int flag;</b></p><p><b> char c;</b></p><p> struct node *plink,*llink,*rlink;</p><p> char code[20];</p>
26、<p> }*num[20],*root;</p><p><b> FILE *fp;</b></p><p> char tmpcode[20];</p><p><b> int t=0;</b></p><p> void main(void)</p>&
27、lt;p><b> {</b></p><p><b> int i;</b></p><p> void settree(void); //建立樹</p><p> void code(void); //對文件編碼</p><p> void decode(void);
28、 // 譯碼</p><p> void disp(void);</p><p> root=(struct node*)malloc(sizeof(struct node));</p><p> puts("*******************哈夫曼編/譯碼器演示******************************");&l
29、t;/p><p><b> while(1){</b></p><p><b> start:</b></p><p> puts("1. 初始化 2.顯示編碼表 3. 退出");</p><p> while(scanf("%d",
30、&i)!=1)</p><p><b> {</b></p><p> while(getchar()!='\n')</p><p><b> continue;</b></p><p> puts("輸入錯誤!");</p><
31、;p> puts("請重新輸入!");</p><p> puts("1. 初始化 2.顯示編碼表 3. 退出");</p><p><b> }</b></p><p> switch (i)</p><p><b> {</b&g
32、t;</p><p><b> case 1:</b></p><p> settree();</p><p><b> break;</b></p><p><b> case 2: </b></p><p><b> disp()
33、;</b></p><p><b> break;</b></p><p><b> case 3:</b></p><p><b> exit(0);</b></p><p><b> break;</b></p>&l
34、t;p><b> default:</b></p><p> puts("輸入錯誤!");</p><p> puts("請重新輸入!");</p><p> goto start;</p><p><b> }</b></p>
35、<p><b> }</b></p><p><b> }</b></p><p> void settree(void)</p><p><b> {</b></p><p> int i,j,k;</p><p> struct
36、 node *p1,*p2,*tmp,*p;</p><p> void go(struct node *);</p><p> void setcode(struct node *);//建立每一個字符的編碼</p><p> void printtree(struct node *);</p><p> puts("輸入
37、字符集的大?。?quot;);</p><p> scanf("%d",&n);</p><p> while(getchar()!='\n')</p><p><b> continue;</b></p><p> for(i=0;i<n;i++)</p&
38、gt;<p><b> {</b></p><p> p=(struct node *)malloc(sizeof(struct node));</p><p> puts("請輸入一個字符");</p><p> scanf("%c",&p->c);</p>
39、;<p> while(getchar()!='\n')</p><p><b> continue;</b></p><p> puts("請輸入該字符的權(quán)值:");</p><p> scanf("%d",&p->w);</p><
40、;p> while(getchar()!='\n')</p><p><b> continue;</b></p><p> p->plink=NULL;</p><p> p->rlink=NULL;</p><p> p->llink=NULL;</p>
41、<p><b> num[i]=p;</b></p><p><b> }</b></p><p> for(i=0;i<n-1;i++) //(遞增)排序</p><p><b> {</b></p><p> for(j=i+1;j<n;
42、j++)</p><p><b> {</b></p><p> if(num[i]->w>num[j]->w)</p><p><b> {</b></p><p> tmp=num[i];</p><p> num[i]=num[j];<
43、/p><p> num[j]=tmp;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> /*******************************開始建立樹*
44、**********************/</p><p> num[n]=NULL; //結(jié)束標志</p><p><b> k=n;</b></p><p> while(num[1]!=NULL)</p><p><b> {</b></p><p>
45、 p=(struct node *)malloc(sizeof(struct node));</p><p> p1=num[0];</p><p> p2=num[1];</p><p> p->llink=p1;</p><p> p->rlink=p2;</p><p> p->pl
46、ink=NULL;</p><p> p1->plink=p;</p><p> p2->plink=p;</p><p> p->w=p1->w+p2->w;</p><p> for(i=1;i<k;i++)</p><p><b> {</b>&
47、lt;/p><p> num[i]=num[i+1];</p><p><b> }</b></p><p><b> k--;</b></p><p><b> num[0]=p;</b></p><p> for(i=0;i<k-1;i+
48、+) //排序</p><p><b> {</b></p><p> for(j=i+1;j<k;j++)</p><p><b> {</b></p><p> if(num[i]->w>num[j]->w)</p><p><b&
49、gt; {</b></p><p> tmp=num[i];</p><p> num[i]=num[j];</p><p> num[j]=tmp;</p><p><b> }</b></p><p><b> }</b></p>&
50、lt;p><b> }</b></p><p><b> }</b></p><p> root=num[0];</p><p><b> /*建立完畢*/</b></p><p> /*寫入文件,前序*/</p><p> if((f
51、p=fopen("c:\\hfmtree.wxl","wb"))==NULL)</p><p><b> {</b></p><p> puts("文件打開錯誤!");</p><p> getchar();</p><p><b> exit
52、(0);</b></p><p><b> }</b></p><p> setcode(root);</p><p><b> go(root);</b></p><p> fclose(fp);</p><p><b> }</b&g
53、t;</p><p> void setcode(struct node *p)</p><p><b> {</b></p><p> if(p->llink==NULL&&p->rlink==NULL)</p><p><b> {</b></p>
54、<p> tmpcode[t]='\0';</p><p> strcpy(p->code,tmpcode);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b>&
55、lt;/p><p> tmpcode[t++]='0';</p><p> setcode(p->llink);</p><p><b> t--;</b></p><p> tmpcode[t++]='1';</p><p> setcode(p-&g
56、t;rlink);</p><p><b> t--;</b></p><p><b> }</b></p><p><b> }</b></p><p> void go(struct node *p)</p><p><b> {
57、</b></p><p> if(p->llink==NULL&&p->rlink==NULL)</p><p><b> {</b></p><p> fputc('(',fp);</p><p> fputc(p->c,fp);</p>
58、<p> fputs(p->code,fp);</p><p> fputc(')',fp);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p>
59、;<p> go(p->llink);</p><p> go(p->rlink);</p><p><b> }</b></p><p><b> }</b></p><p> void code(void)</p><p><b&
60、gt; {</b></p><p> FILE *fp1,*fp2,*fp3;</p><p> char ch1,ch2,c;</p><p> if((fp1=fopen("c:\\hfmtree.wxl","rb"))==NULL)</p><p><b> {&l
61、t;/b></p><p> puts("文件打開錯誤!");</p><p> getchar();</p><p><b> exit(0);</b></p><p><b> }</b></p><p> if((fp2=fopen(
62、"c:\\tobetrans.txt","wb"))==NULL)</p><p><b> {</b></p><p> puts("文件打開錯誤!");</p><p> getchar();</p><p><b> exit(0);&l
63、t;/b></p><p><b> }</b></p><p> if((fp3=fopen("c:\\codefile.wxl","wb"))==NULL)</p><p><b> {</b></p><p> puts("文件打
64、開錯誤!");</p><p> getchar();</p><p><b> exit(0);</b></p><p><b> }</b></p><p> while((ch1=fgetc(fp2))!=EOF)</p><p><b>
65、 {</b></p><p><b> t=0;</b></p><p> while((ch2=fgetc(fp1))!=EOF)</p><p><b> {</b></p><p> if(ch1==ch2)</p><p><b> {
66、</b></p><p> while((c=fgetc(fp1))!=')')</p><p><b> {</b></p><p> tmpcode[t++]=c;</p><p><b> }</b></p><p> tmpcod
67、e[t]='\0';</p><p> fputs(tmpcode,fp3);</p><p> fputc('@',fp3);</p><p> rewind(fp1);</p><p><b> break;</b></p><p><b>
68、 }</b></p><p><b> }</b></p><p><b> }</b></p><p> fclose(fp1);</p><p> fclose(fp2);</p><p> fclose(fp3);</p><p
69、><b> }</b></p><p> void decode(void)</p><p><b> {</b></p><p> FILE *fp1,*fp2,*fp3;</p><p> char ch1,ch2,ch3;</p><p> char
70、temp_3[20];</p><p> char temp_1[20];</p><p> int t1,t3;</p><p> if((fp1=fopen("c:\\hfmtree.wxl","rb"))==NULL)</p><p><b> {</b></p
71、><p> puts("文件打開錯誤!");</p><p> getchar();</p><p><b> exit(0);</b></p><p><b> }</b></p><p> if((fp2=fopen("c:\\text
72、file.txt","wb"))==NULL)</p><p><b> {</b></p><p> puts("文件打開錯誤!");</p><p> getchar();</p><p><b> exit(0);</b></p&
73、gt;<p><b> }</b></p><p> if((fp3=fopen("c:\\codefile.wxl","rb"))==NULL)</p><p><b> {</b></p><p> puts("文件打開錯誤!");<
74、;/p><p> getchar();</p><p><b> exit(0);</b></p><p><b> }</b></p><p> while((ch3=fgetc(fp3))!=EOF)</p><p><b> {</b><
75、;/p><p><b> t3=0;</b></p><p> while(ch3!='@')</p><p><b> {</b></p><p> temp_3[t3++]=ch3;</p><p> ch3=fgetc(fp3);</p>
76、;<p><b> }</b></p><p> temp_3[t3]='\0';</p><p> while((ch1=fgetc(fp1))!=EOF)</p><p><b> {</b></p><p> if(isalpha(ch1))</p
77、><p><b> {</b></p><p><b> ch2=ch1;</b></p><p><b> t1=0;</b></p><p> while((ch1=fgetc(fp1))!=')')</p><p><b&
78、gt; {</b></p><p> temp_1[t1++]=ch1;</p><p><b> }</b></p><p> temp_1[t1]='\0';</p><p> if(strcmp(temp_1,temp_3)==0)</p><p>&l
79、t;b> {</b></p><p> fputc(ch2,fp2);</p><p> rewind(fp1);</p><p><b> break;</b></p><p><b> }</b></p><p><b> }<
80、;/b></p><p><b> }</b></p><p><b> }</b></p><p> fclose(fp1);</p><p> fclose(fp2);</p><p> fclose(fp3);</p><p>&
81、lt;b> }</b></p><p> void disp(void)</p><p><b> {</b></p><p> FILE *fp1,*fp2;</p><p> char ch1,ch2;</p><p> char tmp[20];</p&g
82、t;<p><b> int t;</b></p><p> if((fp1=fopen("c:\\hfmtree.wxl","rb"))==NULL)</p><p><b> {</b></p><p> puts("文件打開錯誤!");
83、</p><p> getchar();</p><p><b> exit(0);</b></p><p><b> }</b></p><p> if((fp2=fopen("c:\\hfmcode.txt","wb"))==NULL)</p
84、><p><b> {</b></p><p> puts("文件打開錯誤!");</p><p> getchar();</p><p><b> exit(0);</b></p><p><b> }</b></p&g
85、t;<p> while((ch1=fgetc(fp1))!=EOF)</p><p><b> {</b></p><p> if(ch1=='(')</p><p><b> {</b></p><p><b> t=0;</b>&l
86、t;/p><p> ch1=fgetc(fp1);</p><p><b> ch2=ch1;</b></p><p> while((ch1=fgetc(fp1))!=')')</p><p><b> {</b></p><p> tmp[t++]=
87、ch1;</p><p><b> }</b></p><p> tmp[t]='\0';</p><p> printf("%c-----%s\n",ch2,tmp);</p><p> fputc(ch2,fp2);</p><p> fputc(
88、'-',fp2);</p><p> fputc('-',fp2);</p><p> fputc('-',fp2);</p><p> fputs(tmp,fp2);</p><p> fputc('\n',fp2);</p><p><b
89、> }</b></p><p><b> }</b></p><p> fclose(fp1);</p><p> fclose(fp2);</p><p><b> }</b></p><p> 《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計》評分標準</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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《哈夫曼編碼》課程設(shè)計
- 課程設(shè)計哈夫曼編碼
- 課程設(shè)計 哈夫曼樹及哈夫曼編碼
- 哈夫曼編碼課程設(shè)計
- 課程設(shè)計哈夫曼編碼
- 哈夫曼編碼課程設(shè)計報告
- 課程設(shè)計--哈夫曼編碼與譯碼
- 課程設(shè)計---哈夫曼編碼編程實現(xiàn)
- 哈夫曼編碼的java實現(xiàn)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計----哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計哈夫曼編碼
- 哈夫曼編碼與譯碼課程設(shè)計報告
- 哈夫曼編碼譯碼器課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--哈夫曼編碼
- 哈夫曼編碼譯碼的實現(xiàn)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計哈夫曼編碼
- 課程設(shè)計-哈夫曼編碼的分析和實現(xiàn)
- 哈夫曼編碼譯碼器課程設(shè)計--- 哈夫曼樹的建立與實現(xiàn)
評論
0/150
提交評論