串基本操作的演示课程设计.docx

上传人:b****6 文档编号:6452289 上传时间:2023-01-06 格式:DOCX 页数:24 大小:144.83KB
下载 相关 举报
串基本操作的演示课程设计.docx_第1页
第1页 / 共24页
串基本操作的演示课程设计.docx_第2页
第2页 / 共24页
串基本操作的演示课程设计.docx_第3页
第3页 / 共24页
串基本操作的演示课程设计.docx_第4页
第4页 / 共24页
串基本操作的演示课程设计.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

串基本操作的演示课程设计.docx

《串基本操作的演示课程设计.docx》由会员分享,可在线阅读,更多相关《串基本操作的演示课程设计.docx(24页珍藏版)》请在冰豆网上搜索。

串基本操作的演示课程设计.docx

串基本操作的演示课程设计

序号:

11

《数据结构》课程设计

题目串基本操作的演示

学院计算机学院

专业网络工程

 

 

一.、课程设计任务要求

在教科书4.2.2节用堆分配存储表示实现HString串的最小操作子集的基础上,实现串抽象数据类型的其余基本操作(不使用C语言本身提供的串函数)。

参数合法性检查必须严格。

说明:

(在格式中,Φ表示0个、1个或多个空格所组成的串。

〈串标识〉表示一个内部名或一个串文字。

前者是一个串的唯一标识,是一种内部形式的(而不是字符形式的)标识符。

后者是两端由单引号括起来的仅可打印字符组成的序列。

串内每两个连续的单引号表示一个单引号符。

利用上述基本操作函数构造以下系统:

它是一个命令解释程序,循环往复地处理用户键入的每一条命令,直至终止程序的命令为止。

命令定义如下:

   

(1)赋值。

格式:

AΦ〈串标识〉Φ〈回车〉用〈串标识〉所表示的值建立新

串,并显示新串的内部名和串值。

如:

A′Hi!

(2)判相等。

格式:

EΦ〈串标识1〉Φ〈串标识2〉Φ〈回车〉

   若两串相等,则显示“EQUAL”,否则显示“UNEQUAL”。

   (3)联接。

格式:

CΦ〈串标识1〉Φ〈串标识2〉Φ〈回车〉

   将两串联接产生结果串,它的内部名和串值都显示出来。

   (4)求长度格式:

LΦ〈串标识〉Φ〈回车〉显示串的长度。

   (5)求子串格式:

SΦ〈串标识〉Φ+〈数1〉Φ+〈数2〉Φ〈回车〉

   如果参数合法,则显示子串的内部名和串值。

〈数〉不带正负号。

   (6)子串定位。

格式:

IΦ〈串标识1〉Φ〈串标识2〉Φ〈回车〉

   显示第二个串在第一个串中首次出现时的位置。

   (7)串替换格式:

RΦ〈串标识1〉Φ〈串标识2〉Φ〈串标识2〉Φ〈回车〉

   将第一个串中出现所有出现的第二个串用第三个串替换,显示结果串的内部名和串值,原串不变。

   (8)显示。

格式PΦ〈回车>显示所有在系统中被保持的串的内部名和串值的对照表

   (9)删除。

格式DΦ〈内部名>Φ〈回车>删除该内部名对应的串,即赋值的逆操作。

   (0)退出格式:

QΦ〈回车〉结束程序的运行。

二、已完成的项目及完成程度

   

(1)赋值。

StrAssign(SqString&s,charcstr[])

   

(2)判相等。

StrEqual(SqStrings,SqStringt)

   (3)联接。

Concat(SqStrings,SqStringt)

(4)求长度。

StrLength(SqStrings)

   (5)求子串。

SubStr(SqStrings,inti,intj)

   (6)子串定位。

Index(linkstring*s,linkstring*t)

   (7)串替换。

Replace(linkstring*&s,linkstring*t,linkstring*r)

(8)显示。

Dispstr(linkstring*s)

   (9)删除。

DelStr(SqStrings,inti,intj)

   (0)退出。

Quit()

完成了项目要求的大部分所有操作。

三、理论依据、用到的数据结构,及举例

定义串的基本主结构

ADTString{

数据对象:

D={ai|ai∈charcaterset,i=1,2,…,n,n>=0}

数据关系:

R1={|ai-1,ai∈D,i=1,2,…,n}

基本操作:

StrCompare(HStringS,HStringT)

初始条件:

S和T是已存在的Hstring类型。

操作结果:

比较其值,显示结果“UNEQUAL”或“EQUAL”。

StrLength(HStringS)

初始条件:

S是已存在的Hstring类型。

操作结果:

返回该串的长度。

Concat(HStringS1,HStringS2)

初始条件:

S1和S2是已存在的Hstring类型。

操作结果:

由S1和S2联接成新串。

Index(HStringS,HStringt)

初始条件:

S和T是已存在的Hstring类型。

操作结果:

显示第二个串在第一个串中首次出现的起始位置。

Replace(HStringM,HStringt,HStringv)

初始条件:

M、t和v是已存在的Hstring类型。

操作结果:

将第一个串中所有出现的第二个串用第三个串替换,显示结果串的内部名和串值,原串不变。

SubString(HStringS,intpos,intlen)

初始条件:

S是已存在的Hstring类型。

操作结果:

如果参数合法,则显示子串的内部名和串值。

Strprint(HStringS)

初始条件:

S是已存在的Hstring类型。

操作结果:

显示串S的内部名和串值。

getin(intn)

初始条件:

处理命令串S1,

操作结果:

把串值存入串头表中

Insert(intn)

初始条件:

要给指定的串赋值,n为指定的串的内部名

操作结果:

为指定内部名的串赋值

show()

初始条件:

要求查看输入格式

操作结果:

输出各种命令的输入格式

}ADTString

typedefstruct

{

char*ch;//若是非空串,则按串长分配存储区,否则ch为NULL

intlength;//串长度

}HString;

四、主要算法流程图

 

 

ECLSRDQ

 

五、主要代码

引用的头文件:

#include

#include

#include

使用的结构体:

typedefstruct{

chardata[MaxSize];//存放串字符

intlen;//串长

}SqString;

关键函数功能实现:

voidScanf(charcstrr[]){//输入字符串

cstrr[100];

printf("Enterastring:

\n");//提示用户输入字符串

intj=0;

while((cstrr[j]=getchar())!

='\n')

j++;

cstrr[j]='\0';

}

//串赋值

voidStrAssign(SqString&s,charcstr[])

{

Scanf(cstr);

inti;

for(i=0;cstr[i]!

='\0';i++)

s.data[i]=cstr[i];

s.len=i;

}

//判断串是否相等

intStrEqual(SqStrings,SqStringt)

{

intsame=1,i;

if(s.len!

=t.len)//长度不相等时返回

same=0;

else

{

for(i=0;i

if(s.data[i]!

=t.data[i])//有一个对应字符不相同时返回

same=0;

}

returnsame;

}

//将串t复制给串s

voidStrCopy(SqString&s,SqStringt)

{

inti;

for(i=0;i

s.data[i]=t.data[i];

s.len=t.len;

}

//求串长

intStrLength(SqStrings)

{

returns.len;

}

//求子串

SqStringSubStr(SqStrings,inti,intj)

{

SqStringstr;

intk;

str.len=0;

if(i<=0||i>s.len||j<0||i+j-1>s.len)

returnstr;//参数不正确时返回空串

for(k=i-1;k

str.data[k-i+1]=s.data[k];

str.len=j;

returnstr;

}

 

//串的连接:

返回由两个串连接在一起的新串

SqStringConcat(SqStrings,SqStringt)

{

SqStringstr;

inti;

str.len=s.len+t.len;

for(i=0;i

str.data[i]=s.data[i];

for(i=0;i

str.data[s.len+i]=t.data[i];

returnstr;

}

//串的替换

SqStringRepStr(SqStrings,inti,intj,SqStringt)

{

intk;

SqStringstr;

str.len=0;

if(i<=0||i>s.len||i+j-1>s.len)//参数不正确时返回空串

returnstr;

for(k=0;k

str.data[k]=s.data[k];

for(k=0;k

str.data[i+k-1]=t.data[k];

for(k=i+j-1;k

str.data[t.len+k-j]=s.data[k];

str.len=s.len-j+t.len;

returnstr;

}

 

//串的删除

SqStringDelStr(SqStrings,inti,intj)

{

intk;

SqStringstr;

str.len=0;

if(i<=0||i>s.len||i+j>s.len+1)//参数不正确时返回空串

{

printf("参数不正确\n");

returnstr;

}

for(k=0;k

str.data[k]=s.data[k];

for(k=i+j-1;k

str.data[k-j]=s.data[k];

str.len=s.len-j;

returnstr;

}

//串比较

intStrcmp(SqStrings,SqStringt)

{

inti,comlen;

if(s.len

comlen=s.len;//求s和t的共同长度

else

comlen=t.len;

for(i=0;i

if(s.data[i]

return-1;

elseif(s.data[i]>t.data[i])

return1;

}

if(s.len==t.len)

return0;//s==t

elseif(s.len

return-1;//s

else

return1;//s>t

}

 

//输出串

voidDispStr(SqStringstr)

{

inti;

if(str.len>0)

{

for(i=0;i

printf("%c",str.data[i]);

printf("\n");

}

}

//菜单函数

voidmenus(){

inti,j,m,x,y;

charn;

printf("***************************************************\n");

printf("********A赋值E判断相等C联接********\n");

printf("********L求长度S求子串I子串定位****\n");

printf("********R串替换P显示D删除*******\n");

printf("********Q退出******\n");

scanf("%c",&n);

getchar();

switch(n)

{

case'A':

case'a':

printf("A请输入需要赋值的串\n");

StrAssign(str1,cstr1);

printf("输出str1=");

DispStr(str1);

menus();

break;

case'E':

case'e':

printf("E判断串str1和str2是否相等:

\n");

StrAssign(str1,cstr1);

StrAssign(str2,cstr2);

m=StrEqual(str1,str2);

if(m==1)

printf("EQUAL\n");

else

printf("NUEQUAL\n");

menus();

break;

case'C':

case'c':

printf("输入要连接的两个串:

\n");

printf("将串str1和串str2连接起来形成串s1:

\n");

StrAssign(str1,cstr1);

StrAssign(str2,cstr2);

s1=Concat(str1,str2);

DispStr(s1);

menus();

break;

case'L':

case'l':

printf("输入要求长度的串:

\n");

StrAssign(str1,cstr1);

printf("str1的长度为:

%d\n",StrLength(str1));

menus();

break;

case'S':

case's':

printf("提取串str1的第a个字符开始的b个字符而产生串s2\n");

StrAssign(str1,cstr1);

inta,b;

scanf("%d%d",&a,&b);

s2=SubStr(str1,a,b);

DispStr(s2);

menus();

break;

case'R':

case'r':

printf("在串str1中,将第p个字符开始的q个字符构成的子串用str2替换,形成s3:

\n");

StrAssign(str1,cstr1);

intp,q;

scanf("%d%d",&p,&q);

StrAssign(str2,cstr2);

s3=RepStr(str1,p,q,str2);

DispStr(s3);

menus();

break;

case'D':

case'd':

printf("从串str1中删去第i个字符开始的长度为j的子串,形成串s3:

\n");

StrAssign(str1,cstr1);

intx,y;

scanf("%d%d",&x,&y);

s3=DelStr(str1,x,y);

DispStr(s3);

menus();

break;

case'Q':

case'q':

break;

}

}

voidmain()//主函数

{

menus();

}

六、实验截图

1.测试用例

(1)As=deng<回车>,应显示s=deng;

(2)E““<回车>,应显示“EQUAL”;

(3)E‘abc’‘abcd’<回车>,应显示“UNEQUAL”;

(4)I‘a’“<回车>,应报告:

参数非法;

(5)R‘dengbolun’‘24’‘huizhi’<回车>,应显示‘ba’;

(6)D‘dengbolun’‘24’<回车>,应显示:

dolun;

(7)D‘fdhagkjh’‘36’<回车>,应显示:

fdjh;

(8)C‘deng’‘bolun’<回车>,应显示:

dengbolun;

(9)L‘abcdefg’<回车>,应显示:

7;

2.程序截图

 

3.实验结果分析

经检验,测试数据预期结果和测试得出结果一致。

七、小结

本实验是在MicrosoftVisualC++上实现的

本次实验学到了很多知识:

1)熟悉串的定义和串的基本操作。

2)掌握顺序串的基本运算。

3)加深对串数据结构的理解,逐步培养解决实际问题的编程能力。

4)运用到了串的链式存储结构,对链表也有了进一步提高。

 

附录:

源代码

#include

#include

#include

//定义顺序串

#defineMaxSize100

typedefstruct

{

chardata[MaxSize];//存放串字符

intlen;//串长

}SqString;

voidmenus();

voidScanf(charcstrr[]){

cstrr[100];

printf("Enterastring:

\n");//提示用户输入字符串

intj=0;

while((cstrr[j]=getchar())!

='\n')

j++;

cstrr[j]='\0';

}

//串赋值

voidStrAssign(SqString&s,charcstr[])

{

Scanf(cstr);

inti;

for(i=0;cstr[i]!

='\0';i++)

s.data[i]=cstr[i];

s.len=i;

}

//判断串是否相等

intStrEqual(SqStrings,SqStringt)

{

intsame=1,i;

if(s.len!

=t.len)//长度不相等时返回

same=0;

else

{

for(i=0;i

if(s.data[i]!

=t.data[i])//有一个对应字符不相同时返回

same=0;

}

returnsame;

}

//将串t复制给串s

voidStrCopy(SqString&s,SqStringt)

{

inti;

for(i=0;i

s.data[i]=t.data[i];

s.len=t.len;

}

//求串长

intStrLength(SqStrings)

{

returns.len;

}

//求子串

SqStringSubStr(SqStrings,inti,intj)

{

SqStringstr;

intk;

str.len=0;

if(i<=0||i>s.len||j<0||i+j-1>s.len)

returnstr;//参数不正确时返回空串

for(k=i-1;k

str.data[k-i+1]=s.data[k];

str.len=j;

returnstr;

}

 

//串的连接:

返回由两个串连接在一起的新串

SqStringConcat(SqStrings,SqStringt)

{

SqStringstr;

inti;

str.len=s.len+t.len;

for(i=0;i

str.data[i]=s.data[i];

for(i=0;i

str.data[s.len+i]=t.data[i];

returnstr;

}

//串的替换

SqStringRepStr(SqStrings,inti,intj,SqStringt)

{

intk;

SqStringstr;

str.len=0;

if(i<=0||i>s.len||i+j-1>s.len)//参数不正确时返回空串

returnstr;

for(k=0;k

str.data[k]=s.data[k];

for(k=0;k

str.data[i+k-1]=t.data[k];

for(k=i+j-1;k

str.data[t.len+k-j]=s.data[k];

str.len=s.len-j+t.len;

returnstr;

}

 

//串的删除

SqStringDelStr(SqStrings,inti,intj)

{

intk;

SqStringstr;

str.len=0;

if(i<=0||i>s.len||i+j>s.len+1)//参数不正确时返回空串

{

printf("参数不正确\n");

returnstr;

}

for(k=0;k

str.data[k]=s.data[k];

for(k=i+j-1;k

str.data[k-j]=s.data[k];

str.len=s.len-j;

returnstr;

}

//串比较

intStrcmp(SqStrings,SqStringt)

{

inti,comlen;

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

当前位置:首页 > 表格模板 > 合同协议

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

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