文学助手研究

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【问题描述】

文学研究人员要统计某篇英文小说中某些形容词的出现次数和位置.试写一个实现这一目标的文学统计表,称为"文学研究助手"

【基本要求】

a。英文小说存在于一个文本文件中.待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后完成.程序的输出结果是每个词的出现次数和出现位置所在行的行号,格式自行设计

b。模式匹配要基于KMP算法

c。整个统计过程中只对小说文字扫描一次,以提高效率

【测试数据】

以当前的源程序文件作为测试目标

【实现提示】

约定小说中的词汇一律不跨行

【思路演示】

【代码过程】

1。

//base.h

//------------------- 公用的常量和类型 ----------------------------

#include

#include

#include

#include

//函数结果状态代码

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

typedef int Status; //函数的返回值

//~

2。

//hstring.h

//----------------- 串的堆分配存储表示---------------------------

typedef struct{

char *ch; //若是非空串,则按串长分配存储区,否则ch为NULL int length; //串长度

}HString;

//----------------- 栈的基本操作的算法实现-------------------------------- Status StrInit(HString &T){

//初始化串

T.ch=NULL; T.length=0;

return OK;

}

Status StrAssign(HString &T, char *chars){

//生成一个其值等于串常量chars的串T

//if(T.ch) free(T.ch); //释放原有的串空间

int len; char *c;

for(len=0, c=chars;*c;++len,++c); //求chars的长度i;

if(!len) {T.ch=NULL; T.length=0;}

else{

if( !(T.ch = (char *) malloc(len*sizeof(char) ) ))

exit(OVERFLOW);

for(int i=0;i

T.ch[i]='/0'; //结尾加上/0

T.length = len;

}

return OK;

}

int StrLength(HString s){

//返回串长度

return s.length;

}

void StrPrint(HString s){

//打印串

for(int i=0;i

printf("%c",s.ch[i]);

//printf("/t");

}

int Index(HString s,HString t, int pos){

//返回子串t在主串s中第pos个字符之后的位置。如不存在,则返回0 int i=pos,j=1;

while(i<=s.length && j<=t.length){

if(s.ch[i-1]==t.ch[j-1]) i++,j++;

else i=i-j+2,j=1;

}

if(j>t.length) return i-t.length;

else return 0;

}

int Next(HString s,int j){

//KMP模式匹配的next函数

if(j==1) return 0;

for(int k=j-1;k>1;k--){

for(int i=1;i

if(s.ch[i-1] != s.ch[j-k+i-1])

break;

}

if(i==k) break;

}

return k;

}

int Index_KMP(HString s,HString t, int pos){ //KMP算法

int i=pos,j=1;

while(i<=s.length && j<=t.length){

if(j==0 || s.ch[i-1]==t.ch[j-1]) i++,j++;

else j=Next(t,j);

}

if(j>t.length) return i-t.length;

else return 0;

}

int IsNotCharactor(char ch){

//判断该字符是不是字母

return !(ch>='a'&&ch<='z' || ch>='A'&&ch<='Z'); }

相关文档
最新文档