实验三实验报告串Word格式文档下载.docx
《实验三实验报告串Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《实验三实验报告串Word格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。
2.抽象数据类型:
ADTString{
数据对象:
D={ai|ai∈CharacterSet,
i=1,2,...,n,n≥0}
数据关系:
R1={<
ai-1,ai>
|ai-1,ai∈D,i=2,...,n}
StrAssign(&
T,chars)
初始条件:
chars是字符串常量。
操作结果:
把chars赋为T的值。
StrCopy(&
T,S)
串S存在。
由串S复制得串T。
DestroyString(&
S)
串S被销毁。
StrEmpty(S)
初始条件:
串S存在。
操作结果:
若S为空串,则返回TRUE,
否则返回FALSE。
StrCompare(S,T)
串S和T存在。
若ST,则返回值0;
若ST,则返回值0;
若ST,则返回值0。
StrLength(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清为空串
四、调试分析及测试结果:
测试数据:
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语言,掌握了数据结构串的一些基本算法。
在程序的运行与调试过程中出现了很多错误,通过反复地复习课本上的相关知识,还有老师和同学的帮助,不停地修改与调试,终于完成了这个实验。
总之,在以后的试验中,我们必须认真仔细,而且要学会团队合作,互相讨论,这样不仅学到很多知识,而且还会提高效率。
同时我们在实验前还必须做好复习,这样在编写程序的时候才会得心应手。
不管怎么样,在这一次试验中,我不仅学到了知识而且也学到了经验。
附:
六、源程序
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;
j<
i-1;
j++)/*将s1.ch[0]~s1.ch[i-2]复制到str*/
str.data[j]=s1.data[j];
s2.len;
j++)/*将s2.ch[0]~s2.ch[s2.len-1]复制到str*/
str.data[i+j-1]=s2.data[j];
for(j=i-1;
s1.len;
j++)/*将s1.ch[i-1]~s.ch[s1.len-1]复制到str*/
str.data[s2.len+j]=s1.data[j];
str.len=s1.len+s2.len;
returnstr;
SqStringSubStr(SqStrings,inti,intj)
intk;
s.len||j<
0||i+j-1>
s.len)
/*参数不正确时返回空串*/
for(k=i-1;
k<
i+j-1;
k++)/*将s.ch[i]~s.ch[i+j]复制到str*/
str.data[k-i+1]=s.data[k];
str.len=j;
}
intIndex(SqStrings,SqStringt){
inti=0,j=0;
while(i<
s.len&
&
t.len){
if(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)
if(str.len>
0)
i<
str.len;
printf("
%c"
str.data[i]);
\n"
main()
SqStrings,s0,s1,s2,s3,s4,s5;
char*p,*q,*r,*l,*m;
intc,x,y,z,w;
/*******************本程序可实现如下功能*********************/\n"
\t1.在主串s中第i个位置之前插入一个子串t\n\t2.在主串s中从第i个位置开始共取m个字符,求子串t\n\t3.求子串t在主串s中的起始位置t\n\t4.退出程序\n"
while(c)
请选择您要进入的功能:
"
scanf("
%d"
&
x);
switch(x)
case1:
getchar();
请输入主串S:
"
StrAssign(s1,p);
请输入子串T:
StrAssign(s2,q);
请输入插入位置i:
scanf("
y);
InsStr(s1,y,s2);
s=InsStr(s1,y,s2);
printf("
输出新串为:
DispStr(s);
break;
case2:
StrAssign(s3,r);
从位置y开始取长度为z的子串:
%d%d"
y,&
z);
SubStr(s3,y,z);
s0=SubStr(s3,y,z);
输出子串为:
DispStr(s0);
case3:
StrAssign(s4,l);
StrAssign(s5,m);
Index(s4,s5);
w=Index(s4,s5);
if(w)
主串和子串在第%d个字符处首次匹配\n"
w);
主串和子串匹配不成功\n"
case4:
c=0;
break;
default:
printf("
输入错误,请重试!