77范文网 - 专业文章范例文档资料分享平台

串的模式匹配(5)

来源:网络收集 时间:2019-07-30 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

} }

if(j>=T.length) return i+1-T.length;//匹配成功 else return -1;

④int IndexBF(SeqString S,SeqString T,int k)

{//返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数值为0。其中,T非空,1=

int i,j;

i=k-1;//作为扫描S的下标,下标从0开始 j=0;

while(i

if(S.ch[i]==T.ch[j]) {++i;++j;}//继续比较后继字符 else {i=i-j+1;j=0;}//指针后退重新开始匹配 if(j>=T.length) return i+1-T.length; else return -1;

⑤int IndexKMP2(SeqString S,SeqString T,int(&next)[64],int pos)

{//利用GetNextVal函数求next数组值的KMP算法。其中T非空,1=

int i,j; i=pos-1;j=0;

while(i

if(j==-1||S.ch[i]==T.ch[j]) {++i;++j;}//继续比较后继字符 else j=next[j];//模式串向右移动

⑶建立文本文件函数、对文本文件中的单词计数、检索单词出现在文本文件中的行号、位置及在该行中出现的次数函数,此部分的函数实现如下:

19

① void CreateTextFile()//建立文本文件函数

{

SeqString S;

char filename[10],yn; FILE *fp;

printf(\请输入要建立的文件名(如abc.txt):\ scanf(\

fp=fopen(filename,\以写的方式打开一个新的文件 yn='n';//输入结束的标志 while(yn=='n'||yn=='N'){ printf(\请输入一行文本:\ getchar(); gets(S.ch);

S.length=strlen(S.ch);

fwrite(&S,sizeof(S),1,fp);//写一行文本到文本文件中 printf(\是否结束输入:y/n:\ yn=getchar();

}

fclose(fp);//关闭文件 printf(\文件建立成功!\\n\}

②void Count()//对文本文件中的单词计数

{

FILE *fp,*fp1;long fsizes; SeqString S,T;//定义两个变量

20

char filename[15],filename1[15]; int i=0,j=0,k=0,xz=0; int next[64]={-1};

printf(\您知道吗?串的模式匹配算法有很多种,以下哪种算法是您想要使用的呢?\\t\\n\

printf(\朴素模式匹配算法 2.串的模式匹配KMP算法 3.串的模式匹配KMP改进算法 4.其它 请选择(1/2/3):\\t\\n\

scanf(\ if(xz==1){

printf(\请输入文本文件名(如abc.txt):\ scanf(\

if((fp=fopen(filename,\以读的方式打开文件 { printf(\文件打开失败,按请按任意键退出!\\n\ getch(); exit(0); }

printf(\输入要统计计数的单词:\ scanf(\ T.length=strlen(T.ch);

while(!feof(fp)){//循环扫描整个文本

fgets(S.ch,MAXSTRLEN,fp);//读入一行文本,并为S.length赋值 S.length=lenth(S.ch);//求读入的串的长度

if(feof(fp)) break;//不加则会多统计一次最后一行的数值 k=1;//初始化开始检索的位置

while(k

21

{ j=IndexBF(S,T,k);//调用串匹配函数 if(j<0) break; else{ i++;//单词计数器累加1

k=j+T.length;//继续下一个子串的检索

}

}

}

printf(\单词%s在文本%s中共出现%d次!\\n\ }//if1 if(xz==2){

printf(\请输入文本文件名(如abc.txt):\ scanf(\

if((fp1=fopen(filename1,\以读的方式打开文件 { printf(\文件打开失败,按请按任意键退出!\\n\ getch(); exit(0); }

printf(\输入要统计计数的单词:\scanf(\ T.length=strlen(T.ch); GetNext(T,next);

while(!feof(fp1)){//循环扫描整个文本

22

fgets(S.ch,MAXSTRLEN,fp1);//读入一行文本,并为S.length赋值

}

printf(\单词%s在文本%s中共出现%d次!\\n\ }//if2 }

S.length=lenth(S.ch);//求读入的串的长度

if(feof(fp1)) break;//不加则会多统计一次最后一行的数值 k=1;//初始化开始检索的位置 while(k

j=IndexKMP1(S,T,next,k);//调用串匹配函数 if(j<0) break; else{ }

i++;//单词计数器累加1

k=j+T.length;//继续下一个子串的检索

③void StrPP()//检索单词出现在文本文件中的行号、位置及在该行中出现的次数函数

{

FILE *fp;

SeqString S,T;//定义两个串变量 char filename[15]; int i=0,j=0,k=0,l=0,m=0;

int sz[20];//存放一行中子串匹配的多个位置 printf(\请输入文件名(如abc.txt):\

23

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库串的模式匹配(5)在线全文阅读。

串的模式匹配(5).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/jiaoyu/666037.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: