串及其应用——文学研究助手实验三安庆师范学院2012计算机卓越班1/7数据结构课程实验报告姓名:陈东学号:070612146串及其应用——文学研究助手实验三安庆师范学院2012计算机卓越班2/7目录一、【实验目的】......................................................................................................3二、【问题描述】......................................................................................................3三、【基本要求】......................................................................................................3四、【实验环境】......................................................................................................3五、【测试数据及其结果】......................................................................................3六、【实验源代码】..................................................................................................4串及其应用——文学研究助手实验三安庆师范学院2012计算机卓越班3/7一、【实验目的】本次实习的主要目的是熟悉串类型的实现方法和文本模式匹配方法,熟悉一般文学处理软件的设计方法,较复杂问题的分解求精方法。二、【问题描述】文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。试写一个是实现这一目标的文字统计系统,称为“文学研究助手”。三、【基本要求】英文小说存于一个文本文件中。待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。程序的输出结果是每个词的出现次数和出现位置所在行的行数,格式自行设计。四、【实验环境】Windows7,VC++6.0五、【测试数据及其结果】以自己的C源程序模拟英文小说,C语言的保留字集作为待统计串及其应用——文学研究助手实验三安庆师范学院2012计算机卓越班4/7的词汇集。六、【实验源代码】#includestdio.h#includestdlib.h#includeiostream.h#defineMAXSTRLEN255#defineOK1#defineERROR0#defineOVERFLOW0typedefcharHString[MAXSTRLEN+1];typedefintstatus;intnext[MAXSTRLEN];串及其应用——文学研究助手实验三安庆师范学院2012计算机卓越班5/7char*chars;typedefstruct{char*ch;intlength;}SString;char*ToString(chararray[],intarray_size)//字符数组转换成字符串{char*p;inti;p=(char*)malloc(array_size+1);for(i=0;iarray_size;i++){*(p+i)='0'+array[i];}*(p+i)='\0';returnp;}statusStrAssign(SString&T,char*chars)//生成一个其值等于串常量chars的串T{inti;intj;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;ji;j++){T.ch[j]=chars[j];}T.length=i;}returnOK;}voidget_next(SStringT,intnext[])//求next值{intj=1,k=0;next[1]=0;串及其应用——文学研究助手实验三安庆师范学院2012计算机卓越班6/7while(jT.length)//abaabcac{if(k==0||T.ch[k-1]==T.ch[j-1]){++j;++k;next[j]=k;}elsek=next[k];}}intIndex(SStringS,SStringT,intpos)//匹配算法kmp{inti=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++;}elsej=next[j];}if(jT.length-1)return(i-T.length);elsereturn0;}voidfind(SStringkeys)//查找单词{statusStrAssign(SString&T,char*chars);intcount=0;SStringT;HStringtext;inti=1,j=0;FILE*fp;if(!(fp=fopen(1.txt,r))){printf(Openfileerror!\n);exit(0);}get_next(keys,next);while(!feof(fp)){串及其应用——文学研究助手实验三安庆师范学院2012计算机卓越班7/7fgets(text,MAXSTRLEN,fp);ToString(text,sizeof(text)/sizeof(text[0]));chars=text;StrAssign(T,chars);j=Index(T,keys,j+1);if(j!=0){coutrow=i,col=jendl;count++;}while(j!=0){j=Index(T,keys,j+1);if(j!=0){coutrow=i,col=jendl;count++;}}i++;}coutnumberis:countendl;}voidmain(){SStringS;charwords[20];intn,i;printf(Howmanywordsdoyouwanttofind?(n10)\n);scanf(%d,&n);printf(Pleaseinputthewordsyouwanttofind:\n);for(i=0;in;i++){cinwords;ToString(words,sizeof(words)/sizeof(words[0]));chars=words;coutthecharsendl;StrAssign(S,chars);find(S);}}