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

下載本文檔

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

文檔簡(jiǎn)介

1、<p>  《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)報(bào)告</p><p>  題目: 趣味游戲之n皇后問(wèn)題 </p><p>  赫夫曼編碼/譯碼器課程設(shè)計(jì) </p><p>  院 系: 計(jì)算機(jī)工程學(xué)院 </p><p>  專(zhuān)業(yè)班級(jí): 10軟件2ZW </p><p>  學(xué) 號(hào)

2、: </p><p>  學(xué)生姓名: </p><p>  指導(dǎo)教師: </p><p>  2012年 02月 22日 </p><p>  《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)任務(wù)書(shū)</p><p>  學(xué)院 計(jì)算機(jī)工程學(xué)院

3、 系 信息與軟件工程系 </p><p>  2012年 02月 22日</p><p><b>  求解N皇后問(wèn)題</b></p><p><b>  問(wèn)題描述:</b></p><p>  編寫(xiě)一個(gè)程序,求解皇后問(wèn)題,在N*N的方格棋盤(pán)上,放置N個(gè)皇后,要求每個(gè)皇后不同行、不同列、不同

4、對(duì)角線。</p><p>  求出8個(gè)皇后的程序截圖</p><p><b>  源代碼:</b></p><p>  # include<stdio.h></p><p>  # include<stdlib.h></p><p>  const int N=20;

5、 //最多皇后個(gè)數(shù)</p><p>  int q[N]; //存放各皇后所在的行號(hào)</p><p>  int cont = 0; //存在解個(gè)數(shù)</p><p>  void print(int n) //輸出一個(gè)解</p><p><b&

6、gt;  {</b></p><p><b>  cont++;</b></p><p><b>  int i;</b></p><p>  printf("第%d個(gè)解:",cont);</p><p>  for (i=1;i<=n;i++)</p&g

7、t;<p>  printf("%d",q[i]);</p><p>  printf("\n");</p><p><b>  }</b></p><p>  int find(int i,int k) //測(cè)試第K列的i行上能否擺放皇后</p><

8、p><b>  {</b></p><p><b>  int j;</b></p><p><b>  j=1;</b></p><p>  while(j<k) //j=1~k-1是已放置了皇后的列</p><p>  { if

9、 ((q[j]==i)||(abs(q[j]-i)==abs(j-k)))</p><p>  //第j列皇后是否在i行或(q[i],j)與(i,k)是否同對(duì)角線</p><p><b>  return 0;</b></p><p><b>  j++;</b></p><p><b>

10、  }</b></p><p><b>  return 1;</b></p><p><b>  }</b></p><p>  void place(int k,int n) //第k個(gè)皇后放到第k列上</p><p><b>  {</b>&l

11、t;/p><p><b>  if (k>n)</b></p><p>  print(n); //所有皇后放置結(jié)束</p><p><b>  else </b></p><p>  for (int i=1;i<=n;i++) //在第k列上窮舉每一個(gè)

12、位置</p><p>  if (find(i,k))</p><p>  { q[k]=i;</p><p>  place(k+1,n);</p><p><b>  }</b></p><p><b>  }</b></p><p>  voi

13、d main()</p><p><b>  {</b></p><p>  int n; //n存在實(shí)際皇后個(gè)數(shù)</p><p>  printf("皇后問(wèn)題(n<20) n=");</p><p>  scanf("%d",&

14、amp;n);</p><p><b>  if (n>20)</b></p><p>  printf("n值太大,不能求解\n");</p><p><b>  else</b></p><p>  { printf("%d皇后問(wèn)題求解如下:\n"

15、,n);</p><p>  place(1,n);</p><p>  printf("\n");</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  參考文獻(xiàn):</b><

16、;/p><p>  《數(shù)據(jù)結(jié)構(gòu)教程》上機(jī)實(shí)驗(yàn)指導(dǎo)(第三版)</p><p><b>  一、【問(wèn)題描述】</b></p><p>  設(shè)計(jì)一個(gè)哈夫曼編碼/譯碼系統(tǒng),對(duì)一個(gè)文本文件中的字符進(jìn)行哈夫曼編碼,生成編碼文件(壓縮文件,后綴名.cod);反過(guò)來(lái),可將一個(gè)壓縮文件譯碼還原為一個(gè)文本文件(.txt)。</p><p>&l

17、t;b>  二、【基本要求】</b></p><p>  1. 輸入一個(gè)待壓縮的文本文件名, 統(tǒng)計(jì)文本文件中各字符的個(gè)數(shù)作為權(quán)值,生成哈夫曼樹(shù);</p><p>  2. 將文本文件利用哈夫曼樹(shù)進(jìn)行編碼,生成壓縮文件(后綴名cod),</p><p>  3. 輸入一個(gè)待解壓的壓縮文件名稱(chēng),并利用相應(yīng)的哈夫曼樹(shù)將編碼序列譯碼;</p>

18、<p>  4. 顯示指定的壓縮文件和文本文件;</p><p>  5. 界面友好,易與操作。采用菜單方式進(jìn)行選擇。</p><p>  三. 問(wèn)題分析哈夫曼樹(shù)的定義</p><p>  1.哈夫曼樹(shù)節(jié)點(diǎn)的數(shù)據(jù)類(lèi)型定義為:</p><p>  typedef struct{ //赫夫曼樹(shù)的結(jié)構(gòu)體</p&

19、gt;<p><b>  char ch;</b></p><p>  int weight; //權(quán)值</p><p>  int parent,lchild,rchild;</p><p>  }htnode,*hfmtree;</p><p>  2)所實(shí)現(xiàn)的功能函數(shù)如下&l

20、t;/p><p>  1、void hfmcoding(hfmtree &HT,hfmcode &HC,int n)初始化哈夫曼樹(shù),處理InputHuffman(Huffman Hfm)函數(shù)得到的數(shù)據(jù),按照哈夫曼規(guī)則建立2叉樹(shù)。此函數(shù)塊調(diào)用了Select()函數(shù)。</p><p>  2、void Select(hfmtree &HT,int a,int *p1,int

21、 *p2) //Select函數(shù),選出HT樹(shù)到a為止,權(quán)值最小且parent為0的2個(gè)節(jié)點(diǎn)</p><p>  2、 int main()</p><p>  主函數(shù): 利用已建好的哈夫曼樹(shù)(如不在內(nèi)存,則從文件hfmtree.txt中讀入)</p><p>  對(duì)文件中的正文進(jìn)行編碼,然后將結(jié)果存入文件codefile.cod中。如果正文中沒(méi)有要

22、編碼的字符,則鍵盤(pán)讀入并存儲(chǔ)到ToBeTran文件中。讀入ToBeTran中將要編碼的內(nèi)容,將編碼好的哈夫曼編碼存儲(chǔ)到CodeFile中。</p><p>  3、Encoding </p><p>  編碼功能:對(duì)輸入字符進(jìn)行編碼</p><p>  4、Decoding</p><p>  譯碼功能: 利用已建好的哈夫曼樹(shù)將文件codef

23、ile.cod中的代碼進(jìn)行譯碼,結(jié)果存入文件textfile.dat 中。</p><p>  Print() 打印功能函數(shù):輸出哈夫曼樹(shù),字符,權(quán)值,以及它對(duì)應(yīng)的編碼。</p><p>  5.主函數(shù)的簡(jiǎn)要說(shuō)明,主函數(shù)主要設(shè)計(jì)的是一個(gè)分支語(yǔ)句,讓用戶(hù)挑選所實(shí)現(xiàn)的功能。</p><p>  使用鏈樹(shù)存儲(chǔ),然后分別調(diào)用統(tǒng)計(jì)頻數(shù)函數(shù),排序函數(shù),建立哈夫曼函數(shù),編碼函數(shù),

24、譯碼函數(shù)來(lái)實(shí)現(xiàn)功能。</p><p><b>  四、系統(tǒng)結(jié)構(gòu)功能圖</b></p><p><b>  五、程序說(shuō)明</b></p><p>  1. 赫夫曼編碼/譯碼器代碼</p><p>  #include<iostream.h></p><p>  #i

25、nclude<stdio.h></p><p>  #include<stdlib.h></p><p>  #include<string.h></p><p>  #include<fstream.h></p><p>  typedef struct{ //赫夫曼樹(shù)的結(jié)構(gòu)體

26、</p><p><b>  char ch;</b></p><p>  int weight; //權(quán)值</p><p>  int parent,lchild,rchild;</p><p>  }htnode,*hfmtree;</p><p>  typedef

27、 char **hfmcode;</p><p>  void Select(hfmtree &HT,int a,int *p1,int *p2) //Select函數(shù),選出HT樹(shù)到a為止,權(quán)值最小且parent為0的2個(gè)節(jié)點(diǎn)</p><p><b>  {</b></p><p>  int i,j,x,y;</p>&

28、lt;p>  for(j=1;j<=a;++j){</p><p>  if(HT[j].parent==0){</p><p><b>  x=j;</b></p><p><b>  break;</b></p><p><b>  }</b></p>

29、;<p><b>  }</b></p><p>  for(i=j+1;i<=a;++i){</p><p>  if(HT[i].weight<HT[x].weight&&HT[i].parent==0){</p><p>  x=i; //選出最小的節(jié)點(diǎn)</

30、p><p><b>  }</b></p><p><b>  }</b></p><p>  for(j=1;j<=a;++j){</p><p>  if(HT[j].parent==0&&x!=j)</p><p><b>  {</

31、b></p><p><b>  y=j;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  for(i=j+1;i&

32、lt;=a;++i)</p><p><b>  {</b></p><p>  if(HT[i].weight<HT[y].weight&&HT[i].parent==0&&x!=i)</p><p><b>  {</b></p><p>  y=i;

33、 //選出次小的節(jié)點(diǎn)</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  if(x>y){</b></p><p><b>  *p1=y;</b></p>

34、;<p><b>  *p2=x;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  *p1=x;</b>&

35、lt;/p><p><b>  *p2=y;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void hfmcoding(hfmtree &HT,hfmcode &HC,int n) //構(gòu)建赫夫曼樹(shù)HT

36、,并求出n個(gè)字符的赫夫曼編碼HC</p><p><b>  {</b></p><p>  int i,start,c,f,m,w;</p><p>  int p1,p2;</p><p>  char *cd,z;</p><p><b>  if(n<=1){</b&

37、gt;</p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  m=2*n-1;</b></p><p>  HT=(hfmtree)malloc((m+1)*sizeof(htnode));</p>

38、<p>  for(i=1;i<=n;++i) //初始化n個(gè)葉子結(jié)點(diǎn)</p><p><b>  {</b></p><p>  printf("請(qǐng)輸入第%d字符信息和權(quán)值:",i);</p><p>  scanf("%c%d",&z,&w);&

39、lt;/p><p>  while(getchar()!='\n')</p><p><b>  {</b></p><p><b>  continue;</b></p><p><b>  }</b></p><p>  HT[i].ch

40、=z;</p><p>  HT[i].weight=w;</p><p>  HT[i].parent=0;</p><p>  HT[i].lchild=0;</p><p>  HT[i].rchild=0;</p><p><b>  }</b></p><p> 

41、 for(;i<=m;++i) //初始化其余的結(jié)點(diǎn)</p><p><b>  {</b></p><p>  HT[i].ch='0';</p><p>  HT[i].weight=0;</p><p>  HT[i].parent=0;</p><p>

42、  HT[i].lchild=0;</p><p>  HT[i].rchild=0;</p><p><b>  }</b></p><p>  for(i=n+1;i<=m;++i) //建立赫夫曼樹(shù)</p><p><b>  {</b></p><p&

43、gt;  Select(HT,i-1,&p1,&p2);</p><p>  HT[p1].parent=i;HT[p2].parent=i;</p><p>  HT[i].lchild=p1;HT[i].rchild=p2;</p><p>  HT[i].weight=HT[p1].weight+HT[p2].weight;</p>

44、<p><b>  }</b></p><p>  HC=(hfmcode)malloc((n+1)*sizeof(char *));</p><p>  cd=(char *)malloc(n*sizeof(char));</p><p>  cd[n-1]='\0';</p><p> 

45、 for(i=1;i<=n;++i) //給n個(gè)字符編碼</p><p><b>  {</b></p><p>  start=n-1;</p><p>  for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)</p><p><b>

46、  {</b></p><p>  if(HT[f].lchild==c)</p><p><b>  {</b></p><p>  cd[--start]='0';</p><p><b>  }</b></p><p><b>  

47、else</b></p><p><b>  {</b></p><p>  cd[--start]='1';</p><p><b>  }</b></p><p><b>  }</b></p><p>  HC[i]=(

48、char*)malloc((n-start)*sizeof(char));</p><p>  strcpy(HC[i],&cd[start]);</p><p><b>  }</b></p><p><b>  free(cd);</b></p><p><b>  }<

49、/b></p><p>  int main(){</p><p>  char code[100],h[100],hl[100];</p><p>  int n,i,j,k,l;</p><p>  ifstream input_file; //文件輸入輸出流</p><p>  ofstream ou

50、tput_file;</p><p>  char choice,str[100];</p><p>  hfmtree HT;</p><p>  hfmcode HC;</p><p>  cout<<"\n";</p><p>  cout<<"

51、 "<<"軟件(2)班"<<" "<<"10144214"<<" "<<"劉紅亮\n";</p><p>  while(choice!='Q'&&choice!='q')

52、 //當(dāng)choice的值不為q且不為Q時(shí)循環(huán)</p><p><b>  {</b></p><p>  cout<<" "<<"*************************赫夫曼編碼/譯碼器*************************\n";</p>

53、;<p>  cout<<" "<<"I.Init"<<" "<<"E.Encoding"<<" "<<"D.Decoding"<<" "

54、<<"Q.Exit\n";</p><p>  cout<<"請(qǐng)輸入您要操作的步驟:";</p><p>  cin>>choice;</p><p>  if(choice=='I'||choice=='i') //初始化赫夫曼樹(shù)&

55、lt;/p><p><b>  {</b></p><p>  cout<<"請(qǐng)輸入字符個(gè)數(shù):";</p><p><b>  cin>>n;</b></p><p>  hfmcoding(HT,HC,n);</p><p>  fo

56、r(i=1;i<=n;++i)</p><p><b>  {</b></p><p>  cout<<HT[i].ch<<":"<<HC[i]<<endl;</p><p><b>  }</b></p><p>  out

57、put_file.open("hfmTree.txt");</p><p>  if(!output_file){</p><p>  cout<<"can't oen file!"<<endl;</p><p><b>  return 1;</b></p>

58、<p><b>  }</b></p><p>  for(i=1;i<=n;i++)</p><p><b>  {</b></p><p>  output_file<<"("<<HT[i].ch<<HC[i]<<")&qu

59、ot;;</p><p><b>  }</b></p><p>  output_file.close();</p><p>  cout<<"赫夫曼樹(shù)已經(jīng)創(chuàng)建完畢,并且已經(jīng)放入hfmTree.txt文件中!"<<endl;</p><p><b>  }</

60、b></p><p>  else if(choice=='E'||choice=='e') //進(jìn)行編碼,并將字符放入ToBeTran.txt,碼值放入CodeFile.txt中</p><p><b>  {</b></p><p>  printf("請(qǐng)輸入字符:&quo

61、t;);</p><p>  gets(str);</p><p>  output_file.open("ToBeTran.txt");</p><p>  if(!output_file)</p><p><b>  {</b></p><p>  cout<<

62、"can't oen file!"<<endl;</p><p><b>  return 1;</b></p><p><b>  }</b></p><p>  output_file<<str<<endl;</p><p>  o

63、utput_file.close();</p><p>  output_file.open("CodeFile.cod");</p><p>  if(!output_file){</p><p>  cout<<"can't oen file!"<<endl;</p><

64、p><b>  return 1;</b></p><p><b>  }</b></p><p>  for(i=0;i<strlen(str);i++){</p><p>  for(j=0;j<=n;++j)</p><p><b>  {</b><

65、;/p><p>  if(HT[j].ch==str[i])</p><p><b>  {</b></p><p>  output_file<<HC[j];</p><p><b>  break;</b></p><p><b>  }</b&g

66、t;</p><p><b>  }</b></p><p><b>  }</b></p><p>  output_file.close();</p><p>  cout<<"\n";</p><p>  cout<<&quo

67、t;編碼完畢,并且已經(jīng)存入CodeFile.cod文件!\n";</p><p>  input_file.open("CodeFile.cod"); //從CodeFile.cod中讀入編碼,輸出在終端</p><p>  if(!input_file)</p><p><b>  {</b>&l

68、t;/p><p>  cout<<"can't oen file!"<<endl;</p><p><b>  return 1;</b></p><p><b>  }</b></p><p>  input_file>>code;<

69、;/p><p>  cout<<"編碼碼值為:"<<code<<endl;</p><p>  input_file.close();</p><p><b>  }</b></p><p>  else if(choice=='D'||choice==

70、'd') //讀入CodeFile.cod中的編碼進(jìn)行譯碼,將譯出來(lái)的字符放入Textfile.txt中</p><p><b>  {</b></p><p>  input_file.open("CodeFile.cod");</p><p>  if(!input_file){</p>

71、;<p>  cout<<"can't oen file!"<<endl;</p><p><b>  return 1;</b></p><p><b>  }</b></p><p>  input_file>>h;</p>&

72、lt;p>  input_file.close();</p><p>  output_file.open("Textfile.txt");</p><p>  if(!output_file)</p><p><b>  {</b></p><p>  cout<<"ca

73、n't oen file!"<<endl;</p><p><b>  return 1;</b></p><p><b>  }</b></p><p><b>  k=0;</b></p><p>  while(h[k]!='\0&#

74、39;) //先用編碼中的前幾個(gè)和字符的編碼相比較,然后往后移</p><p><b>  {</b></p><p>  for(i=1;i<=n;i++){</p><p><b>  l=k;</b></p><p>  for(j=0;j<strlen(HC[

75、i]);j++,l++){</p><p>  hl[j]=h[l];</p><p><b>  }</b></p><p>  hl[j]='\0';</p><p>  if(strcmp(HC[i],hl)==0)</p><p><b>  {</b>

76、;</p><p>  output_file<<HT[i].ch;</p><p>  k=k+strlen(HC[i]);</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }<

77、;/b></p><p><b>  }</b></p><p>  output_file.close();</p><p>  input_file.open("Textfile.txt");</p><p>  if(!input_file){</p><p>  

78、cout<<"can't oen file!"<<endl;</p><p><b>  return 1;</b></p><p><b>  }</b></p><p>  input_file>>h; </p><p>  cou

79、t<<h<<endl;</p><p>  input_file.close();</p><p>  cout<<"譯碼結(jié)束,字符已經(jīng)存入Textfile.txt文件中!"<<endl;</p><p><b>  }</b></p><p>  el

80、se if(choice=='Q'||choice=='q') //退出程序</p><p><b>  { </b></p><p><b>  exit(0);</b></p><p><b>  }</b></p><p&

81、gt;  else //如果選了選項(xiàng)之外的就讓用戶(hù)重新選擇</p><p><b>  {</b></p><p>  cout<<"您沒(méi)有輸入正確的步驟,請(qǐng)重新輸入!"<<endl;</p><p><b>  }</b></p>&l

82、t;p>  cout<<endl;</p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  六、運(yùn)行結(jié)果和調(diào)試分析</p><p>  

83、系統(tǒng)界面 如圖:</p><p>  初始化赫夫曼樹(shù) 如圖:</p><p><b>  編碼</b></p><p><b>  譯碼</b></p><p><b>  退出</b></p><p><b>  

84、七、總結(jié)體會(huì)</b></p><p>  在我自己課程設(shè)計(jì)中,就在編寫(xiě)好源代碼后的調(diào)試中出現(xiàn)了不少的錯(cuò)誤,遇到了很多麻煩及困難,我的調(diào)試及其中的錯(cuò)誤和我最終找出錯(cuò)誤,修改為正確的能夠執(zhí)行的程序中,通過(guò)分析,我學(xué)到了:</p><p>  在定義頭文件時(shí)可多不可少,即我們可多寫(xiě)些頭文件,肯定不會(huì)出錯(cuò),但是若沒(méi)有定義所引用的相關(guān)頭文件,必定調(diào)試不通過(guò);</p><

85、;p>  在執(zhí)行譯碼操作時(shí),不知什么原因,總是不能把要編譯的二進(jìn)制數(shù)與編譯成的字符用連接號(hào)連接起來(lái),而是按順序直接放在一起,視覺(jué)效果不是很好。還有就是,很遺憾的是,我們的哈夫曼編碼/譯碼器沒(méi)有像老師要求的那樣完成編一個(gè)文件的功能,這是我們?cè)O(shè)計(jì)的失敗之處。</p><p>  通過(guò)本次數(shù)據(jù)結(jié)構(gòu)的課程設(shè)計(jì),我學(xué)習(xí)了很多在上課沒(méi)懂的知識(shí),并對(duì)求哈夫曼樹(shù)及哈夫曼編碼/譯碼的算法有了更加深刻的了解,更鞏固了課堂中學(xué)習(xí)

86、有關(guān)于哈夫曼編碼的知識(shí),真正學(xué)會(huì)一種算法了。當(dāng)求解一個(gè)算法時(shí),不是拿到問(wèn)題就不加思索地做,而是首先要先對(duì)它有個(gè)大概的了解,接著再詳細(xì)地分析每一步怎么做,無(wú)論自己以前是否有處理過(guò)相似的問(wèn)題,只要按照以上的步驟,必定會(huì)順利地做出來(lái)。</p><p>  這次課程設(shè)計(jì),我在編輯中犯了不應(yīng)有的錯(cuò)誤,設(shè)計(jì)統(tǒng)計(jì)字符和合并時(shí)忘記應(yīng)該怎樣保存數(shù)據(jù),對(duì)文件的操作也很生疏。在不斷分析后明確并改正了錯(cuò)誤和疏漏,我的程序有了更高的質(zhì)量&

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論