2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論