数据结构文学研究助手
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
姓名:陈东
学号:070612146
目录
一、【实验目的】 (4)
二、【问题描述】 (4)
三、【基本要求】 (4)
四、【实验环境】 (4)
五、【测试数据及其结果】 (4)
六、【实验源代码】 (5)
一、【实验目的】
本次实习的主要目的是熟悉串类型的实现方法和文本模式匹配方法,熟悉一般文学处理软件的设计方法,较复杂问题的分解求精方法。
二、【问题描述】
文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。试写一个是实现这一目标的文字统计系统,称为“文学研究助手”。
三、【基本要求】
英文小说存于一个文本文件中。待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。程序的输出结果是每个词的出现次数和出现位置所在行的行数,格式自行设计。
四、【实验环境】
Windows7, VC++6.0
五、【测试数据及其结果】
以自己的C源程序模拟英文小说,C语言的保留字集作为待统计的词汇集。
六、【实验源代码】
#include
#include
#include
#define MAXSTRLEN 255
#define OK 1
#define ERROR 0
#define OVERFLOW 0
typedef char HString[MAXSTRLEN+1];
typedef int status;
int next[MAXSTRLEN];
char *chars;
typedef struct{
char *ch;
int length;
}SString;
char* ToString(char array[], int array_size)//字符数组转换成字符串
{
char *p;
int i;
p = (char*)malloc(array_size + 1);
for(i = 0; i < array_size; i++)
{
*(p+i) = '0' + array[i];
}
*(p+i) = '\0';
return p;
}
status StrAssign(SString &T,char *chars)//生成一个其值等于串常量chars的串T {
int i;
int j;
char *c;
for(i=0,c=chars;*c!='\0';++i,++c);
if(!i)
{
T.ch=NULL;
T.length=0;
}
else
{
if(!(T.ch=(char *)malloc(i *sizeof(char))))
exit(OVERFLOW);
for(j=0;j
{
T.ch[j]=chars[j];
}
T.length=i;
}
return OK;
}
void get_next(SString T,int next[])//求next值{
int j=1,k=0;
next[1]=0;
while(j { if(k==0||T.ch[k-1]==T.ch[j-1]) { ++j; ++k; next[j]=k; } else k=next[k]; } } int Index(SString S,SString T,int pos)//匹配算法kmp { int i=pos,j=1; while(i!=S.length+1&&j!=T.length+1) { if(j==0||S.ch[i-1]==T.ch[j-1]) { j++;i++; } else j=next[j]; } if(j>T.length-1) return (i-T.length); else return 0; } void find(SString keys)//查找单词 { status StrAssign(SString &T,char *chars); int count=0; SString T; HString text; int i=1,j=0; FILE *fp; if(!(fp=fopen("1.txt","r"))) { printf("Open file error!\n"); exit(0); } get_next(keys,next); while(!feof(fp)) { fgets(text,MAXSTRLEN,fp); ToString(text, sizeof(text)/sizeof(text[0])); chars=text; StrAssign(T,chars); j=Index(T,keys,j+1); if(j!=0) { cout<<"row="< count++; } while(j!=0) { j=Index(T,keys,j+1); if(j!=0) { cout<<"row="< count++; } } i++; } cout<<"number is:"< } void main()