數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-文本文件單詞檢索和計數(shù)_第1頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-文本文件單詞檢索和計數(shù)_第2頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-文本文件單詞檢索和計數(shù)_第3頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-文本文件單詞檢索和計數(shù)_第4頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-文本文件單詞檢索和計數(shù)_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、合肥學(xué)院計算機(jī)科學(xué)與技術(shù)系課程設(shè)計報告20172018學(xué)年 第二學(xué)期課程 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計名稱文本文件單詞的檢索與計數(shù)學(xué)生姓名陳映而 學(xué)號1604092001專業(yè)班級16軟件工程(1)班指導(dǎo)教師孫斐 文本文件單詞的檢索與計數(shù)一、問題分析和任務(wù)定義要求編程建立一個文本文件,每個單詞不包含空格且不跨行,單詞由字符序列構(gòu)成且區(qū)分大小寫;統(tǒng)計給定單詞在文本文件中出現(xiàn)的總次數(shù);檢索輸出某個單詞出現(xiàn)在文本中的行號、在該行中出現(xiàn)的次數(shù)以及位置。(1)建立文本文件(2)給定單詞的計數(shù)(3)檢索單詞出現(xiàn)在文本文件中的行號、次數(shù)及其位置(4)主控菜單程序的結(jié)構(gòu)二、數(shù)據(jù)結(jié)構(gòu)的選擇和概要設(shè)計數(shù)據(jù)結(jié)構(gòu):1.所有存

2、儲形式都用順序存儲 2.用矩陣檢索單詞出現(xiàn)的位置和次數(shù)概要設(shè)計:該設(shè)計要求可分為三個部分實現(xiàn):1.對文件的操作,其中包括文本文檔的建立,文件名由用戶用鍵盤輸入;以及讀取文本文檔內(nèi)容并顯示在屏幕上;2.給定單詞的計數(shù),輸入一個不含空格的單詞,統(tǒng)計輸出該單詞在文本中的出現(xiàn)次數(shù);3.檢索給定單詞,輸入一個單詞,檢索并輸出該單詞所在的行號、該行中出現(xiàn)的次數(shù)以及在該行中的相應(yīng)位置。圖2-1 課題目錄開始輸入numbernumber顯示主菜單n=1?YNn=2?YNn=3?YNn=4?Y結(jié)束文件操作單詞定位輸入numbernumbern=1?單詞計數(shù)Y創(chuàng)建文件內(nèi)容顯示N主菜單n=2?YNn=3?Y寫入文本

3、N返回主菜單圖2-2 流程圖圖2-3 函數(shù)關(guān)系三、詳細(xì)設(shè)計和編碼1.頭文件包含:#include<stdio.h>#include<stdlib.h>#include<string.h>2.功能細(xì)分(1)創(chuàng)建自定義名字文檔用字符數(shù)組filename存放特定的文件路徑(D:Dev-Cpp課程設(shè)計數(shù)據(jù))從鍵盤輸入自定義的文檔名字name,把name和“.txt”用strcat連接再用strcat把路徑filename與文檔名name連接起來打開文件時用變量(filename)表示文件名,若無該文件則創(chuàng)建圖3-1 創(chuàng)建自定義名字文檔編碼(2)打開文件讀取內(nèi)容并輸出

4、輸入文檔名字,根據(jù)名字打開文件打開文件后,用fgets讀取文檔內(nèi)容fgets讀取一行輸出一行,并用i記錄行數(shù)fgets返回EOF(END OF FILE)表示文件結(jié)尾(3)寫入文本輸入文檔名字,根據(jù)名字打開文檔,若無該文檔,則重新建立一個。根據(jù)提示,從鍵盤輸入字符,最后以0結(jié)束用字符變量ch接收字符,并用fputc()把字符輸出到文本文檔中圖3-2 寫入文檔編碼(4)單詞的計數(shù)輸入文檔名字,根據(jù)名字打開文件根據(jù)提示輸入單詞用ch遍歷文本文檔把空格前的單詞與給定單詞比較,若相同則count+若不相同則重新開始比較(5)獲取文件的行數(shù)輸入單詞獲取文本行數(shù):根據(jù)n判斷,由于有些行是空行,無法算作一行

5、,所以要判斷n后一個字符是不是也是n 若是兩個連續(xù)的n,則line-1; 若不是,則line+1;判斷方法:當(dāng)ch1為n時,把ch1賦值給ch2,ch1繼續(xù)獲取下一個字符,若ch1=ch2,則line-1;圖3-3 獲取文件行數(shù)編碼(6)矩陣存儲單詞檢索輸入單詞邊統(tǒng)計邊判斷統(tǒng)計:定義一個二維數(shù)組a,所有位置的初始值為-1 遍歷文本文件時,在遇到第一個n前為第一行,遇到第一個空格前為第一個單詞,即a00位置上的-1變?yōu)?,依次類推把每個單詞與給定單詞作比較,若該單詞與給定單詞相同,則該單詞位置上的0的值變?yōu)?統(tǒng)計每一行值為1的數(shù)的個數(shù),為給定單詞在該行中出現(xiàn)的次數(shù); 輸出每一行為1的數(shù)的列的值,

6、即為給定單詞在該行中出現(xiàn)的位置;把行列數(shù)的值賦給矩陣的s,v;用循環(huán),把數(shù)組中所有值為1的數(shù)的位置存儲在矩陣的word(y,z)中,并且計算每行為1的總數(shù)count+;圖3-4 矩陣的結(jié)構(gòu)體類型圖3-5 單詞的位置、個數(shù)的輸出四、上機(jī)調(diào)試過程1.輸出文檔內(nèi)容時,fgets()不能用EOF判斷是否到達(dá)結(jié)尾,若把EOF換作null,但由于單詞與單詞之間有空格,無法正確顯示。解決:用fgetc讀取每個字符存放于ch中,當(dāng)ch!=EOF的時候,就可以不斷輸出直到文件結(jié)尾,再用len記錄行數(shù),初始值為1,當(dāng)遇到n時則+1。2.單詞的計數(shù)出錯,無法準(zhǔn)確計算出文檔有多少和給定的單詞。解決:在循環(huán)中,判斷ch

7、為空格或轉(zhuǎn)行符號時,要用&&判斷,不能用|,否則將在判斷時出錯在比較過程中,若下一個字符不符合就直接判斷為錯,從i=0重新開始,否則只要單詞中包含給出的單詞都表示正確在比較時還要主要標(biāo)點符號,符號也會影響判斷3.在計算文本文檔行數(shù)的時候,若有空行,也會計算成一行。解決:當(dāng)兩個連續(xù)的轉(zhuǎn)行符號nn在一起時,line應(yīng)該先+1再-1,即不變。 當(dāng)一個轉(zhuǎn)行符號n后不是轉(zhuǎn)行符號,也不是文件結(jié)尾,line+14.標(biāo)點符號后有空格,重復(fù)計算單詞。解決:修改判斷條件,若標(biāo)點符號后是空格,則不計算單詞5.調(diào)試過程中,完成輸入點擊“Enter”后,直接跳過程序進(jìn)行下一步。解決:下一步進(jìn)入該函數(shù)時,

8、程序會自動獲取該Enter鍵,導(dǎo)致函數(shù)直接結(jié)束。因此要用getchar()先獲取該字符,才可以開始執(zhí)行程序。五、測試結(jié)果及其分析圖5-1 程序主菜單圖5-2 功能1 子菜單1.創(chuàng)建文件圖5-3 創(chuàng)建文件成功圖5-4 文檔成功出現(xiàn)在文件夾中2.文檔內(nèi)容顯示圖5-5 abc.txt文檔內(nèi)容圖5-6 abc.txt文檔內(nèi)容顯示在屏幕上3.單詞計數(shù)(1)測試數(shù)據(jù)1文檔:abc.txt給定單詞:you正確數(shù)據(jù):9個檢驗數(shù)據(jù):9個圖5-7 abc.txt中you的單詞總數(shù)(2)測試數(shù)據(jù)2文檔:abc.txt給定單詞:You(與you區(qū)分大小寫)正確數(shù)據(jù):4個檢驗數(shù)據(jù):4個圖5-7 abc.txt中You的

9、單詞總數(shù)(3)測試數(shù)據(jù)3文檔:value.txt給定單詞:it正確數(shù)據(jù):3個檢驗數(shù)據(jù):3個圖5-8 value.txt中it的單詞總數(shù)(4)測試數(shù)據(jù)4文檔:value.txt給定單詞:is正確數(shù)據(jù):4個檢驗數(shù)據(jù):4個圖5-9 value.txt中is的單詞總數(shù)4.單詞定位(1)測試數(shù)據(jù)1文檔:abc.txt給定單詞:you(共9個)圖5-10 abc.txt中you所在的位置和個數(shù)(2)測試數(shù)據(jù)2文檔:value.txt給定單詞:is(共4個)圖5-10 value.txt中is所在的位置和個數(shù)5.時間性能分析程序中對數(shù)據(jù)進(jìn)行順序存儲的時間性能為O(n);但是用矩陣記錄單詞的坐標(biāo)和個數(shù)用了兩層

10、for循環(huán),其時間性能為O(n*n);在對文本文檔進(jìn)行遍歷并輸出,只需要while控制的一層循環(huán),所以其時間性能為O(n);在計算文本文檔的行數(shù)和單詞的個數(shù)的時候,用了多個if-else的判斷,但是仍然只有一層while控制的循環(huán),所以其時間性能為O(n);總結(jié):該程序的時間性能為O(n*n);六、用戶使用說明1.功能敘述創(chuàng)建文本文檔 顯示文本文檔的內(nèi)容統(tǒng)計給定單詞在文本文檔中出現(xiàn)的次數(shù)檢索給定單詞,并輸出其所在的行、列和每行總共出現(xiàn)的次數(shù)2.操作說明由數(shù)字0-9可以選擇不同的功能,以及板塊的退出除數(shù)字以外的符號可以結(jié)束程序(空格鍵和n除外)3.輸入說明本程序涉及文件名字的輸入和單詞的輸入。輸

11、入文件名:文件名由數(shù)字0-9、26個英文字母以及符號-組成;單詞的輸入:字符間不可出現(xiàn)空格,只能用26個英文字母組成,且區(qū)分大小寫七、參考文獻(xiàn)1 王昆侖,李紅. 數(shù)據(jù)結(jié)構(gòu)與算法. 北京:中國鐵道出版社,2006年5月。八、附錄#include<stdio.h>#include<stdlib.h>#include<string.h>#define Max 100void FileOperation();void CreateFile();void Show();void WordCount();voi

12、d Explor();typedef struct int y,z;node;typedef struct int s,v; int countMax; node wordMax;SeqMatrix; int main() /主菜單 int number; printf("*n"); printf("1.文件操作n"); printf("2.單詞計數(shù)n");printf("3.單詞定位n

13、");printf("4.退出程序n");printf("*n");printf("n請輸入功能序號:");scanf("%d",&number);switch(number)case 1: FileOperation();case 2: WordCount();case 3: Explor();default :exit(0);return 0; void FileOperation() 

14、; /文件操作 system("CLS");int number;printf("*n"); printf("1.創(chuàng)建文件n");/printf("2.寫入文件n");printf("2.顯示內(nèi)容n");printf("3.返回n");printf("*n");printf("n請輸入功能序號:");scanf("%d",&number);switch(number)c

15、ase 1: CreateFile();case 2: Show(); case 3: system("CLS");main();default : exit(0);void CreateFile()  /創(chuàng)建文檔 system("CLS"); char filename100="D:Dev-Cpp課程設(shè)計數(shù)據(jù)" /直接把地址賦值進(jìn)數(shù)組中 char name

16、25;FILE *fp;getchar();printf("輸入創(chuàng)建的文件的名字:");gets(name);strcat(name,".txt"); /連接成一個文件名strcat(filename,name);if(fp=fopen(filename,"a+")=NULL)  printf("null"); exit(0);/給文件輸入內(nèi)容 fprintf(fp,"We each dictate what it 

17、is, how it is, and why it is.nnShe is kind, caring, nurturing, and loving.n");printf("創(chuàng)建成功!"); fclose(fp);char ch;printf("n任意值退出,0返回:");ch=getchar();if(ch='0') FileOperation();else exit(0);voi

18、d Show()  /顯示內(nèi)容 system("CLS");char filename100="D:Dev-Cpp課程設(shè)計數(shù)據(jù)"  char name25;FILE *fp;char ch;/int len=1;getchar();printf("輸入打開的文件的名字:");gets(name); /輸入文件名strcat(name,".txt"); /連接成一個文件名strcat(fi

19、lename,name);if(fp=fopen(filename,"r")=NULL) printf("找不到該文件!n"); Show(); ch=fgetc(fp);  /獲取每個字符 while(ch!=EOF) putchar(ch); /輸出在屏幕 /*if(ch='n') len+; */ ch=fgetc(fp);fclose(fp);char c;printf("n任意值結(jié)束,0返回:");c=getchar();if(c='0

20、9;) FileOperation();else exit(0); void WordCount() /單詞計數(shù) getchar();system("CLS"); char filename100="D:Dev-Cpp課程設(shè)計數(shù)據(jù)"char name25;char character10;FILE *fp;char ch;int count=0; int len;char c;printf("請輸入文本文件

21、名:");gets(name);strcat(name,".txt");strcat(filename,name);if(fp=fopen(filename,"r")=NULL) printf("找不到該文件n"); main(); printf("n請輸入要計數(shù)的單詞:");gets(character);len=strlen(character);/len-1表示這個單詞的大小 int i=0,k=0; ch=fgetc(fp);while(ch!=EOF) i

22、f(ch!=' '&&ch!='n'&&ch!=','&&ch!='.'&&ch!='?'&&ch!='!') if(ch=characteri) /字符相等  i+;  k+; ch=fgetc(fp);  else if(i=len&&i=k) /k是讀取的單詞中字母的序號,i是相同字符的個數(shù) ,len是給定單詞長度  c

23、ount+; i=0;k=0; ch=fgetc(fp); if(ch=EOF&&i=len&&i=k) count+;printf("單詞總數(shù)為:%d",count);fclose(fp);printf("n任意值結(jié)束,0返回:");c=getchar();if(c='0') system("CLS");  main();else exit(0); void Explor() /單詞檢索 char filename100=&q

24、uot;D:Dev-Cpp課程設(shè)計數(shù)據(jù)" /文件路徑 char name25; /文件名 char character10; /給定單詞 FILE *fp;char ch,ch2,c;  int a2030;int i,j,k,x;int len; /單詞的長度 getchar();system("CLS");for(i=0;i<20;i+) for(j=0;j<30;j+) aij=

25、-1; printf("請輸入文本文件名:");gets(name);strcat(name,".txt");strcat(filename,name);if(fp=fopen(filename,"r")=NULL) printf("找不到該文件n"); main(); printf("n請輸入要計數(shù)的單詞:");gets(character);len=strlen(character);/len-1表示這個單詞的大小 i=0,j=0,k=0,x=0;  

26、/i為行 j為列  k用于判斷 ch=fgetc(fp);while(ch!=EOF) if(ch!=' '&&ch!='n'&&ch!=','&&ch!='.'&&ch!='?'&&ch!='!'&&ch!=':') /printf(" %c",ch); if(ch=characterk) /字符相等  k+; x+; /printf("%d,%d",k,x);  ch=fgetc(fp);   /

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論