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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、<p>  本科生課程設(shè)計說明書</p><p>  題 目:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計</p><p>  —— 哈夫曼編碼和譯碼</p><p><b>  學(xué)生姓名: </b></p><p><b>  學(xué) 號: </b></p><p>  專

2、業(yè):軟件工程</p><p><b>  班 級: </b></p><p><b>  指導(dǎo)教師: </b></p><p>  日 期:2016年1月8日</p><p><b>  課程設(shè)計任務(wù)書</b></p><p><b&g

3、t;  目 錄</b></p><p>  內(nèi)蒙古科技大學(xué)課程設(shè)計任務(wù)書1</p><p>  第一章 需求分析3</p><p>  1.1程序的功能3</p><p>  1.2輸入輸出的要求3</p><p>  第二章概要設(shè)計3</p><p>  2

4、.1總體設(shè)計3</p><p>  2.2數(shù)據(jù)類型設(shè)計(或數(shù)據(jù)結(jié)構(gòu)設(shè)計)4</p><p>  2.3接口設(shè)計 //函數(shù)聲明5</p><p>  第三章詳細設(shè)計6</p><p>  3.1工程視圖6</p><p>  3.2類圖視圖6</p><p>  3.3

5、函數(shù)的調(diào)用關(guān)系7</p><p>  3.4主程序流程圖8</p><p>  3.5主要算法流程圖9</p><p>  第四章測試分析11</p><p>  4.1測試程序執(zhí)行情況11</p><p>  第五章 用戶手冊(可選)12</p><p>  第六章課程

6、設(shè)計總結(jié)13</p><p>  附錄:程序代碼14</p><p><b>  第一章 需求分析</b></p><p>  1.1.程序的功能 </p><p>  能對輸入的字符串實現(xiàn)Huffman編碼,且能利用生成的編碼對Huffman代碼串進行譯碼,輸出相應(yīng)字符串。 </p>

7、;<p>  2.2.輸入輸出的要求 </p><p>  首先,輸入一個字符串,程序會列出字符串中包含的字符種類及每一種字符出現(xiàn)的次數(shù),然后輸出通過Huffman編碼得到的各種字符的Huffman編碼。此時程序要求輸入一串Huffman代碼串,輸入完畢程序會判斷輸入的代碼串是否合法,若合法則輸出譯碼結(jié)果。 </p><p><b>  概要設(shè)計

8、</b></p><p><b>  總體設(shè)計</b></p><p>  數(shù)據(jù)類型設(shè)計(或數(shù)據(jù)結(jié)構(gòu)設(shè)計)</p><p>  enum Child{none,lchild,rchild}; //采用枚舉,標記是左孩子還是右孩子</p><p>  class element //元素類</p>

9、;<p><b>  {</b></p><p>  public://類的公有成員</p><p>  elememt(); //構(gòu)造函數(shù)</p><p>  void change(char l,char *c,int p,Child h,int w) //對對象進行修改操作</p><p>  vo

10、id getparent(int p) //對父結(jié)點的值進行修改操作</p><p>  void geta(Child h) //對孩子結(jié)點進行修改操作</p><p>  void getweight(int w) //對權(quán)值進行修改操作</p><p>  int returnweight() //返回權(quán)值操作</p><p>  f

11、riend void Select(element h[],int k,int *a,int *b);//友元函數(shù)的聲明</p><p>  friend void HuffmanTreeCode(element HT[]);</p><p>  friend void HuffmanTreeYima(element huff[],char cod[],int b);</p>

12、<p>  private://類的私有成員</p><p>  char letter,*code; //letter為字符,*code指向編碼字符串 </p><p>  int weight; //權(quán)值</p><p>  int parent; //父結(jié)點</p>

13、;<p>  Child a; //為父結(jié)點的左孩子還是右孩子</p><p><b>  };</b></p><p><b>  接口設(shè)計 </b></p><p>  主函數(shù):對輸入的字符段進行存儲,并對字符數(shù)和對應(yīng)的權(quán)值(字符個數(shù))進行統(tǒng)計存儲。</p>

14、<p>  哈夫曼樹初始化函數(shù):對給定的字符數(shù)和權(quán)值,創(chuàng)建一棵哈夫曼樹。</p><p>  權(quán)值大小比較函數(shù):找到每次所給集合的最小值和次小值,并返回給哈夫曼樹初始化函數(shù)。</p><p>  哈夫曼樹編碼函數(shù):對創(chuàng)建的哈夫曼樹,為左孩子的賦值為0,右孩子賦值為1,然后對葉子結(jié)點依次編碼。</p><p>  哈夫曼樹譯碼函數(shù):對輸入的01二進制數(shù)一一

15、與葉子結(jié)點的編碼依次比較匹配。</p><p><b>  詳細設(shè)計</b></p><p><b>  工程視圖</b></p><p><b>  圖3.1工程視圖</b></p><p><b>  類圖視圖</b></p><p

16、><b>  圖3.2類圖視圖</b></p><p><b>  函數(shù)的調(diào)用關(guān)系</b></p><p><b>  如下圖:</b></p><p>  圖3.3函數(shù)調(diào)用關(guān)系圖</p><p><b>  主程序流程圖</b></p>

17、<p>  圖3.4主程序流程圖</p><p><b>  主要算法流程圖</b></p><p>  圖3.5.1哈夫曼編碼函數(shù)</p><p>  圖3.5.2哈夫曼譯碼函數(shù)</p><p><b>  測試分析</b></p><p><b>

18、  測試程序執(zhí)行情況</b></p><p>  準備典型的測試數(shù)據(jù)和測試方案,包括正確的輸入及輸出結(jié)果和含有錯誤的輸入及輸出結(jié)果:</p><p><b>  輸入: </b></p><p><b>  編碼輸入演示圖 </b></p><p><b>  輸出:

19、</b></p><p><b>  編碼輸出演示圖</b></p><p>  正確輸入哈夫曼編碼代號:</p><p>  正確譯碼輸入演示圖 </p><p><b>  輸出:</b></p><p>  正確輸入譯碼譯碼結(jié)果輸出演示圖</

20、p><p>  錯誤輸入哈夫曼編碼代號:</p><p>  錯誤輸入哈夫曼編碼代碼串示意圖</p><p><b>  輸出:</b></p><p>  錯誤輸入哈夫曼編碼代碼串輸出示意圖 </p><p><b>  用戶手冊(可選)</b></p><

21、p>  運行程序,程序首先會要求你輸入需要編碼的字符串,輸入完畢按回車即可進行編碼:</p><p><b>  程序啟動畫面</b></p><p><b>  輸出: </b></p><p><b>  編碼輸出畫面</b></p><p>  輸出編碼后,程序會提

22、示輸入需要譯碼的哈夫曼編碼串,輸入后按回車即可進行譯碼:</p><p><b>  譯碼輸入界面 </b></p><p><b>  輸出:</b></p><p><b>  譯碼輸出界面 </b></p><p>  3.譯碼結(jié)束后,輸入N可退出程序,輸入Y可

23、繼續(xù)進行譯碼。</p><p><b>  課程設(shè)計總結(jié)</b></p><p>  此次課程設(shè)計,我編寫程序的時候遇到了不少問題,在攻克這些問題,最終實現(xiàn)課題任務(wù)的過程中,我學(xué)到了不少東西: </p><p>  首先,在完成一個課題之前,要仔細理解課題要求。我在此次課程設(shè)計中犯的最嚴重的錯誤,應(yīng)該算沒有仔細審題。課題的要求是用讀取文件的方式

24、輸入需要編碼字符,譯碼所需的編碼代號也要用文本方式輸入。我在拿到這個課題的時候,因為沒有仔細理解這些要求,就采用了鍵盤輸入字符進行編碼和譯碼的方式,以致沒有完全達到課題的要求。 </p><p>  另外,這次課程設(shè)計充分暴露了我的惰性思想。在拿到這個課題后,因為對哈夫曼編碼這個知識點理解比較到位,所以沒花多少時間就完成了課題要求實現(xiàn)的功能。然而,在此之后,我由于自我感覺良好和惰性,沒有積極地去尋找改進程序的方

25、法,也沒對程序運行的界面進行美化,使其擁有良好的用戶使用體驗。最終在考核的時候,交給老師的是一個界面簡陋,功能不全面的程序。 </p><p>  通過這次課程設(shè)計,我更加深入了理解了哈夫曼編碼的過程,以及利用哈夫曼編碼對數(shù)據(jù)進行壓縮的優(yōu)越性,并且使我能夠更熟練地運用樹形的數(shù)據(jù)結(jié)構(gòu)。并且體會到了在學(xué)習(xí)中,要嚴格要求自己,不能因為一點點的成功就驕傲自滿,停止不前。</p><p><b

26、>  附錄:程序代碼</b></p><p>  #include <iostream.h></p><p>  #include<fstream.h></p><p>  #include <string.h></p><p>  #include <malloc.h><

27、;/p><p>  #include <stdio.h></p><p>  const int Lengh=1000; //最大長度為1000</p><p>  char coding[100]; //存儲二進制字符串</p><p>  int n; //定義全局變量</p><

28、;p>  ofstream file1("編碼.txt");; //創(chuàng)建編碼保存文件</p><p>  ofstream file2("譯碼.txt");; //創(chuàng)建譯碼保存文件</p><p>  enum Child{none,lchild,rchild}; //采用枚舉標記事左孩子還是右孩子&l

29、t;/p><p>  class element</p><p><b>  {</b></p><p><b>  public:</b></p><p>  elememt();</p><p>  void change(char l,char *c,int p,Child

30、 h,int w)</p><p><b>  {</b></p><p><b>  code=c;</b></p><p><b>  letter=l;</b></p><p><b>  a=h;</b></p><p>&

31、lt;b>  weight=w;</b></p><p><b>  parent=p;</b></p><p><b>  }</b></p><p>  void getparent(int p)</p><p><b>  {</b></p>

32、<p><b>  parent=p;</b></p><p><b>  }</b></p><p>  void geta(Child h)</p><p><b>  {</b></p><p><b>  a=h;</b></p

33、><p><b>  }</b></p><p>  void getweight(int w)</p><p><b>  {</b></p><p><b>  weight=w;</b></p><p><b>  }</b>&l

34、t;/p><p>  int returnweight()</p><p><b>  {</b></p><p>  return weight;</p><p><b>  }</b></p><p>  friend void Select(element h[],int

35、k,int *a,int *b);</p><p>  friend void HuffmanTreeCode(element HT[]);</p><p>  friend void HuffmanTreeYima(element huff[],char cod[],int b);</p><p><b>  private:</b><

36、/p><p>  char letter,*code; //letter為字符,*code指向編碼字符串 </p><p>  int weight; //權(quán)值域</p><p>  int parent; //父結(jié)點序號</p><p>  Child a;

37、 //為父結(jié)點的左孩子還是右孩子</p><p><b>  };</b></p><p>  void Select(element h[],int k,int *a,int *b);//尋找最小和次小節(jié)點的序號</p><p>  void InitHuffmanTree(element huffTree[],char

38、t[],int w[]) //哈夫曼樹的初始化</p><p><b>  {</b></p><p>  int i,m=2*n-1,s1,s2; //no+n2=n 所以一要申請m個空間</p><p>  for(i=0;i<n;i++) //初始前n個結(jié)點 </p><

39、;p><b>  {</b></p><p>  huffTree[i].change(t[i],'\0',-1,none,w[i]);</p><p><b>  }</b></p><p>  for(;i<=m;i++) //后m-n個結(jié)點置空</p&g

40、t;<p><b>  { </b></p><p>  huffTree[i].change(' ','\0',-1,none,0);</p><p><b>  }</b></p><p>  for(i=n;i<m;i++) //建立哈夫曼樹&

41、lt;/p><p><b>  {</b></p><p>  Select(huffTree,i-1,&s1,&s2); //在huffTree中找權(quán)值最小的兩個結(jié)點s1,s2</p><p>  huffTree[s1].getparent(i); //將s1,s2合并,則s1,s2的雙

42、親是i</p><p>  huffTree[s2].getparent(i);</p><p>  huffTree[s1].geta(lchild); //s1是左孩子</p><p>  huffTree[s2].geta(rchild); //s2是右孩子</p><p>  huffTree[i].get

43、weight(huffTree[s1].returnweight()+huffTree[s2].returnweight());//s1,s2的雙親的權(quán)值為s1,s2權(quán)值之和</p><p><b>  }</b></p><p><b>  }</b></p><p>  void Select(element h[],

44、int k,int *a,int *b) //尋找最小和次小節(jié)點的序號 </p><p><b>  {</b></p><p><b>  int i;</b></p><p>  int min1=1000; //初始化最小結(jié)點和次小結(jié)點 </

45、p><p>  int min2=1000; </p><p>  for (i=0;i<=k;i++)//找最小的結(jié)點序號</p><p><b>  { </b></p><p>  if (h[i].parent==-1&&h[i].weight<min1) //如果沒有父結(jié)點并且它的權(quán)

46、值小于min1的權(quán)值</p><p><b>  { </b></p><p>  *a=i; //將i放入a中</p><p>  min1=h[i].weight; //找到第一個最小結(jié)點</p><p><b>  } </b></p>

47、<p><b>  }</b></p><p>  for(i=0;i<=k;i++) //找次小結(jié)點的序號 </p><p><b>  {</b></p><p>  if(h[i].parent==-1&&(*a!=i)&&h[i].weight&

48、lt;min2) //滿足沒有父結(jié)點,此序號不等于最小結(jié)點的序號,權(quán)值小于min2</p><p><b>  { </b></p><p><b>  *b=i; </b></p><p>  min2=h[i].weight; //找到次最小結(jié)點</p><p><b>  

49、} </b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void HuffmanTreeCode(element HT[]) //字符編碼</p><p><b>  {</b></p

50、><p><b>  int i; </b></p><p>  char *temp; </p><p>  temp=(char *)malloc(n*sizeof(char)); //分配n個字符空間 </p><p>  temp[n-1]='\0'; //最后一個字

51、符以后結(jié)束字符串</p><p><b>  int p;</b></p><p><b>  int s; </b></p><p>  for(i=0;i<n;i++) //n個字符結(jié)點一個個處理</p><p><b>  { </b></p>

52、<p><b>  p=i; </b></p><p>  s=n-1; //s為最后一個結(jié)點</p><p>  while(HT[p].parent!=-1) //從字符結(jié)點回溯,直至根結(jié)點</p><p><b>  {</b></p><p

53、>  if(HT[p].a==lchild) //p指向的如果是左孩子</p><p>  temp[--s]='0'; //s位置字符為0</p><p>  else if(HT[p].a==rchild) //p指向的如果是右孩子</p><p>  temp[--s]='1';

54、 //s位置字符為1</p><p>  p=HT[p].parent; //回溯父結(jié)點</p><p><b>  } </b></p><p>  HT[i].code=(char *)malloc((n-s)*sizeof(char));//分配結(jié)點編碼長度的內(nèi)存空間 </p><p> 

55、 strcpy(HT[i].code,temp+s); //將temp中從第s個位置開始,將編碼拷貝到 HT[i].code </p><p>  printf("%c",HT[i].letter);</p><p>  printf(": "); </p><p>  printf(&qu

56、ot;%s\n",HT[i].code); //打印出字符即對應(yīng)的二進制字符串 </p><p>  file1<<HT[i].letter <<":"<<HT[i].code <<endl; //保存至編碼文件中</p><p><b>  } </b>&l

57、t;/p><p><b>  }</b></p><p>  void HuffmanTreeYima(element huff[],char cod[],int b) //譯碼</p><p><b>  { </b></p><p>  char sen[100]; </p

58、><p>  char temp[50]; </p><p>  char voidstr[]=" "; //空白字符串</p><p>  int t=0; int s=0; </p><p><b>  int xx=0;</b></p><p>  for(int

59、 i=0 ; i<b; i++)</p><p><b>  { </b></p><p>  temp[t++]=cod[i]; //讀取字符</p><p>  temp[t] = '\0'; //有效字符串</p><p>  for(int j=0;j<n;j++

60、) //依次與所有字符編碼開始匹配</p><p><b>  { </b></p><p>  if (!strcmp(huff[j].code,temp)) //匹配成功</p><p><b>  {</b></p><p>  sen[s]=hu

61、ff[j].letter; //將字符保存到sen中</p><p><b>  s++; </b></p><p><b>  xx+=t;</b></p><p>  strcpy(temp,voidstr); //將TEMP置空 </p><p>  t=0

62、; //t置空</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  } </b></p><p><b>  } </b></p><p>  if

63、(t==0) //t如果被置空了,表示都匹配出來了,打印譯碼</p><p><b>  {</b></p><p>  sen[s]='\0';</p><p>  cout<<"譯碼為:"<<endl; </p><p>  file2<<

64、;sen;</p><p>  cout<<sen<<endl;</p><p><b>  }</b></p><p>  else //t如果沒有被置空 , 源碼無法被完全匹配</p><p>  { cout<<"

65、二進制源碼有錯!從第"<<xx+1<<"位開始"<<endl;</p><p>  file2<<"二進制源碼有錯!從第"<<xx+1<<"位開始"<<endl;</p><p><b>  }</b></p&

66、gt;<p><b>  } </b></p><p>  void main()</p><p><b>  {</b></p><p>  char a[Lengh],p;</p><p>  int i,b[Lengh]; </p><p>  int s

67、ymbol=1;</p><p><b>  int x;</b></p><p><b>  int k;</b></p><p>  if(!file1)</p><p><b>  {</b></p><p>  cout<<"

68、;不能打開文件1!";</p><p><b>  return;</b></p><p><b>  }</b></p><p>  if(!file2)</p><p><b>  {</b></p><p>  cout<<&

69、quot;不能打開文件2!";</p><p><b>  return;</b></p><p><b>  }</b></p><p>  cout<<"\t\t\t\t哈夫曼編碼與譯碼\t\t\t\t"<<endl;</p><p>  c

70、out<<"編碼:"<<endl;</p><p>  cout<<"請輸入一句話進行初始編碼:";</p><p>  char buff[1024]={0};//零時存放輸入的話</p><p>  cin.getline(buff,1024);//讀入一行包括空格鍵,以回車鍵結(jié)束<

71、;/p><p>  int len=strlen(buff);</p><p>  element h[Lengh];</p><p>  for (i=0;i<len;i++)</p><p><b>  {</b></p><p>  for(int j=0;j<n;j++)</

72、p><p><b>  {</b></p><p>  if (a[j]==buff[i])</p><p><b>  {</b></p><p>  b[j]=b[j]+1;</p><p><b>  break;</b></p><

73、;p><b>  }</b></p><p><b>  }</b></p><p><b>  if (j>=n)</b></p><p><b>  {</b></p><p>  a[n]=buff[i];</p><

74、p><b>  b[n]=1;</b></p><p><b>  n++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  for (i=0;i<n;i++)</p>

75、<p><b>  {</b></p><p>  cout<<"字符:"<<(char)a[i]<<" 權(quán)值:"<<(int)b[i]<<endl;//a[]存字符 b[]存權(quán)值;</p><p><b>  }</b></p&

76、gt;<p>  InitHuffmanTree(h,a,b); //哈夫曼樹的初始化</p><p>  HuffmanTreeCode(h); //編碼</p><p>  cout<<"譯碼:"<<endl;</p><p><b>  while(1)</b>&l

77、t;/p><p><b>  { </b></p><p>  cout<<"請輸入要譯碼的二進制字符串,輸入'#'結(jié)束:";</p><p>  file2<<"二進制字符串:";</p><p><b>  x=1;</b&g

78、t;</p><p><b>  k=0;</b></p><p><b>  symbol=1;</b></p><p>  while(symbol)</p><p><b>  { </b></p><p><b>  cin>

79、;>p; </b></p><p>  if(p!='1'&&p!='0'&&p!='#') //若存在其它字符,x設(shè)為0,表示輸入的不是二進制</p><p><b>  {</b></p><p><b>  x=0;</b&g

80、t;</p><p><b>  }</b></p><p>  coding[k]=p;</p><p>  if(p=='#') </p><p>  symbol=0; //#號結(jié)束標志</p><p><b>  else </b></p&g

81、t;<p><b>  file2<<p;</b></p><p><b>  k++;</b></p><p><b>  }</b></p><p><b>  if(x==1)</b></p><p><b>  

82、{</b></p><p>  file2<<endl<<"譯碼為:";</p><p>  HuffmanTreeYima(h,coding,k-1); //進行譯碼</p><p>  file2<<endl;</p><p><b>  }<

83、;/b></p><p><b>  else</b></p><p><b>  {</b></p><p>  cout<<"有非法字符!"<<endl;</p><p>  file2<<endl<<"有非法字

84、符!"<<endl;</p><p><b>  }</b></p><p>  cout<<"是否繼續(xù)?(Y/N):";</p><p><b>  cin>>p;</b></p><p>  if(p=='y'||

85、p=='Y')</p><p><b>  continue;</b></p><p><b>  else</b></p><p><b>  break;</b></p><p><b>  }</b></p><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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論