文本文件资料单词地检索与计数课程设计实验报告材料.docx
《文本文件资料单词地检索与计数课程设计实验报告材料.docx》由会员分享,可在线阅读,更多相关《文本文件资料单词地检索与计数课程设计实验报告材料.docx(14页珍藏版)》请在冰豆网上搜索。
文本文件资料单词地检索与计数课程设计实验报告材料
文件检索
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执行相应的操作,其他字符为非法
1.
共0条评论...
2.概要设计
2.流程图
2.1建立文本文件
定义一个串变量,定义文本文件,输入文件名,打开该文件,循环读入文本行,写入文本文件,关闭文件。
建立文本文件的思路过程
2.2给定单词的计数
逐行扫描文本文件。
匹配一个,计数器加1,直到整个文件扫描结束;然后输出单词的次数。
给定单词计数的过程
2.3检索单词出现在文本文件中的行号、次数及其位置
逐行扫描文本文件。
扫描一个单词,单词数加1,匹配一个,计数器加1,输出该单词数,行数到底
以此,行数加1,单词数清零,直到整个文件扫描结束;然后输出单词的次数,行号,第几个单词。
检索单词的出现在文本文件中的行号,次数以及位置
3详细设计
主代码
#include
#include
#defineMaxStrSize256//根据用户需要自己定义大小
typedefstruct
{
charch[MaxStrSize];//ch是一个可容纳256个字符的字符数组
intlength;
}SString;//定义顺序串类型
intPartPosition(SStrings1,SStrings2,intk)
{
inti,j;
i=k-1;//扫描s1的下标,因为c中数组下标是从0开始,串中序号相差1
j=0;//扫描s2的开始下标
while(i{
if(s1.ch[i]==s2.ch[j])
{
i++;
j++;//继续使下标移向下一个字符位置
}
else
{
i=i-j+1;
j=0;
}
}
if(j>=s2.length)
returni-s2.length;
else
return-1;//表示s1中不存在s2,返回-1
//表示s1中不存在s2,返回其起始位置
}//函数结束
voidCreatTextFile()
{
SStringS;
charfname[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("结束输入吗?
yorn:
");
yn=getchar();
}
fclose(fp);//关闭文件
printf("建立文件结束!
");
}
voidSubStrCount()
{
FILE*fp;
SStringS,T;//定义两个串变量
charfname[10];
inti=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{
j=PartPosition(S,T,k);
if(j<0)
break;
else
{
i++;//单词计数器加1
k=j+T.length;//继续下一字串的检索
}
}
}printf("\n单词%s在文本文件%s中共出现%d次\n",T.ch,fname,i);
}//统计单词出现个数
voidSubStrInd()
{
FILE*fp;
SStringS,T;//定义两个串变量
charfname[10];
inti,j,k,l,m;
intwz[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{
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");
}
}
}
intmain()
{
voidCreatTextFlie(),SubStrInd();
intxz;
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)
{
case1:
CreatTextFile();break;
case2:
SubStrCount();break;
case3:
SubStrInd();break;
case4:
return0;
default:
printf("选择错误,重新选\n");
}
}while
(1);
}
4调试分析
4.1未输入文件前的页面
4.2输入文本文件,计数单词出现的次数
4.3检索某单词的行号,出现次数,以及位置
5课程总结
经过一周的奋斗,这次数据结构的课程设计终于做完了。
通过这次设计我们也着实又感受了一次编程的乐趣,从中也学到了不少知识。
感受最深的一点是:
以前用编程,只是注重如何编写函数能够完成所需要的功能,似乎没有明确的战术,只是凭单纯的意识和简单的语句来堆砌出一段程序。
现在编程感觉完全不同了。
在编写一个程序之前,先对这个课程设计进行了一下分析,将每个要求都花了一下算法流程图,使得自己的思路更加的清晰了。
然后进行编程,不断的在电脑上调试程序,终于完成了此次的课程设计。
另外,我还体会到深刻理解数据结构的重要性。
只有真正理解这样定义数据类型的好处,才能用好这样一种数据结构。
了解典型数据结构的性质是非常有用的,它往往是编写程序的关键。
通过这次课程设计逐渐提高了自己的程序设计和调试能力,我以前对算法一直很害怕,总是看不明白究竟这程序中间的过程是怎么进行的。
在这次实验中我终于克服了这一障碍,一遍遍在心中自己默默的走,终于弄明白了,真的是功夫不负有心人啊!
这次试验也让我看到了自己的不足,还是不太用模板类。
还有许多关于C语言的一些比较具体的东西还不太懂,需要进一步了解。
这次试验还让我意识到只有不断的在电脑上调试程序,自己的水平才能得到提高。
我会继续我们的兴趣编写程序的,相信在越来越多的尝试之后,自己会不断进步和提高。
在此我要感谢尹四清老师和薛海丽老师在数据结构及课程设计中对我们的指引和帮助。