建立文本的检索与计数_第1页
建立文本的检索与计数_第2页
建立文本的检索与计数_第3页
建立文本的检索与计数_第4页
建立文本的检索与计数_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 吕超 文本文件单词的检索与计数 第页 共25页 1 引 言本程序主要实现文本文件单词的检索与计数,正文包括:对文本文件单词的检索与计数程序的详细要求,对程序的分析,勾画程序思路及内容的流程图,程序代码,程序运行相关的截图,以及我们在本次程序中的详细分工和收获。1.1 课程设计目的在本程序设计中,主要通过给定位置的串匹配算法,实现文本文件单词的查找,计数和记录单词的位置和行号。在C程序设计中我们对于算法的具体实现过程有一个深刻的理解,除了算法本身外,须借助一些辅助数据结构,在本程序中借用字符串对数据进行存储和输出操作。通过循环比较的方法,查找出单词的个数和位置。同时培养自己的算法设计和算法分析

2、能力,提高综合运用所学的理论知识和方法独立分析和解决问题的能力。训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的工作方法、作风和相互合作的精神。1.2 课程设计内容及要求要求编程建立一个文本文件,每个单词不包含空格且不跨行,单词由字符序列构成且区分大小写;统计给定单词在文本文件中出现的总次数;检索输出某个单词出现在文本中的行号、在该行中出现的次数以及位置。该设计要求可分为三个部分实现:其一,建立文本文件,文件名由用户用键盘输入;其二,给定单词的计数,输入一个不含空格的单词,统计输出该单词在文本中的出现次数;其三,检索给定单词,输入一个单词,检索并输出该单词所在的行号、该

3、行中出现的次数以及在该行中的相应位置。 (1)建立文本文件。 (2)给定单词的计数。 (3)检索单词出现在文本文件中的行号、次数及其位置。 (4)主控菜单程序的结构。 头文件包含。 菜单选项包含:建立文件、单词定位、单词计数、退出程序。 选择1-4执行相应的操作,其他字符为非法。2 设计思路与方案2.1 课程设计思路 课程设计要求是实现文本文件单词的检索与计数,所以主要从两大块进行程序设计,一是单词的计数和检索的程序设计,二是文本文件写入字符串的程序设计。 进行单词计数和检索的程序设计时,首先用结构体定义字符串,然后再考虑通过母串代表文件文本,用子串代表单词,然后通过母串和子串的循环比较,确定

4、母串是否存在子串,子串出现的次数以及位置。用j表示子串开始比较的位置,用i表示比较过程子串中字母的位置,通过j和i的累加,循环比较字符是否相等。最后通过j与子串长度的大小关系,判断母串中是否存在子串以及存在的位置和次数。 对于文本单词的检索与计数的程序设计,分为两部分。第一部分是通过调用fget将文本写入字符串数组,然后调用串匹配函数,查找显示单词在文本中出现的次数;第二部分是通过fget将文本写入字符串数组然后调用串匹配函数,查找显示单词在文本中出现的次数然后根据sub数组输入单词出现的位置。2.2 程序所用的功能函数 程序设计当中涉及到的功能函数较多,具体如下表2-1所示: 表2-1 功能

5、函数列表函数名功能描述void CreateTextFile()建立文本文件函数void SubStrCount()文本文件单词计数函数void SubStrInd()检索单词出现在文本文件中的行号、位置及出现的次数Int PartPosition()给定位置的串匹配2.3 课程设计流程图 主函数设计流程如图2.1: 图2.1 程序流程图串匹配设计流程如图2.2:图2.2程序流程图3 详细实现3.1 数据结构体设计定义结构体typedef struct char SsMaxStrSize; /Ss是一个可容纳1024个字符的字符数组 int length; SeqString; /定义顺序串类

6、型3.2 功能函数实现(1)给定位置的串匹配:int PartPosition(SeqString S,SeqString T,int k)将T字符数组中的从0开始与S字符数组的字符逐一比较。当j大于等于T.length时表示S字符数组中存在T字符数组,返回T字符数组开始的位置。否则说明S字符数组中没有T字符数组。(2)建立文本文件函数:void CreateTextFile()用C语言I/O流输入名字建立一个文件。(3)文本文件单词计数函数:void SubStrCount()将文件字符串写入一个数组。调用给定为位置的串匹配,查找记录单词个数。(4)检索单词出现在文本文件中的行号、位置及在该

7、行中出现的次数:void SubStrInd()将文件字符串写入一个数组。调用给定为位置的串匹配,记录单词个数,出现的位置。3.3 函数分析 (1)int PartPosition(SeqString S,SeqString T,int k) 本函数的作用是给定位置的串匹配,存在就返回子串的位置。不存在返回-1int PartPosition(SeqString S,SeqString T,int k) int i,j; i=k-1; j=0; while(i<S.length && j<T.length) if(S.Ssi=T.Ssj) i+; j+; else

8、i=i-j+1; j=0; if(j>=T.length) return i-T.length; else return -1; (2)void CreateTextFile()本函数的作用是输入一个名称,建立文本文件void CreateTextFile() SeqString S; char filename10,flags; FILE *fp; printf("输入要建立的文件名:"); scanf(" %s",filename); fflush(stdin); fp=fopen(filename,"w"); flags=

9、'n' while(flags='n'|flags='N') printf("输入一行文本:"); gets(S.Ss); fflush(stdin); S.length=strlen(S.Ss); fwrite(&S,S.length,1,fp); printf("结束输入吗? <Y/N>:"); flags=getchar(); fflush(stdin); fclose(fp); printf("建立文件结束!n");(3) void SubStrCount()

10、 本函数的作用是将void CreateTextFile()中输入的字符串,写入一个数组。然后调用int PartPosition(SeqString S,SeqString T,int k)函数记录要查找的单词出现的次数。void SubStrCount() FILE *fp=NULL; SeqString S,T; char filename20; int i=0,j,k; while(true) printf("输入文本文件名:"); scanf("%s",filename); fp=fopen(filename,"r"); i

11、f(fp=NULL) printf("输入文件名不存在。n"); else break; printf("输入要统计计数的单词:"); scanf(" %s",T.Ss); T.length=strlen(T.Ss); while(!feof(fp) memset(S.Ss,'0',MaxStrSize); fgets(S.Ss,MaxStrSize,fp); S.length=strlen(S.Ss); k=1; while(k<S.length-1) j=PartPosition(S,T,k); if(j&l

12、t;0) break; else i+; k=j+T.length; printf("n单词%s在文本文件%s中共出现%d次n",T.Ss,filename,i);(4)void SubStrInd()本函数的作用是本函数的作用是将void CreateTextFile()中输入的字符串,写入一个数组。然后调用int PartPosition(SeqString S,SeqString T,int k)函数记录要查找的单词出现在文本文件中的行号、位置及在该行中出现的次数void SubStrInd() FILE *fp; SeqString S,T; char filena

13、me10; int i,j,k,line,m; int Sub20; while(true) printf("输入文本文件名:"); scanf("%s",filename); fp=fopen(filename,"r"); if(fp=NULL) printf("输入文件名不存在。n"); else break; printf("输入需要检索的单词:"); scanf(" %s",T.Ss); T.length=strlen(T.Ss); line=0; while(!fe

14、of(fp) memset(S.Ss,'0',MaxStrSize); fgets(S.Ss,MaxStrSize,fp); S.length=strlen(S.Ss); line+; k=1; i=0; while(k<S.length-1) j=PartPosition(S,T,k); if(j<0) break; else i+; Subi=j; k=j+T.length; if(i>0) printf("行号:%d,次数:%d,位置分别为:",line,i); for(m=1;m<=i;m+) printf("%4d

15、",Subm); printf("n"); 4 运行环境与结果4.1 运行环境系统开发平台为Windows8,程序设计工具使用codeblocks_13.12,程序设计语言采用C语言。程序完成后,对程序进行调试与改进。4.2 运行结果4.2.1 进入程序时的菜单,供选择,如图4.1。图4.1 开始菜单4.2.2 选择1,输入名称和数据,如图4.2。 图4.2 输入数据4.2.3 选择2,输入要查找的单词,输出单词出现的次数,如图4.3。图4.3 查找单词的次数4.2.4 选择4,输入要查找的单词,输出单词的位置,如图4.4。图4.4 查找单词的位置4.2.5 结束

16、程序,如图4.5。图4.5 结束程序5 结束语 一周的奋斗之后,这次数据结构的课程设计终于做完了。通过这次设计我们也着实又感受了一次编程的乐趣,从中也学到了不少知识。 感受最深的一点是:以前用编程,只是注重如何编写函数能够完成所需要的功能,似乎没有明确的战术,只是凭单纯的意识和简单的语句来堆砌出一段程序。现在编程感觉完全不同了。在编写一个程序之前,先对这个课程设计进行了一下分析,将每个要求都花了一下算法流程图,使得自己的思路更加的清晰了。然后进行编程,不断的在电脑上调试程序,终于完成了此次的课程设计。  另外,我还体会到深刻理解数据结构的重要性。只有真正理解这样定义数据类型

17、的好处,才能用好这样一种数据结构。了解典型数据结构的性质是非常有用的,它往往是编写程序的关键。 本次实验的具体分工为伍澳奇负责PartPosition()函数和主函数的设计,吕超负责SubStrCount()函数的设计,李成负责SubStrInd()函数的设计,设计报告由我们共同讨论总结而来。通过这次合作让我们学习了软件开发中的多人合作开发的好处和需要注意的东西。通过这次课程设计逐渐提高了自己的程序设计和调试能力,我以前对算法一直很害怕,总是看不明白究竟这程序中间的过程是怎么进行的。在这次实验中我终于克服了这一障碍,一遍遍在心中自己默默的走,终于弄明白了,真的是功夫不负有心人啊!&#

18、160; 这次试验也让我看到了自己的不足,还是不太用模板类。还有许多关于C语言的一些比较具体的东西还不太懂,需要进一步了解。这次试验还让我意识到只有不断的在电脑上调试程序,自己的水平才能得到提高。我会继续我们的兴趣编写程序的,相信在越来越多的尝试之后,自己会不断进步和提高。 参考文献1严蔚敏,吴伟名.数据结构(C语言版).北京:清华大学出版社,2007.2谭浩强. C语言程序设计(第四版).北京:清华大学出版社,2010.3Mark Allen Weiss著.冯舜玺译. 数据结构与算法分析-C语言描述.北京:机械工业出版社,2004附录:结构化设计源程序清单/程序名称:wen.C/

19、程序功能:采用结构化方法设计程序,实现单词的检索与计数/ 程序作者:吕超/ 最后修改日期:2014-7-1#include<stdio.h>#include<string.h>#include<stdlib.h>#define MaxStrSize 2048 /根据用户需要自己定义大小#define true 1 /定义true=1#define false 0 /定义false=0typedef struct char SsMaxStrSize; /Ss是一个可容纳1024个字符的字符数组 int length; SeqString; /定义顺序串类型 /

20、函数声明void CreateTextFile();void SubStrCount();void SubStrInd();/主函数int main() void CreateTextFile(); void SubStrCount(); void SubStrInd(); char choose; printf("*n"); printf("* 文本文件单词的检索与计数 *n"); printf("*n"); printf("* 1.建立文本文件 *n"); printf("* 2.单词的计数 *n&q

21、uot;); printf("* 3.单词的定位 *n"); printf("* 4.退出程序 *n"); printf("*n"); while(true) /只能输入数字1-4。输入其他重新输入 printf("*-*n"); printf("*请选择(1-4):"); scanf(" %c",&choose); if(choose='1') CreateTextFile(); else if(choose='2') SubStrC

22、ount(); else if(choose='3') SubStrInd(); else if(choose='4') printf("程序结束,正在退出。"); return 0; else printf("选择错误!请重新选n"); /给定位置的串匹配int PartPosition(SeqString S,SeqString T,int k) /S为母串。T为子串 int i,j; i=k-1; /扫描S的下标,因为S中数组下标是从0开始,串中序号相差1 j=0; /扫描T的开始下标 while(i<S.le

23、ngth && j<T.length) /当i小于母串的长度。j小于子串的长度 if(S.Ssi=T.Ssj) i+; j+; /继续使下标移向下一个字符位置 else i=i-j+1; /使i下标回溯到原位置的下一个位置 j=0; /使j指向T的第一个字符,再重新比较 if(j>=T.length) return i-T.length; /表示S中存在T,返回其起始位置 else return -1; /表示S中不存在T,返回-1/建立文本文件函数void CreateTextFile() SeqString S; char filename10,flags; /

24、flags : Yes或是No 的标志 FILE *fp; printf("输入要建立的文件名:"); scanf(" %s",filename); fflush(stdin); /清理缓存 fp=fopen(filename,"w"); flags='n' /输入结束标志初值 while(flags='n'|flags='N') printf("输入一行文本:"); gets(S.Ss); fflush(stdin); /清理缓存 S.length=strlen(S

25、.Ss); fwrite(&S,S.length,1,fp); printf("结束输入吗? <Y/N>:"); flags=getchar(); fflush(stdin); /清理缓存 fclose(fp); /关闭文件 printf("建立文件结束!n");/文本文件单词计数函数void SubStrCount() FILE *fp=NULL; SeqString S,T; /定义两个变量,S为母串。T为子串 char filename20; int i=0,j,k; while(true) /对filename进行判断是否存在

26、 printf("输入文本文件名:"); scanf("%s",filename); fp=fopen(filename,"r"); if(fp=NULL) printf("输入文件名不存在。n"); else break; printf("输入要统计计数的单词:"); scanf(" %s",T.Ss); T.length=strlen(T.Ss); while(!feof(fp) /扫描整个文本文件 memset(S.Ss,'0',MaxStrSize); fgets(S.Ss,MaxStrSize,fp); /将fp以字符串读入s S.length=strlen(S.Ss); k=1; /初始化开始检索位置 while(k<S.length-1) /检索整个主串S j=PartPosition(S,T,k); /调用串匹配函数 if(j<0) break; else i+; /单词计数器加1 k=j+T.length; /继续下一个子串的检索 printf("n单词%s在文本

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论