文学研究助手数据结构报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文学研究助手数据结构报告
武汉理工大学华夏学院课程设计课程名称数据结构题目文学研究助手
______ 年____ 月 ____ 日
文学研究助手
设计目的
(1 )使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。
(2)使学生掌握数据库设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。
(3)使学生学会使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。
问题描述
文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。试写一个实现
这一目标的文字统计系统,称为“文学研究助手”。
基本要求
英文小说存于一个文本文件中。待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。程序的输出结果是每个词的出现次数和出现位置所在行的行号,格式自行设计
算法思想
本次课程设计使用的是串模式匹配的KMP算法,模式匹配算法KMP为普通模式匹配的改进,优点在与时间复杂度由原来的O(n*m)变为0(n+m),即是说统计时间大大缩短。
当要统计的词汇量很大时,计算机统计所需时间将很漫长,如果使用者急需使用统计结果,这是又因为统计太慢导致研究受阻,这样就得不偿失了。而本程序将大大改善这种状况,让计算机在短时间内统计出使用者想要的统计结果。本程序虽然精简,但是对模式匹配算法KMP勺使用极其灵活,需灵活调用模式匹配算法KMP的函数来快速解决问题。该算法的
核心思想是:每当一趟匹配过程中出现字符比较不等时,不需要回测指针,而是利用已经得到的“部分匹配”的结果将模式向右滑动尽可能远的一段距离后,继续进行比较。
模块划分
本次课程设计所用到的程序主要包含四个模块,分别是主程序模块、有序表单元模块、
单词单元模块和单词文本串文件单元模块。其中主程序模块需要实现的功能是,输入文本并统计文件中每个需要测试的单词出现的次数和位置,并输出结果。
源程序
#i nclude
#include
#defi ne MAXSTRLEN 255 // 最大串长
typedef char SStri ng[MAXSTRLEN+1];
intnext[MAXSTRLEN]; //KMP 算法中用到的next
int In dex(SStri ng S,SStri ng T,i nt pos) //KMP 算法
{
int i=pos,j=1;
while(i<=S[0]&&jv=T[0])
if(j==O||S[i]==T[j]) {++i;++j;}
else
j=n ext[j];
if (j>T[O]) return (i-T[O]);
else
return 0;
int len th(SStri ng str) // int i=1;
while(str[i]) i++;
return(i-1);
void fin d(char n ame[],SStri ng keys) // SStri ng text; // 用于存放从小说文件读取的一行字符串
求串长
查找函数
int i=1,j=0,k,q=0; //i 用于存放行号, j 用于存放列号,k 用于输出格式的控制,q 用于统计出现次数
FILE *fp;
if (!(fp=(fope n(n ame,"r")))) // 打开小说文件
printf ("
打开文件出错!\n");
exit(0);
text 串中
if (j!=0)
i++; II 行号加1,在下一行中寻找
q+=k; //累加k 以统计关键字出现次数
printf("%s 出现 %d 次。\n",&keys[1],q); void main()
char name[50]; // 存储输入的小说路径字符串
keys[O]=le nth(keys); //
prin tf("\n%s\n",&keys[1]);
// while (!feof(fp)) // 求关键字的长度 打印关键字 如果还没到小说文件末尾,则继续循环
k=0;
fgets(&text[1],MAXSTRLEN,fp);
// 从小说文件中读取一行字符串,存入 text[0]=le nth(text); // 求读入的串的长度
j=ln dex(text,keys,j+1); // 调用KMP 算法,统计关键字在该行出现的位 置,若匹配不成功则返回0
if (j!=0)
{pri ntf("行=%d 列=%d",i,j); k++;} //
若匹配成功则打印行号和列号 while(j!=0) II 若该行找到了关键字,则继续寻找看是否还能匹配成功
j=ln dex(text,keys,j+1); //
调用KMP 算法从刚找到的列号后一字符起匹配
{prin tf(",%d",j);k++;} //
若匹配成功,则打印列号
if (k) prin tf("\n"); //
输出格式控制
//打印关键字出现次数
SStri ng words[10]; // 定义字符串数组,用于存储输入的关键字
int m,n ,i;
printf(”--------------------- 欢迎使用文学研究助手---------------------------- ");
//打印标题
while(1) //不停循环,直至完成查询或者退出服务
{
printf(" 是否需要为你服务:需要输入1,不需要输入0。\n");
scanf("%d",&m); //输入判断是否需要服务
if(m―1)II需要服务时执仃
1
printf(" 输入你想查询的文档名字:\n");
scan f("%s", name); II输入文件名
printf(" 输入查询字符串的个数:\n");
scan f("%d",&n); II输入查询字符串个数
printf(" 输入你要查询的字符串:\n");
for (i=0;i scanf("%s",&words[i][1]); //用户一次性输入要查找的关键字, words[i][0]用于存放字符串的长度 for (i=0;i find(name,words[i]); // 对于每一个关键字,调用查找函数进行查找统计 break; } else if(m==0) //不需要服务时执行 break; else