文学研究助手与模式匹配算法KMPWord格式.docx
- 文档编号:17873527
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:11
- 大小:65.41KB
文学研究助手与模式匹配算法KMPWord格式.docx
《文学研究助手与模式匹配算法KMPWord格式.docx》由会员分享,可在线阅读,更多相关《文学研究助手与模式匹配算法KMPWord格式.docx(11页珍藏版)》请在冰豆网上搜索。
试写一个实现这一目标的文字统计系统
【任务要求】
英文小说存于一个文本文件中。
待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。
程序的输出结果是每个词的出现次数和出现位置所在的行的行号,格式自行设计。
待统计的“单词”在文本串中不跨行出现,它或者从行首开始,或者前置以一个空格符。
模式匹配要基于KMP算法。
推广到更一般的模式集匹配问题,并设待查模式串可以跨行(提示:
定义操作GetAChar)。
【测试数据】
文本文件为testword.c
待统计的词集:
if、else、for、while、return、void、int、char、typedef、struct
三、进度安排
1.初步设计:
写出初步设计思路,进行修改完善,并进行初步设计。
2.详细设计:
根据确定的设计思想,进一步完善初步设计内容,按要求编写出数据结构类型定义、各算法程序、主函数。
编译分析调试错误。
3.测试分析:
设计几组数据进行测试分析,查找存在的设计缺陷,完善程序。
4.报告撰写:
根据上面设计过程和结果,按照要求写出设计报告。
5.答辩考核验收:
教师按组(人)检查验收,并提出相关问题,以便检验设计完成情况。
四、基本要求
1.在设计时,要严格按照题意要求独立进行设计,不能随意更改。
若确因条件所限,必须要改变课题要求时,应在征得指导教师同意的前提下进行。
2.在设计完成后,应当场运行和答辩,由指导教师验收,只有在验收合格后才能算设计部分的结束。
3.设计结束后要写出课程设计报告,以作为整个课程设计评分的书面依据和存档材料。
设计报告以规定格式的电子文档书写、打印并装订,报告格式严格按照模板要求撰写,排版及图、表要清楚、工整。
从总体来说,所设计的程序应该全部符合要求,问题模型、求解算法以及存储结构清晰;
具有友好、清晰的界面;
设计要包括所需要的辅助程序,如必要的数据输入、输出、显示和错误检测功能;
操作使用要简便;
程序的整体结构及局部结构要合理;
设计报告要符合规范。
课程负责人签名:
年月日
题目
选题四:
摘要
本实践课题重在对文本的查询,在实际应用中有重大作用。
通过本程序,可统计所需文本的一个或多个词汇在文本中出现的次数与位置,其作用在于给使用者研究一篇文学著作时提供帮助。
当研究一片文学著作时,不紧要理解著作的内容和寓意,有是更需要分析作者的写作手法和习惯,这是统计著作中词汇的出现次数与位置成了文学研究的重点课题。
本程序就可以为文学研究者提供这类帮助。
本程序基于模式匹配算法KMP实现,为普通模式匹配的改进,,优点在与时间复杂度由原来的O(n*m)变为O(n+m),即是说统计时间大大缩短。
当要统计的词汇量很大时,计算机统计所需时间将很漫长,如果使用者急需使用统计结果,这是又因为统计太慢导致研究受阻,这样就得不偿失了。
而本程序将大大改善这种状况,让计算机在短时间内统计出使用者想要的统计结果。
本程序虽然精简,但是对模式匹配算法KMP的使用极其灵活,需开发者深刻理解模式匹配算法KMP,思路清晰,灵活调用模式匹配算法KMP的函数,否则开发者将极难开发成功。
关键词:
文学研究模式匹配KMP
1课程设计相关
1.1题目要求
1)英文小说存于一个文本文件中。
2)模式匹配要基于KMP算法。
3)推广到更一般的模式集匹配问题,并设待查模式串可以跨行(提示:
1)文本文件为testword.c
2)待统计的词集:
【成绩评定】
1)完成“任务要求”第1项成绩评定为“及格”-“中”。
2)完成“任务要求”第2项至第3项成绩评定为“良”及以上。
1.1.1实验所在地点
本实验实行所在地点于学校教学楼多媒体实验室JB405,如图1-1
图1-1学校设施组织结构图
2课程设计实施
2.1设计思路
本实践重在对模式匹配算法KMP的调用。
KMP算法在数据结构(C语言版)中的第82页有详细解释,在此不予以解释。
我的大概思路是:
1.打开文件
2.输入想要匹配的一组字符串
3.读取文件的一行
4.把每一个字符串在该行中实行模式匹配KMP
5.重复步骤3和4
6.输出结果
2.1.1课程设计时间分配
本课程时间分为4天,16个课时,设计工作时间分配由学生自行分配。
我的课程设计工作分配时间表如表2-1。
表2-1
详情
分工
时间
备注
思路梳理与理论了解
第一天
可实行部分编程
编程实现
第二天
注意写备注
程序检验与改善
第三天
准备写说明书
程序设计说明书整理
第四天
打印,答辩
开发一个软件,就算再小,时间分配上也是很重要的。
在第一天,我将了解模式匹配算法KMP的设计思路,再梳理出我设计本程序的大概思路。
当思路梳理得差不多的时候就可以开始编程,第一天的编程还是以编写程序框架为主,先要把思路的框架写出来,为第二天的编程实现作准备。
第二天开始正式变成实现,在第一天编写出的程序框架的基础上,填写程序的实际内容。
由于第一天已编写出大概框架,因此实际编程事半工倍。
第三天实行程序的检验与改善。
第二天编写出来的程序已能够实现所需功能,但程序的格式还比较乱,也没有对读取出错进行处理。
在这一天里,将对程序进行检验与改善,令程序更完美。
在闲暇之余,还可以适当为课程设计说明书作准备,写出说明书模版以及完成部分内容。
第四天对课程设计说明书进行进一部的整理和完成,并在答辩之前把说明书打印出来。
2.2源程序代码实现
#include<
stdio.h>
stdlib.h>
#defineMAXSTRLEN255//最大串长
typedefcharSString[MAXSTRLEN+1];
//串的定长顺序存储表示
intnext[MAXSTRLEN];
//KMP算法中用到的next
intIndex(SStringS,SStringT,intpos)//KMP算法,P82
{
inti=pos,j=1;
while(i<
=S[0]&
&
j<
=T[0])
{
if(j==0||S[i]==T[j]){++i;
++j;
}
else
j=next[j];
}
if(j>
T[0])return(i-T[0]);
return0;
intlenth(SStringstr)//求串长
inti=1;
while(str[i])i++;
return(i-1);
voidfind(charname[],SStringkeys)//查找函数
{
SStringtext;
//用于存放从小说文件读取的一行字符串
inti=1,j=0,k,q=0;
//i用于存放行号,j用于存放列号,k用于输出格式的控制,q用于统计出现次数
FILE*fp;
if(!
(fp=(fopen(name,"
r"
))))//打开小说文件
printf("
打开文件出错!
\n"
);
exit(0);
keys[0]=lenth(keys);
//求关键字的长度
printf("
\n%s\n"
&
keys[1]);
//打印关键字
while(!
feof(fp))//如果还没到小说文件末尾,则继续循环
k=0;
fgets(&
text[1],MAXSTRLEN,fp);
//从小说文件中读取一行字符串,存入text串中
text[0]=lenth(text);
//求读入的串的长度
j=Index(text,keys,j+1);
//调用KMP算法,统计关键字在该行出现的位置,若匹配不成功则返回0
if(j!
=0)
{printf("
行=%d,列=%d"
i,j);
k++;
}//若匹配成功则打印行号和列号
while(j!
=0)//若该行找到了关键字,则继续寻找看是否还能匹配成功
{
j=Index(text,keys,j+1);
//调用KMP算法从刚找到的列号后一字符起匹配
if(j!
=0)
{printf("
%d"
j);
k++;
}//若匹配成功,则打印列号
}
i++;
//行号加1,在下一行中寻找
q+=k;
//累加k以统计关键字出现次数
if(k)printf("
//输出格式控制
%s出现%d次。
keys[1],q);
//打印关键字出现次数
voidmain()
charname[50];
//存储输入的小说路径字符串
SStringwords[10];
//定义字符串数组,用于存储输入的关键字
intm,n,i;
-----------------------------欢迎使用文学研究助手-------------------------------"
//打印标题
while
(1)//不停循环,直至完成查询或者退出服务
是否需要为你服务:
需要输入1,不需要输入0。
//询问是否需要服务
scanf("
%d"
m);
//输入判断是否需要服务
if(m==1)//需要服务时执行
输入你想查询的文档名字:
scanf("
%s"
name);
//输入文件名
输入查询字符串的个数:
n);
//输入查询字符串个数
输入你要查询的字符串:
for(i=0;
i<
n;
i++)
scanf("
words[i][1]);
//用户一次性输入要查找的关键字,words[i][0]用于存放字符串的长度
find(name,words[i]);
//对于每一个关键字,调用查找函数进行查找统计
break;
elseif(m==0)//不需要服务时执行
break;
else
printf("
输入错误!
\n\n"
//输入不合规范时执行
2.3程序调试演示与分析
如上图所示,运行程序先询问你是否需要服务,输入1后开始提供服务。
首先输入想查询的文档名字,这里输入测试文档text.c,即本程序的源文件,再输入个数,这里为测试需要输入10个。
然后一次性输入想查询的字符串,这里为if、else、for、while、return、void、int、char、typedef、struct。
输入完成以后程序就会开始自动统计,结果如下:
分析结果发现,程序统计完自动退出。
再对比统计结果是否正确,发现结果是正确的,表明程序正常运行并统计出了正确的数据。
参考文献
[1]严蔚敏,吴伟民:
《数据结构(C语言版)》[M],清华大学出版社2007年版,第80-84页。
心得体会
通过这一次课程实践,我获益良多,明白了很多之前不明白的,注意到了很多之前没注意的东西。
虽然这个程序比较短,可短而精,特别是对于模式匹配算法KMP的运用尤其灵活。
另外,我注意了很多细节,从中学到了很多。
总的来说包括以下几点:
1.对于错误信息的处理问题。
本程序有打开文件、输入判断等运用,如果对错误信息不加以处理,将会导致程序运行时使用户不清楚或感到程序忽然死亡的情况。
对这一细节加以处理后不仅程序美观,条理清晰,还对用户的使用提供了方便,容易上手。
2.注释应尽量详细。
详细的注释不仅能够让看的人清晰明了,对编程者本人的思路整理有好处,使得在编程的过程中不易产生混乱。
3.编程时注意对程序的优化。
虽然计算机的处理速度很快,可是当处理的信息一旦太多时,计算机容易反应不过来。
为了避免这种情况的发生,程序应当简洁、省时省空间,力求在时间复杂度和空间复杂度之上有所优势,节约资源。
4.思路是编程的核心,在编程之前一定要理清思路,这样编程时才会事半工倍。
如果在编程是遇到了瓶颈,应当静下心来重新整理思路,并寻找是否思路上有所纰漏。
5.在编程检验时,应当细心。
很多小错误都是由于编程人员的疏忽所造成的,而这些小错误往往不容易发现,对程序的运行也不会造成错误,可是对结果却有重大的影响,使得输出结果不如人意。
总的来说,编程就是熟能生巧,只要多编程,就会发现很多,学到很多。
只要在每一次的编程中多注意,多思考,编程能力就会慢慢提高。
在大学的日子里,编程的机会不算少,也不算多,为了锻炼能力,更应该重视每一次的编程实践,重要的是从中学到了多少,对你有多大帮助。
把握课程实践的机会,将会对个人能力的提高有很多好处。
教师评语
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文学 研究 助手 模式 匹配 算法 KMP