文件检索1需求分析1.1 建立文本文件建立文本文件的实现思路(1)定义一个串变量(2)定义文本文件(3)输入文件名,打开该文件(4)循环读入文本行,写入文本文件,其过程如下:While(不是文件输入结束){读入一文本行至串变量;串变量写入文件;输入是否结束输入标志;}(5)关闭文件1.2给定单词的计数该功能需要用到前一节中设计的模式匹配算法,逐行扫描文本文件。
匹配一个,计数器加1,直到整个文件扫描结束;然后输出单词的次数。
1.3 检索单词出现在文本文件中的行号、次数及其位置1.4 主控菜单程序的结构(1)头文件包含(2)菜单选择包括:1、建立文件2、单词计数3、单词定位4、退出程序(3)选择1~4执行相应的操作,其他字符为非法2.概要设计2.流程图2.1建立文本文件定义一个串变量,定义文本文件,输入文件名,打开该文件,循环读入文本行,写入文本文件,关闭文件。
建立文本文件的思路过程2.2给定单词的计数逐行扫描文本文件。
匹配一个,计数器加1,直到整个文件扫描结束;然后输出单词的次数。
给定单词计数的过程2.3检索单词出现在文本文件中的行号、次数及其位置逐行扫描文本文件。
扫描一个单词,单词数加1,匹配一个,计数器加1,输出该单词数,行数到底以此,行数加1,单词数清零,直到整个文件扫描结束;然后输出单词的次数,行号,第几个单词。
检索单词的出现在文本文件中的行号,次数以及位置3详细设计主代码#include<stdio.h>#include<string.h>#define MaxStrSize 256 //根据用户需要自己定义大小typedef struct{char ch[MaxStrSize]; //ch是一个可容纳256个字符的字符数组int length;}SString; //定义顺序串类型int PartPosition(SString s1, SString s2, int k){int i, j;i=k-1; //扫描s1的下标,因为c中数组下标是从0开始,串中序号相差1 j=0; //扫描s2的开始下标while (i<s1.length&&j<s2.length){if(s1.ch[i]==s2.ch[j]){i++;j++; //继续使下标移向下一个字符位置}else{i=i-j+1;j=0;}}if(j>=s2.length)return i-s2.length;elsereturn -1; //表示s1中不存在s2,返回-1//表示s1中不存在s2,返回其起始位置} //函数结束void CreatTextFile(){SString S;char fname[10], yn;FILE *fp;printf("输入要建立的文件名:");scanf("%s", fname);fp=fopen(fname,"w");yn='n'; //输入结束标志初值while(yn=='n'||yn=='N'){printf("请输入一行文本:");gets(S.ch);gets(S.ch);S.length=strlen(S.ch);fwrite(&S, S.length, 1, fp);fprintf(fp,"%c", 10); //是输入换行printf("结束输入吗?y or n: ");yn=getchar();}fclose(fp); //关闭文件printf("建立文件结束!");}void SubStrCount(){FILE *fp;SString S,T; //定义两个串变量char fname[10];int i=0,j,k;printf("输入文本文件名:");scanf("%s", fname);fp=fopen(fname ,"r");printf("输入要统计技术的单词:");scanf("%s", T.ch);T.length=strlen(T.ch);while(!feof(fp)){ //扫描整个文件文本//fread(&S.ch,1,sizeof(S),fp); //读入一行文本memset(S.ch,'\0', 256);fgets(S.ch,100,fp);S.length=strlen(S.ch);k=0; //初始化开始检索位置while(k<S.length-1) //检索整个主串S{j=PartPosition(S,T,k);if(j<0)break;else{i++; //单词计数器加1k=j+T.length; //继续下一字串的检索}}}printf("\n单词%s在文本文件%s中共出现%d次\n", T.ch, fname,i);} //统计单词出现个数void SubStrInd(){FILE *fp;SString S,T; //定义两个串变量char fname[10];int i,j,k,l,m;int wz[20];printf("输入文本文件名:");scanf("%s", fname);fp=fopen(fname,"r");printf("输入要检索的单词:");scanf("%s", T.ch);T.length=strlen(T.ch);l=0;while(!feof(fp)){//fread(&S, sizeof(S), 1, fp);//读入一行文本memset(S.ch,'\0', 256);fgets(S.ch,256,fp);S.length=strlen(S.ch);l++;k=0;i=0;while(k<S.length-1){j=PartPosition(S,T,k);if(j<0)break;else{i++;wz[i]=j;k=j+T.length;}}if(i>0){printf("行号:%d , 次数:%d, 位置分别为:",l, i);for(m=1;m<=i;m++)printf("%4d", wz[m]+1);printf("\n");}}}int main(){void CreatTextFlie(), SubStrInd();int xz;do{printf("****************************************\n");printf("*文本文件的检索、字符串的统计及定位*****\n");printf("****************************************\n");printf("* 1.建立文本文件*\n");printf("* 2.单词字符串的计数*\n");printf("* 3.单词字符串的定位*\n");printf("* 4.退出程序*\n");printf("****************************************\n");printf(" 请选择(1——4)\n");scanf("%d", &xz);switch(xz){case 1:CreatTextFile(); break;case 2:SubStrCount(); break;case 3:SubStrInd(); break;case 4:return 0;default: printf("选择错误,重新选\n");}}while(1);}4调试分析4.1未输入文件前的页面4.2输入文本文件,计数单词出现的次数4.3检索某单词的行号,出现次数,以及位置5课程总结经过一周的奋斗,这次数据结构的课程设计终于做完了。
通过这次设计我们也着实又感受了一次编程的乐趣,从中也学到了不少知识。
感受最深的一点是:以前用编程,只是注重如何编写函数能够完成所需要的功能,似乎没有明确的战术,只是凭单纯的意识和简单的语句来堆砌出一段程序。
现在编程感觉完全不同了。
在编写一个程序之前,先对这个课程设计进行了一下分析,将每个要求都花了一下算法流程图,使得自己的思路更加的清晰了。
然后进行编程,不断的在电脑上调试程序,终于完成了此次的课程设计。
另外,我还体会到深刻理解数据结构的重要性。
只有真正理解这样定义数据类型的好处,才能用好这样一种数据结构。
了解典型数据结构的性质是非常有用的,它往往是编写程序的关键。
通过这次课程设计逐渐提高了自己的程序设计和调试能力,我以前对算法一直很害怕,总是看不明白究竟这程序中间的过程是怎么进行的。
在这次实验中我终于克服了这一障碍,一遍遍在心中自己默默的走,终于弄明白了,真的是功夫不负有心人啊!这次试验也让我看到了自己的不足,还是不太用模板类。
还有许多关于C语言的一些比较具体的东西还不太懂,需要进一步了解。
这次试验还让我意识到只。