实验三实验报告串.docx
《实验三实验报告串.docx》由会员分享,可在线阅读,更多相关《实验三实验报告串.docx(11页珍藏版)》请在冰豆网上搜索。
![实验三实验报告串.docx](https://file1.bdocx.com/fileroot1/2022-11/24/bbcb7428-0752-45d9-890b-7bbbbfe9b9aa/bbcb7428-0752-45d9-890b-7bbbbfe9b9aa1.gif)
实验三实验报告串
数据结构实验报告
报告名称串的操作
专业网络工程
班级1001
学号
姓名
指导教师
2012年5月8日
一、实验目的:
熟悉串类型的实现方法,了解简单文字处理的设计方法。
二、实验内容与基本要求:
1.设计可以在主串s中第i个位置之前插入一个子串t的程序。
2.设计可以在主串s中从第i个位置开始共取m个字符,求子串的程序。
3.设计一个程序求子串t在主串s中的起始位置
三、概要设计:
1.数据结构:
#include
#defineMaxSize100/*最多的字符个数*/
typedefstruct
{chardata[MaxSize];/*定义可容纳MaxSize个字符的空间*/
intlen;/*标记当前实际串长*/
}SqString;
2.抽象数据类型:
ADTString{
数据对象:
D={ai|ai∈CharacterSet,
i=1,2,...,n,n≥0}
数据关系:
R1={|ai-1,ai∈D,i=2,...,n}
StrAssign(&T,chars)
初始条件:
chars是字符串常量。
操作结果:
把chars赋为T的值。
StrCopy(&T,S)
初始条件:
串S存在。
操作结果:
由串S复制得串T。
DestroyString(&S)
初始条件:
串S存在。
操作结果:
串S被销毁。
StrEmpty(S)
初始条件:
串S存在。
操作结果:
若S为空串,则返回TRUE,
否则返回FALSE。
StrCompare(S,T)
初始条件:
串S和T存在。
操作结果:
若ST,则返回值0;
若ST,则返回值0;
若ST,则返回值0。
StrLength(S)
初始条件:
串S存在。
操作结果:
返回S的元素个数,
称为串的长度。
Concat(&T,S1,S2)
初始条件:
串S1和S2存在。
操作结果:
用T返回由S1和S2联接而成的新串
SubString(&Sub,S,pos,len)
初始条件:
串S存在,1≤pos≤StrLength(S)
且0≤len≤StrLength(S)-pos+1。
操作结果:
用Sub返回串S的第pos个字符起
长度为len的子串。
Index(S,T,pos)
初始条件:
串S和T存在,T是非空串,1≤pos≤StrLength(S)。
操作结果:
若主串S中存在和串T值相同
的子串,则返回它在主串S中第pos个
字符之后第一次出现的位置;
否则函数值为0。
Replace(&S,T,V)
初始条件:
串S,T和V均已存在且T是非空串。
操作结果:
用V替换主串S中出现的所有与(模式串)T
相等的不重叠的子串。
StrInsert(&S,pos,T)
初始条件:
串S和T存在,
1≤pos≤StrLength(S)+1。
操作结果:
在串S的第pos个字符之前
插入串T。
StrDelete(&S,pos,len)
初始条件:
串S存在
1≤pos≤StrLength(S)-len+1。
操作结果:
从串S中删除第pos个字符
起长度为len的子串。
ClearString(&S)
初始条件:
串S存在。
操作结果:
将S清为空串
四、调试分析及测试结果:
测试数据:
1.在主串s(abcdefg)中第3个位置之前插入一个子串t(apple),输出新串。
2.在主串s(thisisacprogram)中从第5个位置开始共取3个字符,求子串的程序。
3.主串s(thekingisababyandstrong),子串t(isababy),输出子串t在主串s中的起始位置。
测试结果及分析:
图一
1.程序通过编译后,运行程序。
进入选择界面,该程序主要实现三个功能,如图一所示。
“1.在主串s中第i个位置之前插入一个子串;2.在主串s中从第i个位置开始共取m个字符,求子串;3.求子串t在主串s中的起始位置。
”此界面通过switch分支语句实现。
按相应的数字键进入相应的功能。
图二
2.按数字键1键实现串的插入功能。
输入主串“xyzmnwaxy”,依照提示输入子串“xyz”,选择插入的位置为i=2;按回车键结束,输入新串为“xxyzyzmnwaxy”,程序运行正确,输出结果无误。
在程序运行过程中,调用串的创建StrAssign()函数,插入字符InsStr()函数,以及字符串的输出DispStr()函数。
图三
3.输入数字2,进入从主串中的第i个位置开始共取m个字符,求子串的操作。
该操作主要是SubStr()函数的实现。
输入主字符串“abcdef”,从位置2开始取长度为3的字符串,输出结果为“bcd”,程序运行完毕,进入功能选择。
图四
4.进入功能4,求子串在主串s中的起始位置t;该过程主要实现Index()的用法。
这里采用的是Brut—Force算法,虽然浪费了不少内存空间,但也能实现其功能,输入主串后,在输入其子串,匹配成功,找到其子串在主串中出现的起始位置。
如需改进可以考虑KMP算法。
图五
5.输入数字4,程序执行完毕。
五、实验心得及经验教训
通过此次实验,我对C语言以及数据结构有了更深刻的了解,增强了程序的便编写能力,将理论知识和实际操作结合起来,更进一步巩固了知识,而且在对程序模块化观念也模糊逐渐的清晰了。
,同时通过C语言,掌握了数据结构串的一些基本算法。
在程序的运行与调试过程中出现了很多错误,通过反复地复习课本上的相关知识,还有老师和同学的帮助,不停地修改与调试,终于完成了这个实验。
总之,在以后的试验中,我们必须认真仔细,而且要学会团队合作,互相讨论,这样不仅学到很多知识,而且还会提高效率。
同时我们在实验前还必须做好复习,这样在编写程序的时候才会得心应手。
不管怎么样,在这一次试验中,我不仅学到了知识而且也学到了经验。
附:
六、源程序
#include
#defineMaxSize100/*最多的字符个数*/
typedefstruct
{chardata[MaxSize];/*定义可容纳MaxSize个字符的空间*/
intlen;/*标记当前实际串长*/
}SqString;
voidStrAssign(SqString&str,charcstr[])/*str为引用型参数*/
{
inti;
chara[MaxSize];
gets(a);
cstr=a;
for(i=0;cstr[i]!
='\0';i++)
str.data[i]=cstr[i];
str.len=i;
}
SqStringInsStr(SqStrings1,inti,SqStrings2)
{
intj;
SqStringstr;
str.len=0;
if(i<=0||i>s1.len+1)/*参数不正确时返回空串*/
{
printf("参数不正确\n");
returns1;
}
for(j=0;jstr.data[j]=s1.data[j];
for(j=0;jstr.data[i+j-1]=s2.data[j];
for(j=i-1;jstr.data[s2.len+j]=s1.data[j];
str.len=s1.len+s2.len;
returnstr;
}
SqStringSubStr(SqStrings,inti,intj)
{
SqStringstr;
intk;
str.len=0;
if(i<=0||i>s.len||j<0||i+j-1>s.len)
{
printf("参数不正确\n");
returnstr;/*参数不正确时返回空串*/
}
for(k=i-1;k
str.data[k-i+1]=s.data[k];
str.len=j;
returnstr;
}
intIndex(SqStrings,SqStringt){
inti=0,j=0;
while(iif(s.data[i]==t.data[j]){
i++;
j++;
}
else{
i=i-j+1;
j=0;
}
}
if(j>=t.len)
return(i-t.len+1);
else
return(-1);
}
voidDispStr(SqStringstr)
{
inti;
if(str.len>0)
{
for(i=0;iprintf("%c",str.data[i]);
printf("\n");
}
}
main()
{
SqStrings,s0,s1,s2,s3,s4,s5;
char*p,*q,*r,*l,*m;
intc,x,y,z,w;
printf("/*******************本程序可实现如下功能*********************/\n");
printf("\t1.在主串s中第i个位置之前插入一个子串t\n\t2.在主串s中从第i个位置开始共取m个字符,求子串t\n\t3.求子串t在主串s中的起始位置t\n\t4.退出程序\n");
while(c)
{
printf("请选择您要进入的功能:
");scanf("%d",&x);
switch(x)
{
case1:
getchar();
printf("请输入主串S:
");
StrAssign(s1,p);
printf("请输入子串T:
");
StrAssign(s2,q);
printf("请输入插入位置i:
");
scanf("%d",&y);
InsStr(s1,y,s2);
s=InsStr(s1,y,s2);
printf("输出新串为:
");
DispStr(s);
break;
case2:
getchar();
printf("请输入主串S:
");
StrAssign(s3,r);
printf("从位置y开始取长度为z的子串:
\n");
scanf("%d%d",&y,&z);
SubStr(s3,y,z);
s0=SubStr(s3,y,z);
printf("输出子串为:
");
DispStr(s0);
break;
case3:
getchar();
printf("请输入主串S:
");
StrAssign(s4,l);
printf("请输入子串T:
");
StrAssign(s5,m);
Index(s4,s5);
w=Index(s4,s5);
if(w)
printf("主串和子串在第%d个字符处首次匹配\n",w);
else
printf("主串和子串匹配不成功\n");
break;
case4:
getchar();c=0;break;
default:
printf("输入错误,请重试!
\n");
break;
}
}
}