实验三实验报告串.docx

上传人:b****4 文档编号:3705052 上传时间:2022-11-24 格式:DOCX 页数:11 大小:255.38KB
下载 相关 举报
实验三实验报告串.docx_第1页
第1页 / 共11页
实验三实验报告串.docx_第2页
第2页 / 共11页
实验三实验报告串.docx_第3页
第3页 / 共11页
实验三实验报告串.docx_第4页
第4页 / 共11页
实验三实验报告串.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

实验三实验报告串.docx

《实验三实验报告串.docx》由会员分享,可在线阅读,更多相关《实验三实验报告串.docx(11页珍藏版)》请在冰豆网上搜索。

实验三实验报告串.docx

实验三实验报告串

数据结构实验报告

报告名称串的操作

专业网络工程

班级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;j

str.data[j]=s1.data[j];

for(j=0;j

str.data[i+j-1]=s2.data[j];

for(j=i-1;j

str.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(i

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)

{

inti;

if(str.len>0)

{

for(i=0;i

printf("%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;

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1