版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)迷宮課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)迷宮課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---迷宮
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計 (3)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計題目
評論
0/150
提交評論