版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 單詞出現(xiàn)次數(shù)統(tǒng)計(jì)</b></p><p><b> 一 目的</b></p><p> 通過課程設(shè)計(jì),加深對(duì)《C語言程序設(shè)計(jì)》課程所學(xué)知識(shí)的理解,熟練掌握和鞏固C語言的基本知識(shí)和語法規(guī)范,包括:數(shù)據(jù)類型(整形、實(shí)型、字符型、指針、數(shù)組、結(jié)構(gòu)等);運(yùn)算類型(算術(shù)運(yùn)算、邏輯運(yùn)算、自增自減運(yùn)算、賦值運(yùn)算等);程序結(jié)
2、構(gòu)(順序結(jié)構(gòu)、判斷選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu));庫函數(shù)應(yīng)用等,學(xué)會(huì)編制結(jié)構(gòu)清晰、風(fēng)格良好、數(shù)據(jù)結(jié)構(gòu)適當(dāng)?shù)腃語言程序,從而具備利用計(jì)算機(jī)編程分析解決綜合性實(shí)際問題的初步能力。</p><p><b> 二 需求分析</b></p><p><b> 1、輸入數(shù)據(jù)</b></p><p> 輸入2個(gè)字符串?dāng)?shù)據(jù)。第一個(gè)為文字所
3、保存在的文件名,第二個(gè)為要統(tǒng)計(jì)的單詞。</p><p><b> 2、輸出數(shù)據(jù)</b></p><p> 輸出進(jìn)行查找的文章以及搜索的單詞。并輸出搜索結(jié)果:單詞在文章出現(xiàn)的次數(shù)及第一次出現(xiàn)位置。</p><p><b> 3、程序功能</b></p><p> 按照輸入的文件名打開文件并獲取
4、文章內(nèi)容,搜索統(tǒng)計(jì)單詞出現(xiàn)次數(shù)以及第一次出現(xiàn)位置并輸出結(jié)果。</p><p><b> 三 概要設(shè)計(jì)</b></p><p> 1、全局變量或類型說明</p><p><b> 2、模塊功能</b></p><p> void printlogo()清屏并輸出logo。</p>
5、<p> void msg(char *str) 清屏并輸出logo后輸出參數(shù)str的內(nèi)容。</p><p> char LoadFile(char *FileName)打開文章文件FileName并讀取內(nèi)容到內(nèi)存 該函數(shù)會(huì)自動(dòng)為文章分配內(nèi)存 如果內(nèi)存已經(jīng)分配過會(huì)先釋放原來申請的內(nèi)存 成功返回1 失敗返回0</p><p> char lowcase(char c)把c
6、轉(zhuǎn)化成小寫返回 如果c不是字母直接返回c本身。</p><p> void GetText()讓用戶輸入文件名并讀入文章 將會(huì)一直循環(huán)直到成功打開文件或用戶輸入”\”終止程序。</p><p> char ckeckletter(char c)檢查c是否為一個(gè)英文字母 是返回1否返回0</p><p> char ComstrProc(char str[],i
7、nt pos,int len)比較字符串str與文章從pos開始長度為len的部分 len即str的長度。 注意str在傳入前必需先轉(zhuǎn)化成全小寫。</p><p> void AnalysisText(char key[])在已經(jīng)讀入內(nèi)存的文章利用ComstrProc進(jìn)行統(tǒng)計(jì) 并輸出結(jié)果(個(gè)數(shù) 第一次出現(xiàn)位置 或者未找到)</p><p> void wuhansen()程序主要模塊
8、不斷執(zhí)行并根據(jù)要求重復(fù)程序功能(1重復(fù) 2退出程序)。</p><p> int main()僅僅是調(diào)用wuhansen后清理內(nèi)存。</p><p> 3、程序函數(shù)調(diào)用流程</p><p><b> 四 詳細(xì)設(shè)計(jì)</b></p><p><b> 源代碼如下:</b></p>
9、<p> #include <stdio.h></p><p> #include <conio.h></p><p> #include <string.h></p><p> #if defined ( _MSC_VER )</p><p> #include <stdlib
10、.h> /*VC*/</p><p><b> #else</b></p><p> #include <alloc.h> /*TC & CBuilder*/</p><p><b> #endif</b></p><p> /*使用預(yù)編譯指令使VC和CBuilde
11、r Tc都可以正常編譯</p><p><b> 分配內(nèi)存</b></p><p> (VC 的分配內(nèi)存函數(shù)位于 stdlib.h</p><p> Borland公司的編譯器的該函數(shù)位于alloc.h)*/</p><p> char *buffer;</p><p> unsigne
12、d int buffersize=0;</p><p> int fileopen=0,quit=0;</p><p> /* fileopen 為1時(shí) 說明內(nèi)存已經(jīng)申請 如果要重新分配請先Free*/</p><p> /* quit 為1的話程序可以退出*/</p><p> void printlogo()</p>
13、<p><b> {</b></p><p> #if defined ( _MSC_VER )</p><p> system("CLS");</p><p> /*VC沒有清屏函數(shù)所以使用DOS命令來完成*/</p><p><b> #else</b>
14、</p><p><b> clrscr();</b></p><p><b> #endif</b></p><p><b> /*清屏*/</b></p><p> printf("+------------------------------------
15、------+\n");</p><p> printf("| Word Counter |\n");</p><p> printf("| By WuHansen 08065008 |\n");</p><p>
16、printf("| QQ:21764538 Www.WuHansen.Com |\n");</p><p> printf("+------------------------------------------+\n");</p><p><b> }</b></p><p>
17、; void msg(char *str)</p><p><b> {</b></p><p> printlogo();</p><p> printf(str);</p><p><b> }</b></p><p> char LoadFile(char
18、*FileName)</p><p> /*分配內(nèi)存并把數(shù)據(jù)文件載入到內(nèi)存中*/</p><p><b> {</b></p><p> FILE *hFile;</p><p> if(strlen(FileName)<=0) return 0;</p><p> buffers
19、ize=0;</p><p> hFile=fopen(FileName,"r");</p><p> if(hFile==NULL)</p><p><b> {</b></p><p><b> return 0;</b></p><p>&l
20、t;b> }</b></p><p><b> else</b></p><p><b> { </b></p><p> fseek(hFile, 0, SEEK_END);</p><p> /*把文件指針移動(dòng)到結(jié)尾處</p><p> 配合
21、ftell可以知道文件的大小*/</p><p> buffersize=ftell(hFile);</p><p> if(buffersize==0) return 0;</p><p> fseek(hFile, 0, SEEK_SET);</p><p> /*將指針移回開頭讀取數(shù)據(jù)*/</p><p>
22、; if (fileopen)</p><p> { /*如果內(nèi)存已經(jīng)分配 先釋放原來申請的內(nèi)存*/</p><p> fileopen=0;</p><p> free(--buffer);</p><p> /*分配內(nèi)存后buffer++所以先--buffer */</p><p><b>
23、}</b></p><p> buffer=(char*)malloc(buffersize+2);</p><p> buffer[0]=0;/*讓內(nèi)存區(qū)以NULL開頭*/</p><p> buffer++;/*把內(nèi)存起始指針移動(dòng)到NULL后面*/</p><p> buffer[buffersize]=0;/* 讓內(nèi)
24、存區(qū)以NULL結(jié)尾*/</p><p><b> /*</b></p><p> 為文章數(shù)據(jù)和2 個(gè)NULL分配內(nèi)存 結(jié)構(gòu)如下</p><p> NULL-Contect-NULL</p><p> 這樣在AnalysisText里面可以直接判斷單詞前后的字符而不用擔(dān)心內(nèi)存錯(cuò)誤</p><p&
25、gt;<b> */</b></p><p> fread(buffer,1,buffersize,hFile);</p><p> fileopen=1;</p><p> fclose(hFile);</p><p> printf("Load Done!");</p>&
26、lt;p><b> return 1;</b></p><p><b> }</b></p><p><b> }</b></p><p> char lowcase(char c)</p><p><b> {</b></p>
27、<p> if((c>='A')&&(c<='Z'))return (c+32);</p><p><b> return c;</b></p><p><b> }</b></p><p> void GetText()</p>
28、<p> /*一直循環(huán)直到成功打開用戶輸入的文件.</p><p> 或者用戶輸入“\”退出程序*/</p><p><b> {</b></p><p> char str[255];</p><p> msg("Input text file name(or \"\\\&q
29、uot; to Exit):");</p><p><b> for(;;)</b></p><p><b> {</b></p><p> gets(str);</p><p> if(str[0]=='\\')</p><p> { /
30、*用戶輸入“\”退出程序*/</p><p><b> quit=1;</b></p><p><b> return;</b></p><p><b> }</b></p><p> if(LoadFile(str)) break;</p><p&
31、gt; printlogo();</p><p> printf("Cannot open file \"%s\",please try again.\n",str);</p><p> printf("Input text file name(or \"\\\" to Exit):");</p&g
32、t;<p><b> }</b></p><p><b> }</b></p><p> char ckeckletter(char c)</p><p><b> {</b></p><p> if(((c>='A')&&
33、amp;(c<='Z'))||((c>='a')&&(c<='z')))return 1;</p><p><b> return 0;</b></p><p><b> }</b></p><p> char ComstrProc(c
34、har str[],int pos,int len)</p><p> /*比較字符串str和buffer從pos開始len長度 len即str長度*/</p><p> /*先trlwr(str)轉(zhuǎn)化成小寫 這樣就不用每次都轉(zhuǎn)化提高效率</p><p><b> */</b></p><p><b>
35、 {</b></p><p><b> int i;</b></p><p> for(i=0;i<len;i++)</p><p><b> {</b></p><p> if(str[i]!=lowcase(buffer[i+pos])) return 0;</p
36、><p><b> }</b></p><p><b> return 1;</b></p><p><b> }</b></p><p> void AnalysisText(char key[])</p><p> /*搜索關(guān)鍵字 輸入統(tǒng)計(jì)結(jié)果
37、*/</p><p><b> {</b></p><p> int i,len=0,tmp=0,count=0,firstpos=0;</p><p> len=strlen(key);</p><p> if(len<=0)</p><p><b> {</b&
38、gt;</p><p> printf("Please input a word\n");</p><p><b> return;</b></p><p><b> }</b></p><p> tmp=buffersize-len;</p><p&
39、gt; printf("Text:\n");</p><p> printf(buffer);</p><p> printf("\n");</p><p> printf("\"");</p><p> printf(key);</p><p
40、> printf("\" ");</p><p> key=strlwr(key);/*把key內(nèi)字符串轉(zhuǎn)化成小寫*/</p><p> if(tmp>=0)</p><p><b> {</b></p><p> for(i=0;i<tmp;i++)</p
41、><p><b> { </b></p><p> if((ComstrProc(key,i,len))&&(!ckeckletter(buffer[i+len]))&&(!ckeckletter(buffer[i-1])))</p><p> /*除了2個(gè)字符串一樣</p><p>
42、 還要比較改單詞的前后一個(gè)字符是否不為英文字母</p><p> buffer申請內(nèi)存時(shí)設(shè)置了緩沖 這里可以直接判斷不用擔(dān)心內(nèi)存錯(cuò)誤*/</p><p><b> {</b></p><p> if(count==0)firstpos=i+1;</p><p><b> count++;</b&g
43、t;</p><p><b> /*記錄數(shù)據(jù)*/</b></p><p><b> i+=len;</b></p><p> /*跳過這個(gè)單詞直接搜索后面*/</p><p><b> }</b></p><p><b> else&
44、lt;/b></p><p><b> {</b></p><p><b> }</b></p><p><b> }</b></p><p> if(count>0)</p><p><b> {</b>&l
45、t;/p><p> printf("has been found\n");</p><p> printf("First found:%d total:%d\n",firstpos,count);</p><p><b> }</b></p><p><b> els
46、e</b></p><p> printf("cannot be found...\n");</p><p><b> /*沒找到*/</b></p><p><b> }</b></p><p><b> else</b></p&
47、gt;<p><b> {</b></p><p> printf("cannot be found...\n");</p><p> /* 關(guān)鍵字長度比文章大</p><p> 這樣就不用比較了肯定找不到哈*/</p><p><b> }</b><
48、;/p><p><b> }</b></p><p> void wuhansen()</p><p><b> /*實(shí)際上的主函數(shù)</b></p><p> 不斷重復(fù)整個(gè)過程直到用戶輸入2退出程序</p><p><b> */</b></
49、p><p><b> {</b></p><p> char key[255];</p><p><b> char br;</b></p><p><b> for(;;)</b></p><p><b> {</b><
50、;/p><p> msg("Welcome\n");</p><p> GetText();</p><p> if(quit) return;</p><p> msg("Input Keyword:");</p><p> gets(key);</p>&
51、lt;p> AnalysisText(key);</p><p> printf("\n");</p><p> for(br=1;br;)</p><p><b> {</b></p><p> printf("Choose:\n");</p>&l
52、t;p> printf("\"1\" try again.\n");</p><p> printf("\"2\" exit.\n");</p><p> switch (getchar())</p><p><b> {</b></p>
53、<p><b> case '1':</b></p><p><b> br=0;</b></p><p> /*switch中不能用break 跳出"for" 所以設(shè)置一個(gè)變量*/</p><p> getchar();</p><p>
54、/*清除用戶輸入時(shí)候產(chǎn)生的"\n" */</p><p><b> break;</b></p><p><b> case '2':</b></p><p><b> return;</b></p><p><b> de
55、fault:</b></p><p> printf("Wrong Key ")</p><p><b> ;</b></p><p><b> }</b></p><p><b> }</b></p><p>&
56、lt;b> }</b></p><p><b> }</b></p><p> int main()</p><p><b> {</b></p><p> wuhansen();</p><p> if (fileopen) free(--bu
57、ffer);</p><p><b> return 0;</b></p><p><b> }</b></p><p><b> 五 調(diào)試分析</b></p><p><b> 1、測試數(shù)據(jù)</b></p><p>&l
58、t;b> 文章:</b></p><p> Recently,there has been a discussion regarding the issue of knowledge in the newspaper.As can be seen from the picture,knowledge is symbolized a clenched fist as power,the fis
59、t sends out a message for "obedience",threatening to crack with power any hard nut.The more demanding and challenging a task is,the more powerful the fist seems to grow.Similarly,knowledge,the strongest power f
60、or human beings,feeds up the field of science and technology.The more advanced and developed a field is,the more pr</p><p><b> 關(guān)鍵詞:</b></p><p><b> The</b></p>&l
61、t;p><b> 2、輸出結(jié)果</b></p><p> First found:48 total:11</p><p> 3、存在過的問題以及分析解決</p><p> 1)判斷單詞時(shí)候只判斷了結(jié)尾沒判斷開頭。增加了(!ckeckletter(buffer[i-1]))并調(diào)整了內(nèi)存的分配格式(保護(hù)內(nèi)存)加以解決。</p&g
62、t;<p> 2)關(guān)鍵字包含大寫沒轉(zhuǎn)化的錯(cuò)誤。使用key=strlwr(key);進(jìn)行正確轉(zhuǎn)化。</p><p> 3)代碼無法在VC下正常編譯(只能在Borland的編譯器下編譯)。加了預(yù)編譯條件,針對(duì)VC頭文件及函數(shù)進(jìn)行修改,支持了幾種常見編譯器。(詳見代碼中的注釋)</p><p><b> 六 測試結(jié)果</b></p>&l
63、t;p> 測試結(jié)果如下圖所示:</p><p><b> 七 用戶使用說明</b></p><p> 運(yùn)行程序后會(huì)提示輸入數(shù)據(jù)文件名,直到輸入正確路徑打開文件為止(默認(rèn)數(shù)據(jù)文件為DAT 請放在程序目錄下輸入DAT即可打開),否則會(huì)一直重復(fù)這個(gè)過程,可以輸入“\”來直接終止程序。讀取數(shù)據(jù)文件成功后會(huì)提示輸入要搜索的單詞,輸入后會(huì)進(jìn)行查找并返回搜索結(jié)果。&l
64、t;/p><p> 完成后程序會(huì)提示輸入1.重試一次 2.退出程序 可以按照需要選擇。</p><p><b> 八 課程設(shè)計(jì)總結(jié)</b></p><p> 這次課程設(shè)計(jì)中,調(diào)試測試數(shù)據(jù)的時(shí)候考慮還是不夠全面,以至于測試完并沒有發(fā)現(xiàn)全部問題。</p><p> 對(duì)函數(shù)不夠熟悉,有些系統(tǒng)已有函數(shù)沒有發(fā)現(xiàn),自己寫了一遍
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---利用hash技術(shù)統(tǒng)計(jì)單詞的頻度
- c語言背單詞課程設(shè)計(jì)報(bào)告
- c語言課程設(shè)計(jì)報(bào)告--背單詞
- c語言背單詞課程設(shè)計(jì)報(bào)告
- 聽力答案中單詞出現(xiàn)頻率統(tǒng)計(jì)
- 課程設(shè)計(jì)報(bào)告-利用哈希技術(shù)統(tǒng)計(jì)c源程序關(guān)鍵字出現(xiàn)頻度
- 統(tǒng)計(jì)學(xué)課程設(shè)計(jì)報(bào)告
- 統(tǒng)計(jì)學(xué)課程設(shè)計(jì)報(bào)告
- 統(tǒng)計(jì)學(xué)課程設(shè)計(jì)報(bào)告
- 充分統(tǒng)計(jì)量課程設(shè)計(jì)報(bào)告
- 猜單詞游戲c++課程設(shè)計(jì)報(bào)告
- c語言課程設(shè)計(jì)報(bào)告---背單詞系統(tǒng)
- 課程設(shè)計(jì)報(bào)告——統(tǒng)計(jì)數(shù)字
- 成績統(tǒng)計(jì)程序課程設(shè)計(jì)報(bào)告
- 職工工作量統(tǒng)計(jì)課程設(shè)計(jì)報(bào)告
- 運(yùn)動(dòng)會(huì)分?jǐn)?shù)統(tǒng)計(jì)課程設(shè)計(jì)報(bào)告
- c++猜單詞課程設(shè)計(jì)--——猜單詞游戲
- 單詞出現(xiàn)頻率
- 第二次數(shù)控課程設(shè)計(jì).doc
- 單片機(jī)課程設(shè)計(jì)報(bào)告--投票統(tǒng)計(jì)器
評(píng)論
0/150
提交評(píng)論