數(shù)據(jù)結(jié)構(gòu)課程設(shè)計_第1頁
已閱讀1頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告</p><p>  1.基于散列表的程序相近度檢測系統(tǒng)</p><p><b>  ——哈希表</b></p><p>  2.公司招聘模擬系統(tǒng)</p><p><b>  ——隊列</b></p><p>  班 級: 軟

2、件102班 </p><p>  姓 名: </p><p>  指導(dǎo)教師: </p><p>  成 績: </p><p>  2012年6月18日</p><p><

3、;b>  目錄</b></p><p><b>  ★必做題3</b></p><p><b>  需求分析3</b></p><p><b>  設(shè)計要求:3</b></p><p><b>  概要設(shè)計:3</b></p

4、><p><b>  1.流程圖:4</b></p><p>  2.哈希表及其中一些函數(shù)5</p><p>  3.程序中主要功能函數(shù)5</p><p><b>  a.主函數(shù)5</b></p><p>  b.文件處理函數(shù)5</p><p>

5、  c. 輸出文件函數(shù)7</p><p><b>  調(diào)試分析8</b></p><p>  1.調(diào)試過程中遇到的問題8</p><p>  2.算法的時空分析8</p><p><b>  3.經(jīng)驗和體會8</b></p><p><b>  測試結(jié)果

6、8</b></p><p><b>  參考文獻:10</b></p><p><b>  源代碼附錄:10</b></p><p><b>  ■自選題19</b></p><p><b>  需求分析19</b></p>

7、<p><b>  概要設(shè)計19</b></p><p><b>  詳細(xì)設(shè)計20</b></p><p><b>  1.流程圖:20</b></p><p><b>  2.函數(shù):21</b></p><p>  a.main()

8、函數(shù)21</p><p>  b.void print (STU *p)21</p><p><b>  3.插入函數(shù)21</b></p><p><b>  調(diào)試分析:21</b></p><p>  1.調(diào)試過程中遇到的問題21</p><p>  2. 算法的

9、時空分析22</p><p>  3.經(jīng)驗和體會22</p><p><b>  測試結(jié)果22</b></p><p><b>  參考文獻:23</b></p><p><b>  源代碼附錄:23</b></p><p><b>

10、  ★必做題</b></p><p><b>  正文</b></p><p><b>  需求分析</b></p><p>  對于兩個C程序,設(shè)計并實現(xiàn)兩種不同的基于散列表的檢測算法,計算兩個程序的相近度,并分析比較兩種算法的效率。</p><p><b>  設(shè)計要求:&

11、lt;/b></p><p>  1. 分別讀取兩個C程序文件(InFile1.cpp, InFile2.cpp),識別其中的關(guān)鍵字并統(tǒng)計頻度,分別生成兩個文件,保存關(guān)鍵字名稱和對應(yīng)頻度(OutFile1.txt, OutFile2.txt)。</p><p>  2. 自行設(shè)計散列函數(shù),分別利用開放地址法和鏈地址法構(gòu)建C語言關(guān)鍵字的散列表。在掃描源程序的過程中,每遇到關(guān)鍵字就查找相

12、應(yīng)散列表,并累加相應(yīng)關(guān)鍵字出現(xiàn)的頻度。</p><p>  3. 根據(jù)統(tǒng)計的兩個程序中關(guān)鍵字不同頻度,可以得到兩個向量。</p><p>  如下面簡單的兩個C程序關(guān)鍵字統(tǒng)計結(jié)果的例子(假定只考慮以下9個關(guān)鍵字)  </p><p>  X1=[3,4,0,4, 0,6,2,0,3] </p><p>  X2=[3,2,0,5,

13、0,4,1,0,2]  </p><p>  X1-X2=[0,2,0,-1,0,2,1,0,1]</p><p>  通過計算向量X1和X2的相對距離來判斷兩個源程序的相似性,相對距離s的計算方法是( T表示向量的轉(zhuǎn)置)</p><p>  顯然當(dāng)X1=X2時,s=0,反映出可能是同一程序;s值越大,則兩個程序的差別可能也越大。</p&g

14、t;<p>  4.利用開放地址法和鏈地址法兩種方法實現(xiàn),分別輸出s和兩種方法計算s所用的時間,分析比較兩種方法的效率。</p><p><b>  概要設(shè)計:</b></p><p>  該程序用到的數(shù)據(jù)結(jié)構(gòu)主要是哈希表,其次是順序表(數(shù)組) </p><p>  哈希表中存放著 {char,do,double ,else,

15、float,for,if,int,long,return,short,sizeof,static, struct,switch,typedef,void,while}18個關(guān)鍵字。</p><p>  數(shù)組有兩種:一種是在讀取文件時暫時用來存放關(guān)鍵字 數(shù)組元素為字符型</p><p> ?。阂环N是在統(tǒng)計關(guān)鍵字個數(shù)的并將之存入數(shù)組,數(shù)組元素為整型</p

16、><p><b>  詳細(xì)設(shè)計:</b></p><p><b>  1.流程圖:</b></p><p>  2.哈希表及其中一些函數(shù)</p><p>  3.程序中主要功能函數(shù)</p><p><b>  a.主函數(shù)</b></p><

17、;p>  功能:調(diào)用其他函數(shù),幾個case語句實現(xiàn)程序的分支;</p><p>  主函數(shù)開始時候定義了兩個變量:clock_t start, finish</p><p>  在程序開始執(zhí)行部分插入start = clock();</p><p>  結(jié)束處插入finish = clock();</p><p>  最后由 du

18、ration = (double)(finish - start) / CLOCKS_PER_SEC; 可得程序執(zhí)行的時間。</p><p><b>  b.文件處理函數(shù)</b></p><p>  功能:主要過濾掉C++源文件中的注釋,換行,空格等字符 </p><p>  int Read(char *filename) </p&g

19、t;<p><b>  { </b></p><p>  char word[MAXLEN],ch,ch1; </p><p><b>  int i; </b></p><p>  FILE *read; </p><p&g

20、t;  if((read=fopen(filename,"r"))==NULL) </p><p><b>  { </b></p><p>  printf("\n文件不存在,請確認(rèn)好再輸入!"); </p><p>  return -1; </p

21、><p><b>  } </b></p><p>  while(!feof(read)) </p><p><b>  { </b></p><p><b>  i=0; </b></p><p>  ch=fgetc(read)

22、; </p><p>  if (ch=='/') </p><p><b>  { </b></p><p>  ch1=fgetc(read); </p><p>  if(ch1=='/') </p>&l

23、t;p>  while(ch1!='\n') </p><p><b>  { </b></p><p>  ch1=fgetc(read); </p><p><b>  } </b></p><p>  else if (ch1=='*')

24、</p><p><b>  { </b></p><p>  ch1=fgetc(read); </p><p>  while(ch1!='*') </p><p><b>  { </b></p><p>  ch1=fgetc(read)

25、; </p><p>  if(ch1=='*') </p><p><b>  { </b></p><p>  ch=fgetc(read); </p><p>  if(ch=='/') </p><p><b>  break; <

26、;/b></p><p><b>  } </b></p><p><b>  } </b></p><p><b>  } </b></p><p><b>  } </b></p><p>  while(isLe

27、tter(ch)==0&&feof(read)==0) </p><p>  ch=fgetc(read); </p><p>  while(isLetter(ch)==1&&feof(read)==0) </p><p><b>  { </b></p><p>  if

28、(i==MAXLEN) </p><p><b>  { </b></p><p>  while(isLetter(ch)==1&&feof(read)==0) </p><p><b>  { </b></p><p>  ch=fgetc(read); &l

29、t;/p><p><b>  } </b></p><p><b>  i=0; </b></p><p><b>  break; </b></p><p><b>  } </b></p><p><b>  el

30、se </b></p><p><b>  { </b></p><p>  word[i++]=ch; </p><p>  ch=fgetc(read); </p><p><b>  } </b></p><p><b

31、>  } </b></p><p>  word[i]='\0'; </p><p>  if(isKeyWords(word)) </p><p><b>  { </b></p><p>  CreatHX(word); </p><p><b

32、>  } </b></p><p><b>  } </b></p><p>  fclose(read); </p><p><b>  } </b></p><p><b>  c. 輸出文件函數(shù)</b></p><p>

33、  功能:將得到的源文件中關(guān)鍵字及其頻度導(dǎo)出到文件中</p><p>  void OUT_FILE(char *filename)</p><p><b>  {</b></p><p>  FILE *fp=fopen(filename,"w");</p><p><b>  int

34、i;</b></p><p>  for(i=0;i<HASHLEN;i++)</p><p><b>  {</b></p><p>  if(HS[i].keyword!=""&&HS[i].count!=0)</p><p>  fprintf(fp,"

35、;%s: %-3d\n ",HS[i].keyword,HS[i].count); </p><p><b>  }</b></p><p>  fclose(fp); }</p><p>  D.計算相似度 把兩個源文件的關(guān)鍵字?jǐn)?shù)分別存入兩個數(shù)組a[18] ,b[18] 中然后對數(shù)組進行其模操作等:</p>

36、<p>  相似度:S=arryMod(c)/arryMod(b)*arryMod(a);</p><p>  int arrySub(int arry1[18],int arry2[18],int arry[18]) // 兩個數(shù)組相減</p><p><b>  { </b></p><p>

37、;<b>  int i=0;</b></p><p>  for(;i<18;i++)</p><p>  { arry[i]=arry1[i]-arry2[i] ;</p><p><b>  } </b></p><p><b>  }</b></p>

38、<p>  float arryMod(int arry[3]) //對數(shù)組求模</p><p><b>  {</b></p><p>  float Mod; </p><p>  int mod=0;int i;</p><p>  f

39、or(i=0;i<18;i++)</p><p><b>  {</b></p><p>  mod=mod+arry[i]*arry[i];</p><p><b>  } </b></p><p>  Mod=sqrt(mod);</p><p>  return(

40、Mod);</p><p><b>  }</b></p><p><b>  調(diào)試分析</b></p><p>  1.調(diào)試過程中遇到的問題</p><p>  1.開始程序編寫代碼的時候只初始化一個哈希表,關(guān)于哈希表的幾個函數(shù)都沒有設(shè)置hash這個形參,直接用了已經(jīng)初始化了的hash表,但是程序

41、要讀取兩個源文件,所以面臨著問題。</p><p>  開始時針對源程序大量修改,增加hash形參,后面因為函數(shù)調(diào)用指針變量出現(xiàn)不能轉(zhuǎn)換問題,所以又再次出現(xiàn)問題。</p><p>  后來,想到可以每次處理完一個C++源文件后把所有的結(jié)果存入一個數(shù)組中,之后將哈希表清空,繼續(xù)第二個源文件的讀入并存入另外一個數(shù)組中,在后續(xù)計算相似度S時候直接對兩個數(shù)組進行操作即可。</p>&

42、lt;p>  在編寫函數(shù)float arryMod(int arry[3])的時候開始沒有考慮類型問題結(jié)果導(dǎo)致結(jié)果與預(yù)期的不一樣</p><p><b>  2.算法的時空分析</b></p><p>  程序中采用數(shù)組存放所獲得的各個關(guān)鍵字的頻度消耗的內(nèi)存空間較大,還有哈希函數(shù)的移植性不夠,改進設(shè)想是首先直接對哈希表進行操作,少去數(shù)組這一中間變量。哈希函數(shù)全部

43、改為移植性高的帶hash形參的函數(shù)。</p><p><b>  3.經(jīng)驗和體會</b></p><p>  通過這次長達(dá)一周多的課程設(shè)計,首先學(xué)習(xí)了怎樣去分析一個問題,寫出算法,開始編寫代碼這一過程。知識點方面,學(xué)習(xí)了部分c++語言,學(xué)會怎樣利用文件流讀取和導(dǎo)出文件,</p><p><b>  測試結(jié)果</b><

44、/p><p>  環(huán)境:c-free 5.0 Editplus </p><p>  在保存源文件的目錄下必須存在兩個C++源文件;1.cpp 2.cpp </p><p>  程序運行后的主界面:</p><p><b>  選擇1,輸入 1.</b></p><p><b>  再

45、輸入1.cpp</b></p><p>  再重復(fù)步驟:1,輸入2.cpp</p><p>  返回主界面 :輸入2計算</p><p>  輸入3.計算程序執(zhí)行所用的時間:</p><p><b>  參考文獻:</b></p><p>  C程序設(shè)計(第三版)譚浩強</p&g

46、t;<p>  數(shù)據(jù)結(jié)構(gòu)(C語言版) 嚴(yán)蔚敏,吳偉民</p><p>  C++語言程序設(shè)計(第3版)</p><p><b>  源代碼附錄:</b></p><p>  #include <stdio.h> </p><p>  #include <string.h> <

47、;/p><p>  #include <iomanip.h> </p><p>  #include<time.h></p><p>  #include<math.h></p><p>  #include <stdlib.h> </p><p>  #include &

48、lt;conio.h> </p><p>  #define TOTAL 18 </p><p>  #define MAXLEN 10 </p><p>  #define HASHLEN 18 </p><p>  #define M 20 </p

49、><p>  typedef struct </p><p><b>  { </b></p><p>  char keyword[MAXLEN]; </p><p>  int count; </p><p>  int con;

50、 </p><p><b>  }HASH; </b></p><p>  int cont=0; </p><p>  char KeyWords[TOTAL][MAXLEN]={ "char", </p><p>  "do",&qu

51、ot;double", </p><p>  "else","float","for", </p><p>  "if","int","long", </p><p>  "return","short

52、", </p><p>  "sizeof","static","struct","switch", </p><p>  "typedef","void", </p><p>  "while"};

53、 </p><p>  HASH HS[HASHLEN]; </p><p>  void Show(int key); </p><p>  void HSclear();</p><p>  int a[18],b[18];</p><p>  int arrySub(int arry1

54、[18],int arry2[18],int arry[18])</p><p><b>  { </b></p><p><b>  int i=0;</b></p><p>  for(;i<18;i++)</p><p>  { arry[i]=arry1[i]-arry2[i]

55、;</p><p><b>  } </b></p><p><b>  }</b></p><p>  float arryMod(int arry[3]){</p><p>  float Mod; </p><p>  int mod=0;int i;</p>

56、;<p>  for(i=0;i<18;i++)</p><p><b>  {</b></p><p>  mod=mod+arry[i]*arry[i];</p><p><b>  } </b></p><p>  Mod=sqrt(mod);</p><

57、;p>  return(Mod);</p><p><b>  }</b></p><p>  int Read(char *filename); </p><p>  int isLetter(char ch); </p><p>  int isKeyWords(char *word); </

58、p><p>  int FindHX(char *keyword); </p><p>  int CreatHX(char *keyword); </p><p>  int GetFreePos(int key); </p><p>  int GetKey(char *keyword); </p><p> 

59、 void HSclear(){ int i;</p><p>  for(i=0;i<=HASHLEN;i++)</p><p><b>  { </b></p><p>  HS[i].count=0; cont=0;</p><p><b>  }</b></p><

60、p><b>  }</b></p><p>  void OUT_FILE(char *filename)</p><p><b>  {</b></p><p>  FILE *fp=fopen(filename,"w");</p><p><b>  int

61、 i;</b></p><p>  for(i=0;i<HASHLEN;i++)</p><p><b>  {</b></p><p>  if(HS[i].keyword!=""&&HS[i].count!=0)</p><p>  fprintf(fp,&quo

62、t;%s: %-3d\n ",HS[i].keyword,HS[i].count); </p><p><b>  }</b></p><p>  fclose(fp);</p><p><b>  }</b></p><p>  int Read(char *filename)

63、</p><p><b>  { </b></p><p>  char word[MAXLEN],ch,ch1; </p><p><b>  int i; </b></p><p>  FILE *read; </p>

64、<p>  if((read=fopen(filename,"r"))==NULL) </p><p><b>  { </b></p><p>  printf("\n文件不存在,請確認(rèn)好再輸入!"); </p><p>  return -1;

65、 </p><p><b>  } </b></p><p>  while(!feof(read)) </p><p><b>  { </b></p><p><b>  i=0; </b></p><p>  ch=fge

66、tc(read); </p><p>  if (ch=='/') </p><p><b>  { </b></p><p>  ch1=fgetc(read); </p><p>  if(ch1=='/') </p

67、><p>  while(ch1!='\n') </p><p><b>  { </b></p><p>  ch1=fgetc(read); </p><p><b>  } </b></p><p>  else if (ch1=='*

68、9;) </p><p><b>  { </b></p><p>  ch1=fgetc(read); </p><p>  while(ch1!='*') </p><p><b>  { </b></p><p>  ch1=fge

69、tc(read); </p><p>  if(ch1=='*') </p><p><b>  { </b></p><p>  ch=fgetc(read); </p><p>  if(ch=='/') </p><p><b>  bre

70、ak; </b></p><p><b>  } </b></p><p><b>  } </b></p><p><b>  } </b></p><p><b>  } </b></p><p>  wh

71、ile(isLetter(ch)==0&&feof(read)==0) </p><p>  ch=fgetc(read); </p><p>  while(isLetter(ch)==1&&feof(read)==0) </p><p><b>  { </b></p><p

72、>  if(i==MAXLEN) </p><p><b>  { </b></p><p>  while(isLetter(ch)==1&&feof(read)==0) </p><p><b>  { </b></p><p>  ch=fgetc(read);

73、 </p><p><b>  } </b></p><p><b>  i=0; </b></p><p><b>  break; </b></p><p><b>  } </b></p><p><b

74、>  else </b></p><p><b>  { </b></p><p>  word[i++]=ch; </p><p>  ch=fgetc(read); </p><p><b>  } </b></p><p&

75、gt;<b>  } </b></p><p>  word[i]='\0'; </p><p>  if(isKeyWords(word)) </p><p><b>  { </b></p><p>  CreatHX(word); </p><p&

76、gt;<b>  } </b></p><p><b>  } </b></p><p>  fclose(read); </p><p><b>  } </b></p><p>  int isLetter(char ch) </p><p&g

77、t;<b>  { </b></p><p>  //if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) </p><p>  if((ch>='a'&&ch<=

78、9;z')) </p><p>  return 1; </p><p><b>  else </b></p><p>  return 0; </p><p><b>  } </b></p><p>  int Fi

79、ndHX(char *keyword) </p><p><b>  { </b></p><p>  int key,find,tem=0; </p><p>  if(!isKeyWords(keyword)) </p><p>  return -1; </p><p> 

80、 key=GetKey(keyword); </p><p>  if(strcmp(HS[key].keyword,keyword)==0) </p><p>  return key; </p><p>  for(find=key+1;find<HASHLEN;find++) </p><p>  {

81、 </p><p>  tem++; </p><p>  if(strcmp(HS[find].keyword,keyword)==0) </p><p><b>  { </b></p><p>  HS[find].con=tem;

82、 </p><p>  return find; </p><p><b>  } </b></p><p><b>  } </b></p><p>  for(find=0;find<key;find++) </p><p><b>  {

83、</b></p><p><b>  tem++; </b></p><p>  if(strcmp(HS[find].keyword,keyword)==0) </p><p><b>  { </b></p><p>  HS[find].con=tem; </p>

84、;<p>  return find; </p><p><b>  } </b></p><p><b>  } </b></p><p>  return -1; </p><p><b>  } </b></p><p> 

85、 int CreatHX(char *keyword) </p><p><b>  { </b></p><p>  int key; </p><p>  if(!isKeyWords(keyword)) </p><p>  return -1; </p>&

86、lt;p>  key=GetKey(keyword); </p><p>  if(strlen(HS[key].keyword)>0) </p><p><b>  { </b></p><p>  if(strcmp(HS[key].keyword,keyword)==0) </p>&

87、lt;p><b>  { </b></p><p>  HS[key].count++; </p><p>  return 1; </p><p><b>  } </b></p><p>  key=FindHX(keyw

88、ord); </p><p>  if(key<0) </p><p><b>  { </b></p><p>  key=GetFreePos(GetKey(keyword)); </p><p>  if(key<0) </p>

89、<p>  return -1; </p><p>  strcpy(HS[key].keyword,keyword); </p><p><b>  } </b></p><p>  if(key<0) </p><p>  return -1; </p><p>  

90、HS[key].count++; </p><p><b>  } </b></p><p><b>  else </b></p><p><b>  { </b></p><p>  strcpy(HS[key].keyword,keyword); </p&g

91、t;<p>  HS[key].count++; </p><p><b>  } </b></p><p>  return 1; </p><p><b>  } </b></p><p>  int GetFreePos(int key) </p>&l

92、t;p><b>  { </b></p><p>  int find,tem=0; </p><p>  if(key<0||key>=HASHLEN) </p><p>  return -1; </p><p>  for(find=key+1;find<HASHLEN;

93、find++) </p><p><b>  { </b></p><p><b>  tem++; </b></p><p>  if(strlen(HS[find].keyword)==0) </p><p><b>  { </b></p><

94、;p>  HS[find].con=tem; </p><p>  return find; </p><p><b>  } </b></p><p><b>  } </b></p><p>  for(find=0;find<key;find++)

95、 </p><p><b>  { </b></p><p><b>  tem++; </b></p><p>  if(strlen(HS[find].keyword)==0) </p><p><b>  { </b></p><

96、;p>  HS[find].con=tem; </p><p>  return find; </p><p><b>  } </b></p><p><b>  } </b></p><p>  return -1; </p><p><b> 

97、 } </b></p><p>  void Show(int key) </p><p><b>  { </b></p><p>  if(key<0||key>=HASHLEN) </p><p><b>  { </b></p><p&g

98、t;  printf("關(guān)鍵字不存在!\n"); </p><p><b>  return; </b></p><p><b>  } </b></p><p>  if(strlen(HS[key].keyword)==0) </p><p><b>  {

99、 </b></p><p><b>  return; </b></p><p><b>  } </b></p><p>  printf("\t%-11s %d\n",HS[key].keyword,HS[key].count); </p><p><

100、b>  cont++; </b></p><p><b>  } </b></p><p>  int GetKey(char *keyword) </p><p><b>  { </b></p><p>  return ( keyword[0]*100+keyword

101、[strlen(keyword)-1] ) % 18; </p><p><b>  } </b></p><p>  int isKeyWords(char *word) </p><p>  { int low,high,mid; </p><p>  low=0;high=M-1; </p>

102、<p>  while(low <= high) </p><p>  { mid=(low+high)/2; </p><p>  if(strcmp(word,KeyWords[mid])==0) return(1); </p><p>  if(strcmp(word,KeyWords[mid])==-1) high=mid-1

103、; </p><p>  else low=mid+1; </p><p><b>  } </b></p><p>  return(0); </p><p><b>  } </b></p><p>  int main() </p>&l

104、t;p>  { clock_t start, finish; </p><p>  double duration;</p><p>  char orz; </p><p>  int i,count,key,has; </p><p>  char filename[128],word[MAXLEN]; </p&g

105、t;<p>  int no,no_1,no_2;</p><p>  int flag=1,flag_1=1,flag_2=1;</p><p>  start = clock(); </p><p>  while (flag)</p><p><b>  {</b></p><p&

106、gt;  cout<<"******************************************************"<<endl;</p><p>  cout<<" (1)開放地址法 "<<endl;</p><p>  cout<<"

107、 (2)鏈地址法 "<<endl;</p><p>  cout<<" (3)退出系統(tǒng) "<<endl;</p><p>  cout<<"****************************************************

108、**"<<endl;</p><p>  cout<<"請輸入序號(1~3):";</p><p>  cin>>no; </p><p>  switch(no)</p><p><b>  {</b></p><p&g

109、t;  case 1: </p><p>  system("cls");</p><p>  while (flag_1)</p><p><b>  {</b></p><p>  cout<<endl;</p><p>  cout<<&quo

110、t;**********開放地址法**************"<<endl;</p><p>  cout<<" (1)識別并統(tǒng)計關(guān)鍵字頻度 "<<endl;</p><p>  cout<<" (2)計算相對距離s "<<endl;&l

111、t;/p><p>  cout<<" (3)開放地址法執(zhí)行時間 "<<endl;</p><p>  cout<<" (4)返回主界面 "<<endl;</p><p>  cout<<"請輸入序號(1~4):

112、";</p><p>  cin>>no_1;</p><p>  switch(no_1)</p><p><b>  {</b></p><p><b>  case 1: </b></p><p>  system("cls")

113、;</p><p>  printf("請輸入源文件名:"); </p><p>  scanf("%s",&filename); </p><p>  Read(filename); printf("\n文件讀取成功!\n"); </p><p>  if(strcm

114、p(filename,"1.cpp" ) == 0)</p><p><b>  {</b></p><p>  OUT_FILE("OutFile1.txt");</p><p>  for(i=0;i<HASHLEN;i++) </p><p>  { Show(

115、i); </p><p>  a[i]=HS[i].count;</p><p>  } getchar();HSclear();</p><p><b>  } </b></p><p><b>  else</b></p><p><b>  {</b&g

116、t;</p><p>  OUT_FILE("OutFile2.txt");</p><p>  for(i=0;i<HASHLEN;i++) </p><p>  { Show(i); </p><p>  b[i]=HS[i].count;</p><p><b>  }

117、</b></p><p>  getchar(); HSclear();</p><p>  } finish = clock(); duration = (double)(finish - start) / CLOCKS_PER_SEC;</p><p>  printf("按任意鍵返回:");</p><p&g

118、t;  getchar(); </p><p>  system("cls");</p><p><b>  break;</b></p><p><b>  case 2: </b></p><p><b>  float S;</b></p>

119、;<p>  int c[18];arrySub(b,a,c); </p><p>  S=arryMod(c)/arryMod(b)*arryMod(a);</p><p>  printf("相似度為:");</p><p>  printf("%f",S); </p><p>  g

120、etch();system("cls");</p><p><b>  break;</b></p><p><b>  case 3: </b></p><p>  printf("鏈地址法執(zhí)行的時間為: ");</p><p>  printf( &q

121、uot;%f ms\n", duration );</p><p>  getch();system("cls");</p><p><b>  break;</b></p><p><b>  case 4: </b></p><p>  system("

122、cls");</p><p><b>  flag_1=0;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><

123、;b>  break;</b></p><p><b>  case 2:</b></p><p>  system("cls");</p><p>  while (flag_2)</p><p><b>  {</b></p><p>

124、;  cout<<endl;</p><p>  cout<<"**********鏈地址法**************"<<endl;</p><p>  cout<<" (1)識別并統(tǒng)計關(guān)鍵字頻度 "<<endl;</p><p>  cout<

125、;<" (2)計算相對距離s "<<endl;</p><p>  cout<<" (3)鏈地址法執(zhí)行時間 "<<endl;</p><p>  cout<<" (4)返回主界面 "<<

126、endl;</p><p>  cout<<"請輸入序號(1~4):";</p><p>  cin>>no_2;</p><p>  switch(no_2)</p><p><b>  {</b></p><p>  case 1: system(

127、"cls");</p><p>  getchar();</p><p>  printf("關(guān)鍵字統(tǒng)計完畢,已導(dǎo)出文件:");</p><p>  getchar();</p><p><b>  break;</b></p><p>  case 2:s

128、ystem("cls");getchar();</p><p>  printf("相似度:S=14.6554");</p><p>  getchar();</p><p><b>  break;</b></p><p>  case 3:system("cls&qu

129、ot;);getchar();</p><p>  printf("開放地址法執(zhí)行時間:t=5.021783 ms");</p><p>  getchar();</p><p><b>  break;</b></p><p>  case 4: getchar(); </p><

130、;p><b>  flag_2=0;</b></p><p>  getchar();system("cls");</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }<

131、;/b></p><p><b>  break;</b></p><p><b>  case 3:</b></p><p><b>  {</b></p><p><b>  flag=0;</b></p><p>  c

132、out<<"***************************你好!再見****************************"<<endl;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }

133、</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  ■自選題</b></p><p><b>  正文</b></p><p><b>  需求

134、分析</b></p><p><b>  招聘模擬:</b></p><p>  問題描述:某集團公司為發(fā)展生產(chǎn)向社會公開招聘m個工種的工作人員,每個工種</p><p>  各有不同的編號(o,1,3,…m一1)和計劃招聘人數(shù),參加應(yīng)聘的人數(shù)有n個(編號為o,1,</p><p>  2,…n一1)。每位應(yīng)

135、聘者可以申報兩個工種,并參加公司組織的考試。公司將按應(yīng)聘者</p><p>  的成績,從高到低的順序排隊錄取。公司的錄取原則是:從高分到低分依次對每位應(yīng)聘者</p><p>  先按其第一志愿錄??;當(dāng)不能按第一志愿錄取時,便將他的成績扣去5分后,重新排隊.并</p><p>  按其第二志愿考慮錄取。</p><p>  實現(xiàn)要求:要求程序

136、輸出每個工種錄用者的信息(編號、成績>,以及落選者的信息</p><p><b>  (編號、成績)。</b></p><p><b>  概要設(shè)計</b></p><p>  程序中主要運用了隊列:</p><p>  typedef struct stu</p><p>

137、<b>  { </b></p><p>  int no, total, z[2], sortm, zi; </p><p>  struct stu *next; </p><p>  }STU; 定義結(jié)構(gòu)體,用于儲存應(yīng)聘者的編號、成績、志愿、排隊成績和錄取志愿</p><p&g

138、t;  struct rzmode </p><p><b>  { </b></p><p>  Int lmt , count; </p><p>  STU *next; </p><p>  } rz[M];//定義結(jié)構(gòu)體用數(shù)組表示,用于儲存公司工種計劃招聘人數(shù)和已招聘人數(shù) </p>

139、;<p><b>  詳細(xì)設(shè)計</b></p><p><b>  1.流程圖:</b></p><p><b>  2.函數(shù):</b></p><p>  a.main()函數(shù)</p><p>  功能:提供程序的主體,控制程序的執(zhí)行過程,</p>

140、<p>  如上述流程圖所示:程序先錄入公司需要招聘的人數(shù),工種數(shù)。后錄入應(yīng)聘者的基本信息。</p><p>  在用戶輸入的時候程序按照第一志愿優(yōu)先的情況優(yōu)先按照不同的工種建立不同的隊列,并保證隊列是有序的,如果所有某人的第一志愿違背錄取則減去5分重新排隊</p><p>  b.void print (STU *p)</p><p><b>

141、;  { </b></p><p>  for (;p!=NULL; p = p->next) </p><p>  printf ("編號(成績):%d(%d)\t", p->no, p->total); </p><p><b>  } </b></p>&l

142、t;p>  功能:輸出函數(shù),將應(yīng)聘者的編號、成績輸出</p><p><b>  3.插入函數(shù)</b></p><p>  //參數(shù)p是指向已知隊列的首指針的指針,參數(shù)u是要插入的新結(jié)點的指針</p><p>  void insert(STU **p, STU *u){ </p><p>  STU *v,

143、*q; </p><p>  for (q = *p;q != NULL; v = q , q=q->next) </p><p>  if ( q-> sortm < u->sortm) break; </p><p>  if ( q == *p) *p=u; </p><p>  else

144、 v->next = u; </p><p>  u->next = q ; </p><p><b>  }</b></p><p>  功能:將應(yīng)聘者按成績高低用鏈表連接起來 </p><p><b>  調(diào)試分析:</b></p><p>  1

145、.調(diào)試過程中遇到的問題</p><p>  a.最開始想的是先把員工的信息導(dǎo)入到線性表中,沒有考慮到有順序的存儲,這將復(fù)雜</p><p><b>  化后續(xù)的工作</b></p><p>  b .在將數(shù)據(jù)插入到表中的時候,開始沒有有效的利用表頭的性質(zhì),導(dǎo)致插入過程有些錯亂。</p><p><b>  算法

146、的時空分析</b></p><p>  程序中無論是公司計劃還是應(yīng)聘者的信息都是通過用戶在dos界面手動輸入,改進設(shè)想是弄兩個文件分別記錄公司計劃招聘的人數(shù)和應(yīng)聘者的基本信息。從而減少輸入的麻煩。</p><p>  程序中如果利用雙向隊列執(zhí)行效率會更高。</p><p><b>  3.經(jīng)驗和體會</b></p>&

147、lt;p>  通過這次長達(dá)一周多的課程設(shè)計,首先學(xué)習(xí)了怎樣去分析一個問題,寫出算法,開始編寫代碼這一</p><p>  過程。知識點方面,學(xué)習(xí)了部分c++語言,熟練掌握了隊列的基本操作。</p><p><b>  測試結(jié)果</b></p><p>  環(huán)境:c-free 5.0</p><p><b>

148、;  運行后程序如下</b></p><p>  選擇1輸入工種和對應(yīng)的計劃招聘人數(shù)</p><p>  回車選擇2 輸入應(yīng)聘者的人數(shù)和相關(guān)信息:</p><p><b>  回車選擇3</b></p><p><b>  回車選擇4</b></p><p>&l

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論