1 引言本程序主要实现文本文件单词的检索与计数,正文包括:对文本文件单词的检索与计数程序的详细要求,对程序的分析,勾画程序思路及内容的流程图,程序代码,程序运行相关的截图,以及我们在本次程序中的详细分工和收获。
1.1课程设计目的在本程序设计中,主要通过给定位置的串匹配算法,实现文本文件单词的查找,计数和记录单词的位置和行号。
在C程序设计中我们对于算法的具体实现过程有一个深刻的理解,除了算法本身外,须借助一些辅助数据结构,在本程序中借用字符串对数据进行存储和输出操作。
通过循环比较的方法,查找出单词的个数和位置。
同时培养自己的算法设计和算法分析能力,提高综合运用所学的理论知识和方法独立分析和解决问题的能力。
训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的工作方法、作风和相互合作的精神。
1.2课程设计内容及要求要求编程建立一个文本文件,每个单词不包含空格且不跨行,单词由字符序列构成且区分大小写;统计给定单词在文本文件中出现的总次数;检索输出某个单词出现在文本中的行号、在该行中出现的次数以及位置。
该设计要求可分为三个部分实现:其一,建立文本文件,文件名由用户用键盘输入;其二,给定单词的计数,输入一个不含空格的单词,统计输出该单词在文本中的出现次数;其三,检索给定单词,输入一个单词,检索并输出该单词所在的行号、该行中出现的次数以及在该行中的相应位置。
(1)建立文本文件。
(2)给定单词的计数。
(3)检索单词出现在文本文件中的行号、次数及其位置。
(4)主控菜单程序的结构。
①头文件包含。
②菜单选项包含:建立文件、单词定位、单词计数、退出程序。
③选择1-4执行相应的操作,其他字符为非法。
2 设计思路与方案2.1课程设计思路课程设计要求是实现文本文件单词的检索与计数,所以主要从两大块进行程序设计,一是单词的计数和检索的程序设计,二是文本文件写入字符串的程序设计。
进行单词计数和检索的程序设计时,首先用结构体定义字符串,然后再考虑通过母串代表文件文本,用子串代表单词,然后通过母串和子串的循环比较,确定母串是否存在子串,子串出现的次数以及位置。
用j表示子串开始比较的位置,用i表示比较过程子串中字母的位置,通过j和i的累加,循环比较字符是否相等。
最后通过j与子串长度的大小关系,判断母串中是否存在子串以及存在的位置和次数。
对于文本单词的检索与计数的程序设计,分为两部分。
第一部分是通过调用fget将文本写入字符串数组,然后调用串匹配函数,查找显示单词在文本中出现的次数;第二部分是通过fget将文本写入字符串数组然后调用串匹配函数,查找显示单词在文本中出现的次数然后根据sub数组输入单词出现的位置。
2.2程序所用的功能函数程序设计当中涉及到的功能函数较多,具体如下表2-1所示:表2-1功能函数列表2.3 课程设计流程图主函数设计流程如图2.1:图2.1程序流程图串匹配设计流程如图2.2:图2.2程序流程图3详细实现3.1数据结构体设计定义结构体typedef struct{char Ss[MaxStrSize]; //Ss是一个可容纳1024个字符的字符数组int length;} SeqString; //定义顺序串类型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)检索单词出现在文本文件中的行号、位置及在该行中出现的次数:void SubStrInd()将文件字符串写入一个数组。
调用给定为位置的串匹配,记录单词个数,出现的位置。
3.3函数分析(1)int PartPosition(SeqString S,SeqString T,int k)本函数的作用是给定位置的串匹配,存在就返回子串的位置。
不存在返回-1 int PartPosition(SeqString S,SeqString T,int k){int i,j;i=k-1;j=0;while(i<S.length && j<T.length){if(S.Ss[i]==T.Ss[j]){i++;j++;}else{i=i-j+1;j=0;}}if(j>=T.length)return i-T.length;elsereturn -1;}(2)void CreateTextFile()本函数的作用是输入一个名称,建立文本文件void CreateTextFile(){SeqString S;char filename[10],flags;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.Ss);fwrite(&S,S.length,1,fp);printf("结束输入吗? <Y/N>:");flags=getchar();fflush(stdin);}fclose(fp);printf("建立文件结束!\n");}(3) void SubStrCount()本函数的作用是将void CreateTextFile()中输入的字符串,写入一个数组。
然后调用int PartPosition(SeqString S,SeqString T,int k)函数记录要查找的单词出现的次数。
void SubStrCount(){FILE *fp=NULL;SeqString S,T;char filename[20];int i=0,j,k;while(true){printf("输入文本文件名:");scanf("%s",filename);fp=fopen(filename,"r");if(fp==NULL){printf("输入文件名不存在。
\n");}elsebreak;}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<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 filename[10];int i,j,k,line,m;int Sub[20];while(true){printf("输入文本文件名:");scanf("%s",filename);fp=fopen(filename,"r");if(fp==NULL){printf("输入文件名不存在。
\n");}elsebreak;}printf("输入需要检索的单词:");scanf(" %s",T.Ss);T.length=strlen(T.Ss);line=0;while(!feof(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++;Sub[i]=j;k=j+T.length;}}if(i>0)printf("行号:%d,次数:%d,位置分别为:",line,i);for(m=1;m<=i;m++)printf("%4d",Sub[m]);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结束程序,如图4.5。
图4.5 结束程序5结束语一周的奋斗之后,这次数据结构的课程设计终于做完了。
通过这次设计我们也着实又感受了一次编程的乐趣,从中也学到了不少知识。
感受最深的一点是:以前用编程,只是注重如何编写函数能够完成所需要的功能,似乎没有明确的战术,只是凭单纯的意识和简单的语句来堆砌出一段程序。