文学研究助手与模式匹配算法KMPWord格式.docx

上传人:b****4 文档编号:17873527 上传时间:2022-12-11 格式:DOCX 页数:11 大小:65.41KB
下载 相关 举报
文学研究助手与模式匹配算法KMPWord格式.docx_第1页
第1页 / 共11页
文学研究助手与模式匹配算法KMPWord格式.docx_第2页
第2页 / 共11页
文学研究助手与模式匹配算法KMPWord格式.docx_第3页
第3页 / 共11页
文学研究助手与模式匹配算法KMPWord格式.docx_第4页
第4页 / 共11页
文学研究助手与模式匹配算法KMPWord格式.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

文学研究助手与模式匹配算法KMPWord格式.docx

《文学研究助手与模式匹配算法KMPWord格式.docx》由会员分享,可在线阅读,更多相关《文学研究助手与模式匹配算法KMPWord格式.docx(11页珍藏版)》请在冰豆网上搜索。

文学研究助手与模式匹配算法KMPWord格式.docx

试写一个实现这一目标的文字统计系统

【任务要求】

英文小说存于一个文本文件中。

待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。

程序的输出结果是每个词的出现次数和出现位置所在的行的行号,格式自行设计。

待统计的“单词”在文本串中不跨行出现,它或者从行首开始,或者前置以一个空格符。

模式匹配要基于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.在编程检验时,应当细心。

很多小错误都是由于编程人员的疏忽所造成的,而这些小错误往往不容易发现,对程序的运行也不会造成错误,可是对结果却有重大的影响,使得输出结果不如人意。

总的来说,编程就是熟能生巧,只要多编程,就会发现很多,学到很多。

只要在每一次的编程中多注意,多思考,编程能力就会慢慢提高。

在大学的日子里,编程的机会不算少,也不算多,为了锻炼能力,更应该重视每一次的编程实践,重要的是从中学到了多少,对你有多大帮助。

把握课程实践的机会,将会对个人能力的提高有很多好处。

教师评语

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 建筑土木

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1