




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上课程设计说明书程序设计的主要思路:首先构思所写程序的框架,我在主函数中输入字符串,并调用函数传给定义的顺序串,主函数中运用了do-while语句和switch语句,以此来供使用者选择他所需做的操作。选择所需操作时,调用相应的函数实现功能的应用,输出所需结果。同时为了操作系统的好看,我运用了system()等改变了运行界面的颜色。1、 需求分析实现串的基本操作,如:(1) 输入两个串,并赋值给顺序串s,t(2) 实现将串t复制给串s(3) 判断两串的大小(4) 求两串的长度(5) 实现两串的连接(6) 求子串(7) 插入(8) 删除(9) 替换(10) 输出串(11)
2、实现串的匹配,如:非模式匹配、简单模式匹配、KMP匹配(12) 实现串的逆置(13) 查找(14) 转换(将大写字母转换为小写字母,小写字母转换为大写字母)2、 概要设计2.1 主界面设计先设置了一个检测运行环境系统 。如图:为了实现串的各项基本操作,设计了一个含有多个菜单项的主控菜单模式以连接各种基本操作,以方便使用系统。如图:在选项9中我又设计了一个含三个菜单项的小主菜单以连接三个不同的匹配算法。如图: 2.2 数据结构设计 系统采用线性表的顺序存储结构表示,其中存放串字符和串长。此外定义了一个常量max,表示字符串的最大长度。 2.3 系统功能设计 此系统中设置了14个子功能模块,并在第
3、9个功能中又设置了3个子功能模块。 (1)将串t复制给串s模块,由strcopy()函数实现。 (2)比较两串的大小模块。由strcmp()函数实现。 (3)求串的长度模块。由strlength()函数实现。 (4)串的查找模块。由chaz()函数实现。 (5)求子串模块。由substr()函数实现。 (6)串的连接模块。由concat()函数实现。 (7)输出串模块。由dis()函数实现。 (8)将串s2插入到s1的第i个字符中模块。 (9)串的模式匹配模块。可以有三个函数实现:index1()函数、index()函数、kmpindex()函数。 (10)从串s中删除第i个字符开始的长度为j
4、的子串模块。由delstr()函数实现。 (11)在s串中将第i个字符开始的j个字符构成的子串用串t替换模块。由repstr()函数实现。 (12)串的逆序模块。由ReverseSq()函数实现。 (13)串的转换模块。由zhuanh()函数实现。 (14)串的修改模块。由change()函数实现。3.模块设计 整个程序的流程图。如图: 开始输入串cstr,Str并赋值给串s,t1串t复制给s2判断串的大小3求串长4串的连接5求子串6插入7删除8替换9匹配10输出串11串的逆序12串的查找13串的转换14串的修改根据选择输出相应的运行结果结束stra()函数strcmp()函数strlegth
5、()函数Concat()函数substr()函数insstr()函数delstr()函数repstrt()函数pipei()函数dis()函数ReverseSq()函数chaz()函数zhuanh()函数change()函数选择(n!=0)而选择9中还有一个流程,如图:选择9选择(n!=0)1非模式匹配2 BF模式匹配3 KMP模式匹配index1()函数index()函数kmpindex()函数getnext()函数输出相应的结果4.详细设计 4.1数据结构设计 系统采用串的顺序存储结构(顺序串)存储串的基本内容。类型定义如下: typedef struct char datamax; in
6、t length; sqstring; 4.2系统主要模块设计 (1)将字符常量cstr,Str赋值给串s,t模块,由stra()函数实现。该模块的算法思想是:用for循环将cstri赋值给si;并s.length=i。 该模块的算法描述如下: void stra(sqstring &s,char cstr)/将字符串常量赋给串s,s为引用型参数 int i; for(i=0;cstri!=0;i+) s.datai=cstri; s.length=i; (2)将串t复制给串s模块,由strcopy()函数实现。该模块的算法思想是:用for循环将顺序串t的内容复制给顺序串s,并顺序串s的长度为
7、顺序串t的长度。 该模块的算法描述如下: sqstring strcopy(sqstring s,sqstring t)/将串t复制给串s int i;for(i=0;it.length;i+)s.datai=t.datai;s.length=t.length;return s; (3)比较两串的大小模块。由strcmp()函数实现。该模块的算法思想是:首先比较s和t两串共同长度范围内的对应字符;若st,返回1;s=t,按上述规则继续比较。然后当s和t对应字符均相同时,比较s和t的长度;若st,返回1;s=t,返回0。 该模块的算法描述如下: int strcmp(sqstring s,sqs
8、tring t)/比较两串的大小int i,com;if(s.lengtht.length)com=s.length;/求串s、t的共同长度elsecom=t.length;for(i=0;icom;i+)/在共同长度内逐个字符比较if(s.datait.datai)return 1;if(s.length=t.length)/s=treturn 0;else if(s.datait.datai)/st (4)求串的长度模块。由strlength()函数实现。该模块的算法思想是:返回串s、t中的字符个数。 该模块的算法描述如下:int strlength(sqstring s)/求串的长度re
9、turn s.length; (5)串的连接模块。由concat()函数实现。该模块的算法思想是:先定义一个顺序空串str存储连接后的新串,其长度为串s和t的长度之和。先将s的内容赋值给串str,在接着其后将t的内容赋值给它。 该模块的算法描述如下: sqstring concat(sqstring s,sqstring t)/串的连接sqstring str;int i;str.length=s.length+t.length;for(i=0;is.length;i+)/将s.data0.s.length-1复制到strstr.datai=s.datai;for(i=0;it.length;
10、i+)/将t.data0.t.length-1复制到strstr.datas.length+i=t.datai;return str; (6)求子串模块。由substr()函数实现。该模块的算法思想是:先定义一空串str存储求的子串,找到所求子串的位置,利用for循环将长度为子串长度的串赋值给串str。若参数不对,返回空串。 该模块的算法描述如下: sqstring substr(sqstring s,int i,int j)/求子串sqstring str;int k;str.length=0;if(is.length|js.length)return str;/参数不正确时返回空串for(
11、k=i-1;ki+j-1;k+)/将s.datai.i+j复制到strstr.datak-i+1=s.datak;str.length=j;return str; (7)将串s2插入到s1的第i个字符中模块。该模块的算法思想是:先定义一个空串str,用for循环将s1的前i-1个字符赋值给str,在接着将串s2的字符赋值给str,最后将s1的i后的字符赋值给str。若参数不对,返回一个空串。 该模块的算法描述如下: sqstring instr(sqstring s1,int i,sqstring s2)/将串s2插入到串s1的第i个字符中int j;sqstring str;str.leng
12、th=0;if(is1.length+1)return str;/参数不正确时返回空串for(j=0;ji-1;j+)/将s1.data0.i-2复制到strstr.dataj=s1.dataj;for(j=0;js2.length;j+)/将s2.data0.s2.length-1复制到strstr.datai+j-1=s2.dataj;for(j=i-1;js1.length;j+)/将s1.datai-1.s1.length-1复制到strstr.datas2.length+j=s1.dataj;str.length=s1.length+s2.length;return str;(8)从
13、串s中删除第i个字符开始的长度为j的子串模块。由delstr()函数实现。该模块的算法思想是:先定义一个空串str,将s中前i-1个字符赋值给str,再将从i+j-1到s.length-1的字符赋值给str。 该模块的算法描述如下: sqstring delstr(sqstring s,int i,int j)/从串s中删除第i个字符开始的长度为j的子串int k;sqstring str;str.length=0;if(is.length|i+js.length+1)return str;/参数不正确时返回空串for(k=0;ki-1;k+)/将s.data0.i-2复制到strstr.da
14、tak=s.datak;for(k=i+j-1;ks.length;k+)/将s.datai+j-1.s.length-1复制到strstr.datak-j=s.datak;str.length=s.length-j;return str;(9)在s串中将第i个字符开始的j个字符构成的子串用串t替换模块。由repstr()函数实现。该模块的算法思想是:先定义一个空串str,将s中前i-1个字符赋值给str,再将串t的字符串赋值给str,最后将从i+j-1到s.length-1的字符赋值给str。 该模块的算法描述如下: sqstring repstr(sqstring s,int i,int
15、j,sqstring t)/在串s中将第i个字符开始的j个字符构成的子串用串t替换int k;sqstring str;str.length=0;if(is.length|i+js.length+1)return str;/参数不正确时返回空串for(k=0;ki-1;k+)/将s.data0.i-2复制到strstr.datak=s.datak;for(k=0;kt.length;k+)/将t.data0.t.length-1复制到strstr.datai+k-1=t.datak;for(k=i+j-1;ks.length;k+)/将s.datai+j-1.s.length-1复制到strs
16、tr.datat.length+k-j=s.datak;str.length=s.length-j+t.length;return str;(10)串的模式匹配模块。可以有三个函数实现:index1()函数、index()函数、kmpindex()函数。该模块的算法思想是:index()函数:从目标串s的第一个字符开始和模式串t中的第一个比较,若相等,则继续逐个比较后续字符;否则从目标串s的第二个字符开始重新与模式串t的第一个字符比较。以此类推,若从模式串s的第i个字符开始,每个字符依次和目标串t中的对应字符相等,则匹配成功,并返回位置i;否则,匹配失败,返回-1。 kmpindex()函数:
17、设s为目标串,t为模式串,i指针和j指针分别指示目标串和模式串中正待比较的字符,令i和j的初值为0.若有si=tj,则i和j分别自增1;否则i不变,j退回到j=nextj的位置(即模式串右滑),比较si和tj,若相等则指针个自增1,否则j再退回到下一个j=nextj位置(即模式串继续右滑),再比较si和tj。以此类推,直到出现下列两种情况之一:1、j退回到某个j=nextj位置时有si=tj,则指针各自增1后继续匹配;2、j退回到j=-1时,此时令i、j指针各自增1,即下一次比较si+1和t0。 该模块的算法描述如下: int index(sqstring s,sqstring t)/BF模式
18、匹配int i=0,j=0,k;while(is.length&j=t.length) k=i-t.length; /返回匹配的第一个字符的下标elsek=-1;return k; /模式匹配不成功int index1(sqstring s,sqstring t)/非模式匹配int i,j,k;for(i=0;is.length;i+)for(j=i,k=0;s.dataj=t.datak;j+,k+);if(k=t.length)return i;/返回匹配的第一个字符的下标return -1;/模式匹配不成功void getnext(sqstring t,int next)/由模式串t求出
19、next的值int j,k;j=0;k=-1;next0=-1;while(jt.length-1)if(k=-1|t.dataj=t.datak)/k为-1或比较的字符相等j+;k+;nextj=k;elsek=nextk;int kmpindex(sqstring s,sqstring t)/KMP模式匹配int nextmax,i=0,j=0;getnext(t,next);while(is.length&j=t.length)return(i-t.length); /返回匹配模式串的首字符下标elsereturn(-1); /返回不匹配标志(11)串的逆序模块。由ReverseSq()
20、函数实现。该模块的算法思想是:定义两自变量i,j,i=0,j=s.length-1,将其前后对调后,i自增1,j自减1。直至i=j为止。并输出其对调后的字符串。 该模块的算法描述如下: void ReverseSq(sqstring s)int c,i,j;char T;i=0;j=s.length-1;while(ij) T=s.datai;s.datai=s.dataj;s.dataj=T;i+;j-;for(c=0;c=0;i-)if(s.datai=m)c+;printf(character出现在串s中对应的最大下标:%dn,i);flag=1;break;if(flag=0)prin
21、tf(串s中无这个字符!n);printf(该字符在串中出现的次数:%dn,c);(13)串的转换模块。由zhuanh()函数实现。该模块的算法思想是:若字符在az之间,则将字符减去32后输出。若字符在AZ之间,则将字符加上32后输出。 该模块的算法描述如下: void zhuanh(sqstring s)int i;for(i=0;is.length;i+)if(s.datai=a)printf(%c ,s.datai-32);if(s.datai=A)printf(%c ,s.datai+32);(14)串的修改模块。由change()函数实现。该模块的算法思想是:定义两串cstr,Str
22、,输入其内容,调用函数stra()(将输入串赋值给顺序串)。 该模块的算法描述如下: void change(sqstring &s,sqstring &t)char cstrmax,Strmax;int i;printf(输入串cstr:);i=0;getchar();while(cstri=getchar()!=n)i+;cstri=0;printf(输入串Str:);i=0;while(Stri=getchar()!=n)i+;Stri=0;printf(把串cstr赋值给串s:);stra(s,cstr);dis(s); printf(把串Str赋值给串t:);stra(t,Str);
23、dis(t);(15) 串的输出模块。由dis()函数实现。该模块的算法思想是:用for循环在其长度范围内依次输出各字符。 该模块的算法描述如下: void dis(sqstring s)/显示串s中的所有元素int i;if(s.length0)for(i=0;is.length;i+)printf(%c,s.datai);printf(n);5.调试分析 6.用户使用说明 用户使用时。先输入你所需用的两串。在根据你所需操作的内容选择其选项,注意输入的是数字,不要输入除数字以外的内容。若想结束程序,只需输入0即可。7.对所设计的软件进行自我评价 我觉得我这次所写的程序很简单,除去模式匹配函数
24、以外其它的所需调用的函数基本可以由大一所学写出来。所以这个程序我用了这学期所学的顺序串来实现这些功能。其中定义了存放串字符和串长度。在顺序串中,串中的字符被依次存放在一组连续的存储单元里。而串的顺序存储有两种方法:非紧缩格式和紧缩格式。非紧缩格式:一个内存单元存储一个字符。紧缩格式:一个内存单元可以存储多个字符。我所写的程序用地是非紧缩格式存储方法。这个软件的功能多,充分应用了do-while语句和switch语句,这样可让使用者随意选择所需操作的功能。其中字符串的匹配更是运用了三个匹配:非模式匹配、BF模式匹配、KMP模式匹配。但是有一个问题尚未得到解决,那就是输入选择时,若不小心输入一个字
25、符,运行时它会无限循环。所以使用时输入数字,输入0时将结束程序。9.程序源代码#include#include#include#define max 100typedef structchar datamax;int length;sqstring;void stra(sqstring &s,char cstr)/将字符串常量赋给串s,s为引用型参数int i;for(i=0;cstri!=0;i+)s.datai=cstri;s.length=i;void dis(sqstring s)/显示串s中的所有元素int i;if(s.length0)for(i=0;is.length;i+)pr
26、intf(%c,s.datai);printf(n);sqstring strcopy(sqstring s,sqstring t)/将串t复制给串s int i;for(i=0;it.length;i+)s.datai=t.datai;s.length=t.length;return s;int strcmp(sqstring s,sqstring t)/比较两串的大小int i,com;if(s.lengtht.length)com=s.length;/求串s、t的共同长度elsecom=t.length;for(i=0;icom;i+)/在共同长度内逐个字符比较if(s.datait.d
27、atai)return 1;if(s.length=t.length)/s=treturn 0;else if(s.datait.datai)/stint strlength(sqstring s)/求串的长度return s.length;sqstring concat(sqstring s,sqstring t)/串的连接sqstring str;int i;str.length=s.length+t.length;for(i=0;is.length;i+)/将s.data0.s.length-1复制到strstr.datai=s.datai;for(i=0;it.length;i+)/将
28、t.data0.t.length-1复制到strstr.datas.length+i=t.datai;return str;sqstring substr(sqstring s,int i,int j)/求子串sqstring str;int k;str.length=0;if(is.length|js.length)return str;/参数不正确时返回空串for(k=i-1;ki+j-1;k+)/将s.datai.i+j复制到strstr.datak-i+1=s.datak;str.length=j;return str;sqstring instr(sqstring s1,int i,
29、sqstring s2)/将串s2插入到串s1的第i个字符中int j;sqstring str;str.length=0;if(is1.length+1)return str;/参数不正确时返回空串for(j=0;ji-1;j+)/将s1.data0.i-2复制到strstr.dataj=s1.dataj;for(j=0;js2.length;j+)/将s2.data0.s2.length-1复制到strstr.datai+j-1=s2.dataj;for(j=i-1;js1.length;j+)/将s1.datai-1.s1.length-1复制到strstr.datas2.length+
30、j=s1.dataj;str.length=s1.length+s2.length;return str;sqstring delstr(sqstring s,int i,int j)/从串s中删除第i个字符开始的长度为j的子串int k;sqstring str;str.length=0;if(is.length|i+js.length+1)return str;/参数不正确时返回空串for(k=0;ki-1;k+)/将s.data0.i-2复制到strstr.datak=s.datak;for(k=i+j-1;ks.length;k+)/将s.datai+j-1.s.length-1复制到
31、strstr.datak-j=s.datak;str.length=s.length-j;return str;sqstring repstr(sqstring s,int i,int j,sqstring t)/在串s中将第i个字符开始的j个字符构成的子串用串t替换int k;sqstring str;str.length=0;if(is.length|i+js.length+1)return str;/参数不正确时返回空串for(k=0;ki-1;k+)/将s.data0.i-2复制到strstr.datak=s.datak;for(k=0;kt.length;k+)/将t.data0.t
32、.length-1复制到strstr.datai+k-1=t.datak;for(k=i+j-1;ks.length;k+)/将s.datai+j-1.s.length-1复制到strstr.datat.length+k-j=s.datak;str.length=s.length-j+t.length;return str;int index(sqstring s,sqstring t)/BF模式匹配int i=0,j=0,k;while(is.length&j=t.length) k=i-t.length; /返回匹配的第一个字符的下标elsek=-1;return k; /模式匹配不成功i
33、nt index1(sqstring s,sqstring t)/非模式匹配int i,j,k;for(i=0;is.length;i+)for(j=i,k=0;s.dataj=t.datak;j+,k+);if(k=t.length)return i;/返回匹配的第一个字符的下标return -1;/模式匹配不成功void getnext(sqstring t,int next)/由模式串t求出next的值int j,k;j=0;k=-1;next0=-1;while(jt.length-1)if(k=-1|t.dataj=t.datak)/k为-1或比较的字符相等j+;k+;nextj=k
34、;elsek=nextk;int kmpindex(sqstring s,sqstring t)/KMP模式匹配int nextmax,i=0,j=0;getnext(t,next);while(is.length&j=t.length)return(i-t.length); /返回匹配模式串的首字符下标elsereturn(-1); /返回不匹配标志void pipei(sqstring s,sqstring t)int n;doprintf( * n);printf( 1 非模式匹配 2 BF模式匹配 3 KMP模式匹配 n);printf( * n);scanf(%d,&n);switc
35、h(n)case 1:if(index1(s,t)=-1) printf(该顺序串不匹配!n); else printf(该顺序串匹配,第一匹配位置是:%dn,index1(s,t);break;case 2:if(index(s,t)=-1) printf(该顺序串不匹配!n); else printf(该顺序串匹配,第一匹配位置是:%dn,index(s,t);break;case 3:if(kmpindex(s,t)=-1) printf(该顺序串不匹配!n); else printf(该顺序串匹配,第一匹配位置是:%dn,kmpindex(s,t);break;default:brea
36、k;while(n!=0);void ReverseSq(sqstring s)int c,i,j;char T;i=0;j=s.length-1;while(ij) T=s.datai;s.datai=s.dataj;s.dataj=T;i+;j-;for(c=0;c=0;i-)if(s.datai=m)c+;printf(character出现在串s中对应的最大下标:%dn,i);flag=1;break;if(flag=0)printf(串s中无这个字符!n);printf(该字符在串中出现的次数:%dn,c);void zhuanh(sqstring s)int i;for(i=0;i
37、s.length;i+)if(s.datai=a)printf(%c ,s.datai-32);if(s.datai=A)printf(%c ,s.datai+32);void change(sqstring &s,sqstring &t)char cstrmax,Strmax;int i;printf(输入串cstr:);i=0;getchar();while(cstri=getchar()!=n)i+;cstri=0;printf(输入串Str:);i=0;while(Stri=getchar()!=n)i+;Stri=0;printf(把串cstr赋值给串s:);stra(s,cstr)
38、;dis(s); printf(把串Str赋值给串t:);stra(t,Str);dis(t);int main()system(color b0);sqstring s,t,s0,s1,s2,s3,s4,s5;int i,j,n,l,k;char m,cstrmax,Strmax;printf(ttt请稍后,正在检测运行环境.n);for(l=0;l80;l+)for(k=0;k;k+)if(k);printf (ttt检测完成按回车键进入系统);getchar();system(cls);printf(输入串cstr:);i=0;while(cstri=getchar()!=n)i+;cs
39、tri=0;printf(输入串Str:);i=0;while(Stri=getchar()!=n)i+;Stri=0;printf(把串cstr赋值给串s:);stra(s,cstr);dis(s); printf(把串Str赋值给串t:);stra(t,Str);dis(t);doprintf(*n);printf( 1:串t复制给串s 2:判断串大小 3:求串长 4:串连接 5:求子串 6:插入n );printf( 7:删除 8:替换 9:匹配 10:输出串 11:逆序 12:查找 13:转换 14:修改n );printf(*n);scanf(%d,&n);switch(n)case 1:print
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 职业生涯规划与创新创业就业指导练习试题及答案
- 系统集成项目的效率评估方法试题及答案
- 2025个人借款合同标准范本
- 2025年造纸完成工段智能装备项目申请报告模板
- 重点解析初级社会工作者的试题及答案
- 专业发展与职业生涯规划试题及答案
- 特种设备a3试题及答案
- 社工中级考试的准备与策略
- 2025年高阻隔性封装材料项目申请报告
- 腹泻防治试题及答案
- 理论联系实际阐述文化在社会发展中具有什么样的作用?参考答案 二
- 学前儿童德育课件
- 山东综招试题大全及答案
- 2025年中考语文常考作文押题《10个主题+15篇范文》
- 2025年《中央一号文件》参考试题库资料100题及答案(含单选、多选、判断题)
- 2024年广西高考历史试卷真题(含答案解析)
- 2024年广东省广州市市中考英语试卷真题(含答案解析)
- 交响音乐赏析智慧树知到期末考试答案章节答案2024年西安交通大学
- GB/T 34560.2-2017结构钢第2部分:一般用途结构钢交货技术条件
- 阅读绘本《小种子》PPT
- 医院清洁消毒与灭菌课件
评论
0/150
提交评论