版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 課 程 設(shè) 計(jì) 說 明 書</p><p> 課程名稱: 數(shù)據(jù)結(jié)構(gòu)與算法 </p><p> 設(shè)計(jì)題目: 哈夫曼編\譯碼器 </p><p> 院 系: 計(jì)算機(jī)科學(xué)與信息工程學(xué)院 </p><p> 學(xué)生姓名:
2、 </p><p> 學(xué) 號: </p><p> 專業(yè)班級: </p><p> 指導(dǎo)教師: </p><p> 2017年 12 月 11日</p><p&
3、gt; 課 程 設(shè) 計(jì) 任 務(wù) 書</p><p><b> 哈夫曼編\譯碼器</b></p><p> 摘 要:采用哈夫曼編碼思想實(shí)現(xiàn)對字符串的編碼,以及對編碼的解碼。字符串的長度不小于5000字節(jié)。讀取要編碼的文本文件,將文件的內(nèi)容進(jìn)行編碼,生成新的文件。對編碼文件進(jìn)行解碼,獲得文本文件。將譯碼的文本文件和原文件進(jìn)行比較,恢復(fù)文件和原文件必須完全一致。&l
4、t;/p><p> 關(guān)鍵詞:構(gòu)建哈夫曼樹 哈弗曼編碼 哈夫曼譯碼 字符串編碼 打印編碼函數(shù)</p><p><b> 1.設(shè)計(jì)背景</b></p><p> 1.1哈夫曼樹的介紹</p><p> Huffman Tree,中文名是哈夫曼樹或霍夫曼樹或者赫夫曼樹,它是最優(yōu)二叉樹。</p><p
5、> 定義:給定n個(gè)權(quán)值作為n個(gè)葉子結(jié)點(diǎn),構(gòu)造一棵二叉樹,若樹的帶權(quán)路徑長度達(dá)到最小,則這棵樹被稱為哈夫曼樹。 </p><p> (01) 路徑和路徑長度</p><p> 定義:在一棵樹中,從一個(gè)結(jié)點(diǎn)往下可以達(dá)到的孩子或?qū)O子結(jié)點(diǎn)之間的通路,稱為路徑。通路中分支的數(shù)目稱為路徑長度。若規(guī)定根結(jié)點(diǎn)的層數(shù)為1,則從根結(jié)點(diǎn)到第L層結(jié)點(diǎn)的路徑長度為L-1。 </p><
6、;p> (02) 結(jié)點(diǎn)的權(quán)及帶權(quán)路徑長度</p><p> 定義:若將樹中結(jié)點(diǎn)賦給一個(gè)有著某種含義的數(shù)值,則這個(gè)數(shù)值稱為該結(jié)點(diǎn)的權(quán)。結(jié)點(diǎn)的帶權(quán)路徑長度為:從根結(jié)點(diǎn)到該結(jié)點(diǎn)之間的路徑長度與該結(jié)點(diǎn)的權(quán)的乘積。 </p><p> (03) 樹的帶權(quán)路徑長度</p><p> 定義:樹的帶權(quán)路徑長度規(guī)定為所有葉子結(jié)點(diǎn)的帶權(quán)路徑長度之和,記為WPL。</
7、p><p> 1.2設(shè)計(jì)的作用、目的</p><p> 通過完成具體編碼算法的程序設(shè)計(jì)和調(diào)試工作,提高編程能力,深刻理解信源編碼、信道編譯碼的基本思想和目的,掌握編碼的基本原理與編碼過程,增強(qiáng)邏輯思維能力,培養(yǎng)和提高自學(xué)能力以及綜合運(yùn)用所學(xué)理論知識去分析解決實(shí)際問題的能力,逐步熟悉開展科學(xué)實(shí)踐的程序和方法。主要目的是加深對理論知識的理解,掌握查閱有關(guān)資料的技能,提高實(shí)踐技能,培養(yǎng)獨(dú)立分析問
8、題、解決問題及實(shí)際應(yīng)用的能力。</p><p> 通過課程設(shè)計(jì)各環(huán)節(jié)的實(shí)踐,應(yīng)達(dá)到如下要求:</p><p> 1.理解無失真信源編碼的理論基礎(chǔ),掌握無失真信源編碼的基本方法;</p><p> 2.根據(jù)哈夫曼編碼算法,考慮一個(gè)有多種可能符號(各種符號發(fā)生的概率不同)的信源,得到哈夫曼編碼和碼樹;</p><p> 3.掌握哈夫曼編碼
9、的優(yōu)缺點(diǎn);</p><p> 4.通過完成具體編碼算法的程序設(shè)計(jì)和調(diào)試工作,提高編程能力,深刻理解信源編碼、信道編譯碼的基本思想和目的,掌握編碼的基本原理與編碼過程,增強(qiáng)邏輯思維能力,培養(yǎng)和提高自學(xué)能力以及綜合運(yùn)用所學(xué)理論知識去分析解決實(shí)際問題的能力,逐步熟悉開展科學(xué)實(shí)踐的程序和方法。</p><p> 1.3設(shè)計(jì)任務(wù)及要求</p><p> 1. 理解無失真
10、信源編碼的理論基礎(chǔ),掌握無失真信源編碼的基本方法;</p><p> 2. 掌握哈夫曼編碼/費(fèi)諾編碼方法的基本步驟及優(yōu)缺點(diǎn);</p><p> 3. 深刻理解信道編碼的基本思想與目的,理解線性分組碼的基本原理與編碼過程;</p><p><b> 2.設(shè)計(jì)方案</b></p><p><b> 2.1實(shí)
11、驗(yàn)內(nèi)容</b></p><p> 假設(shè)有n個(gè)權(quán)值,則構(gòu)造出的哈夫曼樹有n個(gè)葉子結(jié)點(diǎn)。 n個(gè)權(quán)值分別設(shè)為 w1、w2、…、wn,哈夫曼樹的構(gòu)造規(guī)則為:</p><p> 1.將w1、w2、…,wn看成是有n 棵樹的森林(每棵樹僅有一個(gè)結(jié)點(diǎn)); 2. 在森林中選出根結(jié)點(diǎn)的權(quán)值最小的兩棵樹進(jìn)行合并,作為一棵新樹的左、右子樹,且新樹的根結(jié)點(diǎn)權(quán)值為其左、右子樹根結(jié)點(diǎn)權(quán)值之和; 3
12、. 從森林中刪除選取的兩棵樹,并將新樹加入森林; 4. 重復(fù)(02)、(03)步,直到森林中只剩一棵樹為止,該樹即為所求得的哈夫曼樹。</p><p><b> 2.2操作思路</b></p><p> 以{5,6,7,8,15}為例,來構(gòu)造一棵哈夫曼樹。</p><p> 第1步:創(chuàng)建森林,森林包括5棵樹,這5棵樹的權(quán)值分別是5,6,
13、7,8,15。 </p><p> 第2步:在森林中,選擇根節(jié)點(diǎn)權(quán)值最小的兩棵樹(5和6)來進(jìn)行合并,將它們作為一顆新樹的左右孩子(誰左誰右無關(guān)緊要,這里,我們選擇較小的作為左孩子),并且新樹的權(quán)值是左右孩子的權(quán)值之和。即,新樹的權(quán)值是11。 然后,將"樹5"和"樹6"從森林中刪除,并將新的樹(樹11)添加到森林中。 第3步:在森林中,選擇根節(jié)點(diǎn)權(quán)值最小的兩棵樹(7和8
14、)來進(jìn)行合并。得到的新樹的權(quán)值是15。 然后,將"樹7"和"樹8"從森林中刪除,并將新的樹(樹15)添加到森林中。 第4步:在森林中,選擇根節(jié)點(diǎn)權(quán)值最小的兩棵樹(11和15)來進(jìn)行合并。得到的新樹的權(quán)值是26。 然后,將"樹11"和"樹15"從森林中刪除,并將新的樹(樹26)添加到森林中。 第5步:在森林中,選擇根節(jié)點(diǎn)權(quán)值最小的兩棵樹(15和26)來進(jìn)行
15、合并。得到的新樹的權(quán)值是41。 然后,將"樹15"和"樹26"從森林中刪除,并將新的樹(樹41)添加到森林中。 此時(shí),森林中只有一棵樹(樹41)。這棵樹就是我們需要的哈夫曼樹!</p><p><b> 3. 方案實(shí)施</b></p><p> 3.1 C語言編程 </p><p> #inclu
16、de <stdio.h></p><p> #include <stdlib.h></p><p> #include <string.h></p><p> #define MAX 99999</p><p> #define N 27//定義最多節(jié)點(diǎn)個(gè)數(shù)</p><p&g
17、t; #define M 2*N - 1//中間節(jié)點(diǎn)個(gè)數(shù)</p><p> typedef struct </p><p><b> {</b></p><p> int weight;</p><p> int parent;</p><p> int LChild;</p&
18、gt;<p> int RChild;</p><p> }HTNode,HuffmanTree[M+1];//因?yàn)榱闾枂卧皇褂?lt;/p><p> typedef char * HuffmanCode[N+1];</p><p> HuffmanCode co;//創(chuàng)建全局變量用于儲存HuffmanCode</p><p&
19、gt; char CH[N];</p><p> int weight[N] = {64,13,22,32,103,21,15,47,57,1,5,32,20,57,63,15,1,48,51,80,23,8,18,1,16,1};</p><p> HuffmanTree ht;</p><p> char word[30];//全局變量用于儲存鍵入的內(nèi)容
20、</p><p> void Init_CH()</p><p><b> {</b></p><p><b> int i;</b></p><p> CH[26] = ' ';</p><p> CH[0] = 'A';</
21、p><p> for(i=1;i<26;i++)</p><p> CH[i] = 'A'+i;</p><p> for(i=0;i<27;i++)</p><p> printf("%c ",CH[i]);</p><p><b> }</b&g
22、t;</p><p> void select(int *sr,int *sl,int n)</p><p><b> {</b></p><p> int i,point;</p><p> point = MAX;</p><p> for(i=0;i<n;i++)</p
23、><p><b> {</b></p><p> if(ht[i+1].weight<point && ht[i+1].parent==0)</p><p><b> {</b></p><p> *sr = i+1;//*sr是最小的</p><p&g
24、t; point = ht[*sr].weight;</p><p><b> }</b></p><p><b> }</b></p><p> ht[*sr].parent = 1;</p><p> point = MAX;</p><p> for(i=0
25、;i<n;i++)</p><p><b> {</b></p><p> if(ht[i+1].weight<point && ht[i+1].parent==0)</p><p><b> {</b></p><p> *sl = i+1;//*sl是第二小&
26、lt;/p><p> point = ht[*sl].weight;</p><p><b> }</b></p><p><b> }</b></p><p> ht[*sl].parent = 1;</p><p><b> }</b><
27、/p><p> void InitHuffmanCode()</p><p><b> {</b></p><p> int i,sr,sl;</p><p> for(i=1;i<=N;i++)</p><p><b> {</b></p><
28、;p> ht[i].weight = weight[i-1];</p><p> ht[i].parent = 0;</p><p> ht[i].LChild = 0;</p><p> ht[i].RChild = 0;</p><p><b> }</b></p><p>
29、 for(i=N+1;i<=M;i++)</p><p><b> {</b></p><p> ht[i].weight = 0;</p><p> ht[i].parent = 0;</p><p> ht[i].LChild = 0;</p><p> ht[i].RChil
30、d = 0;</p><p><b> }</b></p><p> printf("------初始化完成------\n");</p><p> for(i=N+1;i<=M;i++)</p><p><b> {</b></p><p>
31、; select(&sr,&sl,i-1);</p><p> ht[i].weight = ht[sr].weight + ht[sl].weight;</p><p> ht[sr].parent = i;</p><p> ht[sl].parent = i;</p><p> ht[i].LChild = s
32、r;</p><p> ht[i].RChild = sl;</p><p><b> }</b></p><p> for(i=1;i<=M;i++)</p><p><b> {</b></p><p> printf("%d %d\n"
33、;,ht[i].parent,i);</p><p><b> }</b></p><p><b> }</b></p><p> void CreateHuffmanCode()</p><p><b> {</b></p><p> FIL
34、E * trans;</p><p> int i,start,p,c;</p><p><b> char *cd;</b></p><p> cd = (char *)malloc(N*sizeof(char));</p><p> cd[N-1] = '\0';</p><
35、;p> for(i=1;i<=N;i++)</p><p><b> {</b></p><p> start = N-1;</p><p><b> c = i;</b></p><p> p = ht[i].parent;</p><p><b
36、> while(p)</b></p><p><b> {</b></p><p><b> --start;</b></p><p> if(ht[p].LChild == c)</p><p> cd[start] = '0';</p>
37、<p><b> else</b></p><p> cd[start] = '1';</p><p><b> c = p;</b></p><p> p = ht[p].parent;</p><p><b> }</b></p&g
38、t;<p> co[i] = (char*)malloc((N-start)*sizeof(char));</p><p> strcpy(co[i],&cd[start]);</p><p> printf("%s %d\n",co[i],i);</p><p><b> }</b></
39、p><p> if((trans=fopen("C:trans.txt","w"))==NULL)</p><p><b> {</b></p><p> printf("cannot open trans.txt!");</p><p><b>
40、 exit(0);</b></p><p><b> }</b></p><p> fputs("------哈夫曼編碼表初始化如下------\n",trans);</p><p> for(i=0;i<N;i++)</p><p><b> {</b>
41、;</p><p> fputc(CH[i],trans);</p><p> fputs(" :",trans);</p><p> fputs(co[i+1],trans);</p><p> fputs("\n",trans);</p><p><b>
42、 }</b></p><p> fclose(trans);</p><p><b> }</b></p><p> void InputHuffmanWord()</p><p><b> {</b></p><p><b> FILE *f
43、p;</b></p><p> if((fp = fopen("C:storeWord.txt","w")) == NULL)</p><p><b> {</b></p><p> printf("cannot open storeWord.txt!");</
44、p><p><b> exit(0);</b></p><p><b> }</b></p><p> printf("請輸入以'#'結(jié)束的大寫字母字符串:\n");</p><p> while(strcmp(word,"#")!=0)&
45、lt;/p><p><b> {</b></p><p> fputs(word,fp);</p><p> gets(word);</p><p><b> }</b></p><p> fclose(fp);</p><p><b>
46、; }</b></p><p> //選擇原碼輸入類型</p><p> void SelectInputType()</p><p><b> {</b></p><p> system("cls");</p><p> int point;</
47、p><p><b> while(1)</b></p><p><b> {</b></p><p> printf(" '0':從鍵盤鍵入編碼內(nèi)容\n");</p><p> printf(" '1':從文件中讀取編碼內(nèi)容\n&qu
48、ot;);</p><p> printf(" '2':退出\n");</p><p> scanf("%d",&point);</p><p> system("cls");</p><p> switch(point)</p><
49、;p><b> {</b></p><p> case 0:InputHuffmanWord();break;</p><p><b> case 1:</b></p><p> printf("將編碼內(nèi)容保存在storeWord.txt文件即可。\n");</p><
50、p> printf("請進(jìn)行下一步操作!\n");</p><p><b> break;</b></p><p> case 2:printf("已經(jīng)退出輸入編碼內(nèi)容。。。\n");return ;</p><p> default:printf("Input error!\n&
51、quot;);break;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> //編碼</b></p><p> void Huff
52、man_Encod()</p><p><b> {</b></p><p> int p = M,i,flag;</p><p> FILE *Input,*Output;</p><p><b> char ch;</b></p><p> if((Output
53、 = fopen("C:storeWord.txt","r")) == NULL)</p><p><b> {</b></p><p> printf("cannot open store.txt!");</p><p><b> exit(0);</b>
54、</p><p><b> }</b></p><p> if((Input = fopen("C:storeCode.txt","w")) == NULL)</p><p><b> {</b></p><p> printf("canno
55、t open storeCode.txt!");</p><p><b> exit(0);</b></p><p><b> }</b></p><p> while(!feof(Output))//遇到輸入文件的結(jié)束標(biāo)識</p><p><b> {</b>
56、;</p><p><b> flag = 0;</b></p><p> ch = fgetc(Output);</p><p> //putchar(ch);</p><p> for(i=0;i<N;i++)</p><p><b> {</b><
57、/p><p> if(CH[i] == ch)</p><p><b> {</b></p><p> fputs(co[i+1],Input);</p><p><b> flag = 1;</b></p><p><b> }</b></
58、p><p><b> }</b></p><p> if(flag == 0)</p><p><b> {</b></p><p> fputc('*',Input);</p><p><b> }</b></p>
59、<p><b> }</b></p><p> fclose(Output);</p><p> fclose(Input);</p><p><b> }</b></p><p><b> //譯碼</b></p><p> vo
60、id Huffman_Decod()</p><p><b> {</b></p><p> FILE *fp,*Input;</p><p> int p = M,i=0;</p><p><b> char ch;</b></p><p> if((fp = f
61、open("C:storeCode.txt","r")) == NULL)</p><p><b> {</b></p><p> printf("cannot open storeCode.txt!");</p><p><b> exit(0);</b>
62、</p><p><b> }</b></p><p> if((Input = fopen("C:storeWord_1.txt","w")) == NULL)</p><p><b> {</b></p><p> printf("can
63、not open storeWord_1.txt!");</p><p><b> exit(0);</b></p><p><b> }</b></p><p> ch = fgetc(fp);</p><p> while(!feof(fp))</p><p
64、><b> {</b></p><p> if(ch == '0')</p><p> p = ht[p].LChild;</p><p> else if(ch == '1')</p><p> p = ht[p].RChild;</p><p>
65、 else if(ch == '*')</p><p><b> {</b></p><p> fputs("*",Input);</p><p> putchar(ch);</p><p><b> }</b></p><p>
66、<b> else</b></p><p> printf("Input error!");</p><p> if(ht[p].LChild == 0 && ht[p].RChild == 0)</p><p><b> {</b></p><p>
67、fputc(CH[p-1],Input);</p><p> putchar(CH[p-1]);</p><p><b> p = M;</b></p><p><b> }</b></p><p> ch = fgetc(fp);</p><p><b>
68、 }</b></p><p> fclose(fp);</p><p> fclose(Input);</p><p> printf("\n");</p><p><b> }</b></p><p><b> //譯碼與原碼比較</b
69、></p><p> void Compare_word()</p><p><b> {</b></p><p> char ch_1,ch_2;</p><p> int flag = 1;</p><p> FILE *origin,*decod;</p>&l
70、t;p> if((origin = fopen("C:storeWord.txt","r")) == NULL)</p><p><b> {</b></p><p> printf("cannot open storeCode.txt!");</p><p><b&
71、gt; exit(0);</b></p><p><b> }</b></p><p> if((decod = fopen("C:storeWord_1.txt","r")) == NULL)</p><p><b> {</b></p><
72、p> printf("cannot open storeWord_1.txt!");</p><p><b> exit(0);</b></p><p><b> }</b></p><p> while(!feof(decod))</p><p><b>
73、; {</b></p><p> ch_1 = getc(decod);</p><p> ch_2 = getc(origin);</p><p> if(ch_1 != '*')</p><p><b> {</b></p><p> if(ch_1 !
74、= ch_2)</p><p><b> flag = 0;</b></p><p><b> }</b></p><p><b> }</b></p><p> fclose(decod);</p><p> fclose(origin);&
75、lt;/p><p> if(flag == 0)</p><p> printf("原碼與譯碼不相符!\n");</p><p><b> else</b></p><p> printf("原碼與譯碼相符!\n");</p><p><b>
76、 }</b></p><p> void main()</p><p><b> {</b></p><p> int point;</p><p> Init_CH();</p><p> InitHuffmanCode();</p><p>
77、CreateHuffmanCode();</p><p><b> while(1)</b></p><p><b> {</b></p><p> printf("****** 哈夫曼編譯器 ******\n");</p><p> printf("\n
78、39;0':初始化哈夫曼表\n");</p><p> printf(" '1':輸入編碼內(nèi)容\n");</p><p> printf(" '2':開始編碼\n");</p><p> printf(" '3':開始譯碼\n");&l
79、t;/p><p> printf(" '4':與譯碼與原碼比較\n");</p><p> printf(" '5':退出哈夫曼編譯器\n");</p><p> scanf("%d",&point);</p><p> system(&q
80、uot;cls");</p><p> switch(point)</p><p><b> {</b></p><p><b> case 0:</b></p><p> printf("哈夫曼表初始化完成!\n請進(jìn)行下一步操作!\n");</p>
81、<p><b> break;</b></p><p><b> case 1:</b></p><p> SelectInputType();</p><p><b> break;</b></p><p><b> case 2:</
82、b></p><p> Huffman_Encod();</p><p> printf("編碼結(jié)束!請進(jìn)行下一步操作!\n");</p><p><b> break;</b></p><p><b> case 3:</b></p><p&g
83、t; Huffman_Decod();</p><p> printf("譯碼結(jié)束!已將譯碼內(nèi)容存放storeWord_1.txt!\n");</p><p> printf("請進(jìn)行下一步操作!\n");</p><p><b> break;</b></p><p>&
84、lt;b> case 4:</b></p><p> Compare_word();</p><p><b> break;</b></p><p><b> case 5:</b></p><p> printf("已經(jīng)退出編譯器。。。\n");&l
85、t;/p><p><b> return ;</b></p><p> default:printf("Input error!\n");break;</p><p><b> }</b></p><p><b> }</b></p>&l
86、t;p><b> }</b></p><p><b> 3.2程序介紹</b></p><p> 本程序的編碼和運(yùn)行都是在Visual C++ 6.0中實(shí)現(xiàn)的,在Visual Stdio中也能實(shí)現(xiàn), 整個(gè)程序雖然看似龐大,但編寫過程清晰,采用模塊化編寫,各個(gè)問題逐個(gè)擊破,也方便對程序的管理和運(yùn)行。整個(gè)程序的編寫分為五大部分,五大部分緊
87、密相連,環(huán)環(huán)相扣,共同實(shí)現(xiàn)程序的編碼。</p><p> 在上述存儲結(jié)構(gòu)上實(shí)現(xiàn)的哈夫曼算法可大致描述為(設(shè)T的類型為HuffmanTree): (1)初始化</p><p> 將T[0..m-1]中2n-1個(gè)結(jié)點(diǎn)里的三個(gè)指針均置為空(即置為-1),權(quán)值置為0?!?2)輸入 讀入n個(gè)葉子的權(quán)值存于向量的前n個(gè)分量(即T[0..n-1])中。它們是初始森林中n個(gè)孤立的根結(jié)點(diǎn)上的
88、權(quán)值。 (3)合并 對森林中的樹共進(jìn)行n-1次合并,所產(chǎn)生的新結(jié)點(diǎn)依次放人向量T的第i個(gè)分量中(n≤i≤m-1)。每次合并分兩步: ①在當(dāng)前森林T[0..i-1]的所有結(jié)點(diǎn)中,選取權(quán)最小和次小的兩個(gè)根結(jié)點(diǎn)[p1]和T[p2]作為合并對象,這里0≤p1,p2≤i-1?!?② 將根為T[p1]和T[p2]的兩棵樹作為左右子樹合并為一棵新的樹,新樹的根是新結(jié)點(diǎn)T[i]。具體操作: 將T[p1]和T[p2]的paren
89、t置為i, 將T[i]的lchild和rchild分別置為p1和p2 新結(jié)點(diǎn)T[i]的權(quán)值置為T[p1]和T[p2]的權(quán)值之和。注意: 合并后T[pl]和T[p2]在當(dāng)前森林中已不再是根,因?yàn)樗鼈兊碾p親指針均已指向了T[i],所以下一次合并時(shí)不會被選中為合并對象。</p><p> 3.3程序流程圖以及說明</p><p> 圖3 主程序流程圖</p>
90、<p><b> 4. 結(jié)果與結(jié)論</b></p><p><b> 4.1程序運(yùn)行結(jié)果</b></p><p> 為了最大化優(yōu)化程序,盡可能美觀,設(shè)計(jì)了五個(gè)輸入選擇步驟,可多次進(jìn)行選擇輸入輸出操作,輸入時(shí)可從鍵盤鍵入或者從文件指定路徑獲取。</p><p> printf("****** 哈
91、夫曼編譯器 ******\n");</p><p> printf("\n '0':初始化哈夫曼表\n");</p><p> printf(" '1':輸入編碼內(nèi)容\n");</p><p> printf(" '2':開始編碼\n");&l
92、t;/p><p> printf(" '3':開始譯碼\n");</p><p> printf(" '4':與譯碼與原碼比較\n");</p><p> printf(" '5':退出哈夫曼編譯器\n");</p><p> pr
93、intf("請輸入以'#'結(jié)束的大寫字母字符串:\n");</p><p> while(strcmp(word,"#")!=0)</p><p><b> {</b></p><p> fputs(word,fp);</p><p> gets(word)
94、;</p><p><b> }</b></p><p> fclose(fp);</p><p><b> }</b></p><p> 根據(jù)編寫的程序,通過while循環(huán),在輸入#時(shí)程序輸入結(jié)束,即可進(jìn)行譯碼,并將譯碼內(nèi)容,通過程序存放在C盤中。</p><p>
95、 譯碼內(nèi)容存放在指定位置,找到打開即可見。</p><p> 最后可審核源碼譯碼是否相符,退出哈夫曼編譯器。</p><p><b> 4.2總結(jié)</b></p><p> 本次課程設(shè)計(jì),讓我對哈夫曼編碼以及C語言有了更深的理解和操作能力。開始針對題目進(jìn)行分析,將所涉及的知識點(diǎn),及相關(guān)函數(shù)做了分析,大體能夠把握整體的設(shè)計(jì)流程及思路。再通
96、過查閱相關(guān)資料,使自己的知識也更加豐富了,明白了哈夫曼編碼的原理以及仿真的實(shí)現(xiàn)。</p><p> 首先對給題目進(jìn)行了計(jì)算,進(jìn)行哈夫曼編碼,求出平均碼長,編碼效率,開始時(shí)不是很順利,以前學(xué)的很多書本上的東西記得不太清楚了,經(jīng)過復(fù)習(xí)課本的內(nèi)容,掌握原理后順利求出結(jié)果。然后是利用C語言編寫程序,由于我現(xiàn)在正在公司實(shí)習(xí),接觸到編程的東西比較多,所以對C語言編程還是比較熟悉的,所以我選擇使用C語言來實(shí)現(xiàn)仿真,仔細(xì)研究后
97、得到程序的算法,還有我也參考了一部分網(wǎng)上的算法,但是在運(yùn)行時(shí)還是出錯(cuò)了,之后又經(jīng)過幾次的修改,終于得出了結(jié)果,可是和自己計(jì)算的碼卻是相反的,而其它結(jié)果卻是相同,讓我疑惑了,我又仔細(xì)想了想了,原因應(yīng)該出現(xiàn)在編碼的時(shí)候,在編碼過程中如果0和1賦值相反的話,就會出現(xiàn)這種情況,但是兩種的碼字應(yīng)該都是正確的。過而能改,善莫大焉。在課程設(shè)計(jì)過程中,我們不斷發(fā)現(xiàn)錯(cuò)誤,不斷改正,不斷領(lǐng)悟,不斷獲取最終的檢測調(diào)試環(huán)節(jié),本身就是在踐行過而能改,善莫大焉的知
98、行觀。這次課程設(shè)計(jì)終于順利完成了,在設(shè)計(jì)中遇到了很多問題,最后在同事的指導(dǎo)下,終于迎刃而解。在今后社會的發(fā)展和學(xué)習(xí)實(shí)踐過程中,一定要不懈努力,不能遇到問題就想到要退縮,一定要不厭其煩的發(fā)現(xiàn)問題所在,然后一一進(jìn)行解決,只有這樣,才能成功的做成想做的</p><p> 最后通過這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論</p><p> 知識是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知
99、識與實(shí)踐相結(jié)合起來,從理論中得出結(jié)</p><p> 論,才能真正為社會服務(wù),在設(shè)計(jì)過程中雖然遇到了一些問題,但經(jīng)過一次又一</p><p> 次的思考,一遍又一遍的檢查終于找出了原因所在,也暴露出了前期我在這方面</p><p> 的知識欠缺和經(jīng)驗(yàn)不足。實(shí)踐出真知,通過親自動(dòng)手制作,我掌握的知識不再是紙上談兵,而且提高了自己的動(dòng)手能力和獨(dú)立思考的能力。在這過
100、程中我收獲頗豐,在此期間也得到了同學(xué)的熱心幫助,在這里忠心的感謝。這個(gè)課程設(shè)計(jì)對以后的工作也很有幫助,我會在以后的工作中多將理論與實(shí)際結(jié)合,從根本上解決問題,逐步提高自己的能力。</p><p><b> 5. 收獲與致謝</b></p><p> 通過這次實(shí)驗(yàn)讓我更深刻的了解了獲取輸入內(nèi)容,編碼函數(shù)以及打印編碼函數(shù)的過程。雖然在進(jìn)行過程中遇到了很多問題,但在老師
101、的幫助下和與小組成員的討論下,都一一解決了。這次課程設(shè)計(jì)加強(qiáng)了我的分析問題能力和解決問題能力,也提高了我的設(shè)計(jì)和程序編碼的能力。在這過程中,讓我們體會到了團(tuán)隊(duì)的力量。感謝我的隊(duì)友的幫助和xx老師這一學(xué)期來的教學(xué)。</p><p><b> 6. 參考文獻(xiàn)</b></p><p> [1] 嚴(yán)蔚敏 . 數(shù)據(jù)結(jié)構(gòu)(C語言版)[M] . 北京:清華大學(xué)出版社,2011.
102、</p><p> [2] 耿國華 . 數(shù)據(jù)結(jié)構(gòu)——C語言描述[M] . 北京:高等教育出版社,2011.</p><p> [3] 張銘 . 數(shù)據(jù)結(jié)構(gòu)與算法 . 北京:高等教育出版社,2008.</p><p> [4] 殷人昆 . 數(shù)據(jù)結(jié)構(gòu)(C語言描述)[M] . 北京:清華大學(xué)出版社,2011.</p><p> [5] 胡學(xué)鋼
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- (哈夫曼編碼譯碼器)(課程設(shè)計(jì)報(bào)告)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-哈夫曼編碼譯碼器
- 哈夫曼編碼譯碼器課程設(shè)計(jì)--- 哈夫曼樹的建立與實(shí)現(xiàn)
- 哈夫曼課程設(shè)計(jì)報(bào)告--哈夫曼編譯碼器
- java哈夫曼編碼譯碼器
- 哈夫曼編譯碼器課程設(shè)計(jì)報(bào)告
- 哈夫曼(huffman)編譯碼器課程設(shè)計(jì)
- 哈夫曼(huffman)編譯碼器課程設(shè)計(jì)
- 課程設(shè)計(jì)--哈夫曼編碼與譯碼
- 數(shù)據(jù)結(jié)構(gòu)哈夫曼編碼譯碼器課程設(shè)計(jì)報(bào)告(有源程序)
- 哈夫曼編碼與譯碼課程設(shè)計(jì)報(bào)告
- 哈夫曼編碼譯碼的實(shí)現(xiàn)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--電文編碼譯碼(哈夫曼編碼)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)電文編碼譯碼(哈夫曼編碼)
- 課程設(shè)計(jì)-哈夫曼編碼
- 哈夫曼編碼譯碼數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 《哈夫曼編碼》課程設(shè)計(jì)
- 課程設(shè)計(jì)哈夫曼編碼
- 課程設(shè)計(jì) 哈夫曼樹及哈夫曼編碼
- 哈夫曼編碼課程設(shè)計(jì)
評論
0/150
提交評論