数据结构课程设计串基本操作演示系统.docx
《数据结构课程设计串基本操作演示系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计串基本操作演示系统.docx(24页珍藏版)》请在冰豆网上搜索。
数据结构课程设计串基本操作演示系统
附件1:
学号:
2010131328
课程设计
课程名
数据结构
题目
串基本操作演示系统
学院
计信学院
专业
计算机
班级
10级计算机三班
学生姓名
指导教师
2011
年
12
月
21
日
课程设计任务书
学生姓名:
专业班级:
2010级计算机三班
指导教师:
工作单位:
重庆工商大学
题目:
串基本操作演示系统
已知技术参数和设计要求:
基本功能要求:
实现若干串的基本操作,如串赋值、求串长、串的比较、串的替换、求子串、串的模式匹配等。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
(1)设计的题目要求达到一定工作量,并具有一定的深度和难度,程序代码不得少于300行。
(2)对设计问题进行分析研究,运用所学知识,确定设计思路及方案,并有相应文档产生。
(3)要求设计的软件能够正确运行,达到题目要求。
(4)编写出课程设计说明书(并附程序源代码),以电子文档方式上交教师批阅。
时间安排:
2011.12.1-2011.12.3理解所设计的题目,确定初步设计方案
2011.12.4-2011.12.14编代码调试和测试
2011.12.15-2011.12.17编写设计说明书
指导教师签名:
年月日
串基本操作演示系统--课程设计说明书
重庆工商大学计算机科学与信息工程学院
摘要:
实现若干串的基本操作,如串赋值、求串长、串的比较、串的替换、求子串、串的模式匹配等。
关键字:
串,函数调用
一.基本任务
设计串基本操作演示系统,系统需要实现如下基本功能:
(1)给串赋值;
(2)判断两个串是否相等;
(3)串的复制;
(4)求串的长度;
(5)求一个串的子串;
(6)将两个串连接起来形成一个串;
(7)串的插入;
(8)串的删除;
(9)串的替换;
(10)串的比较;
(11)串的模式匹配;
(12)串的逆序输出;
二.设计概要
为了完成需求分析的基本任务,主要从以下3个方面进行设计:
2.1主界面设计
为了实现串基本操作演示系统的各个功能,定义了一个非紧缩式的顺序串,来实现串的基本操作。
2.2数据结构设计
系统采用顺序表的顺序存储结构表示和存储串的内容。
其中顺序表的结构体有2个数据项组成:
存放串字符的数组,串长。
2.3系统功能设计
系统设计了12个子功能模块,12个子功能模块的描述如下:
(1)串赋值子模块:
可以给串赋予一个字符串常量,该功能由StrAssign()函数实现。
(2)判断两个串是否相等子模块:
判断两个串是否相等,相等则返回1,否则返回0,该功能由StrEqual()函数实现。
(3)串长度子模块:
返回串中的字符个数,该功能由StrLength()函数实现。
(4)串的子串子模块:
求一个串的子串,该功能由SubStr()函数实现。
(5)串的匹配子模块:
判断两个串是否模式匹配,该功能由StrIndex()函数实现。
(6)串连接子模块:
将两个串连接起来形成一个新的串,该功能由Concat()函数实现。
(7)串替换子模块:
将一个串的某一子串用另一个串代替形成新串,该功能由RepStr()函数实现。
(8)串插入子模块:
在一个串中插入另一个串形成新串,该功能由InsStr()函数实现。
(9)串删除子模块:
将一个串的某一子串删除形成新串,该功能由DelStr()函数实现。
(10)串比较子模块:
比较两个串的大小,该功能由Strcmp()函数实现。
(11)串复制子模块:
将一个串复制给另一个串,该功能由StrCopy()函数实现。
(12)串逆序子模块:
将串逆序输出,该功能由ReverseSq()函数实现。
三.模块设计
3.1模块设计
系统主要包含主函数模块和其他子函数模块,其调用关系如图所示:
模块函数调用示意图
3.2系统子模块及其功能设计
本系统包含了12个功能子函数,各程序的函数名及功能如下:
(1)StrAssign()函数:
给串赋予一个字符串常量。
(2)StrEqual()函数:
判断两个串是否相等,相等则返回1,否则返0。
(3)StrLength()函数:
返回串中的字符个数。
(4)SubStr()函数:
求一个串的子串。
(5)StrIndex()函数:
判断两个串是否模式匹配。
(6)Concat()函数:
将两个串连接起来形成一个新的串。
(7)RepStr()函数:
将一个串的某一子串用另一个串代替形成新串。
(8)InsStr()函数:
在一个串中插入另一个串形成新串。
(9)DelStr()函数:
将一个串的某一子串删除形成新串。
(10)Strcmp()函数:
比较两个串的大小。
(11)StrCopy()函数:
将一个串复制给另一个串。
(12)ReverseSq()函数:
将串逆序输出。
四.详细设计
4.1数据结构设计
系统采用顺序表的顺序存储结构存储串的信息,其结构体类型定义如下:
#defineMaxSize100
typedefstruct
{
chardata[MaxSize];//存放串字符
intlen;//串长
}SqString;
4.2系统主要模块设计
(1)主函数:
main()函数,在其里面调用各个功能函数,以实现他们的功能,算法如下:
intmain()
{
inti,j,m,n;
SqStringstr1,str2,s1,s2,s3,s4,s5;
charcstr1[80],cstr2[80];
printf("Enterastring1:
");//提示用户输入字符串
i=0;
while((cstr1[i]=getchar())!
='\n')
i++;
cstr1[i]='\0';
printf("Enterastring2:
");
j=0;
while((cstr2[j]=getchar())!
='\n')
j++;
cstr2[j]='\0';
//1串的赋值
printf("()串的赋值\n");
StrAssign(str1,cstr1);
StrAssign(str2,cstr2);
printf("str1=");
DispStr(str1);
printf("str2=");
DispStr(str2);
//2判断两个串是否相等
printf("
(2)判断串str1和str2是否相等:
\n");
m=StrEqual(str1,str2);
if(m==0)
printf("str1与str2不相等!
\n");
else
printf("str1与str2相等!
\n");
//3串的长度
printf("()串的长度\n");
printf("str1的长度为:
%d\n",StrLength(str1));
printf("str2的长度为:
%d\n",StrLength(str2));
//4求串的子串
printf("()串的子串:
\n");
printf("提取串str1的第个字符开始的个字符而产生串s1\n");
s1=SubStr(str1,2,3);
DispStr(s1);
//5串的匹配
printf("()串的匹配\n");
if(StrIndex(str1,str2)!
=-1)
printf("匹配成功!
\n");
else
printf("匹配失败!
\n");
printf("\n");
//6串的连接
printf("()串的连接\n");
printf("将串str1和串str2连接起来形成串s2:
\n");
s2=Concat(str1,str2);
DispStr(s2);
//7串的替换
printf("()串的替换\n");
printf("在串str1中,将第个字符开始的个字符构成的子串用str2替换,形成s3:
\n");
s3=RepStr(str1,3,4,str2);
DispStr(s3);
//8串的插入
printf("()将串str2插入到串str1的第个字符中,形成串s4:
\n");
s4=InsStr(str1,2,str2);
DispStr(s4);
//9串的删除
printf("(9)从串str1中删去第个字符开始的长度为的子串,形成串s5:
\n");
s5=DelStr(str1,2,3);
DispStr(s5);
//10串的比较
printf("(10)串的比较:
\n");
n=Strcmp(str1,str2);
if(n==0)
printf("str1=str2\n");
elseif(n==1)
printf("str1>str2\n");
else
printf("str1//11串的复制
printf("(11)串的复制\n");
StrCopy(str1,str2);
printf("复制后的str1为:
");
DispStr(str1);
//12串逆序
printf("(12)将串str1逆序输出:
\n");
ReverseSq(str1);
DispStr(str1);
return0;
}
(2)各个功能函数及其算法实现:
实现串赋值的函数:
voidStrAssign(SqString&s,charcstr[])
{
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;iif(s.data[i]!
=t.data[i])//有一个对应字符不相同时返回
same=0;
}
returnsame;
}
实现串复制的函数:
voidStrCopy(SqString&s,SqStringt)
{
inti;
for(i=0;is.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;
}
串的匹配查询的函数:
intStrIndex(SqStrings,SqStringt)//s为主串,t为模式串
{
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);//返回主串第一个下标
else
return-1;//匹配失败,返回-1
}
实现串连接的函数
SqStringConcat(SqStrings,SqStringt)
{
SqStringstr;
inti;
str.len=s.len+t.len;
for(i=0;istr.data[i]=s.data[i];
for(i=0;istr.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;kstr.data[k]=s.data[k];
for(k=0;kstr.data[i+k-1]=t.data[k];
for(k=i+j-1;kstr.data[t.len+k-j]=s.data[k];
str.len=s.len-j+t.len;
returnstr;
}
实现串的插入的函数:
SqStringInsStr(SqStrings1,inti,SqStrings2)
{
intj;
SqStringstr;
str.len=0;
if(i<=0||i>s1.len+1)//参数不正确时返回空串
returnstr;
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;
}
实现串的删除的函数:
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;kstr.data[k]=s.data[k];
for(k=i+j-1;kstr.data[k-j]=s.data[k];
str.len=s.len-j;
returnstr;
}
实现串的比较的函数:
intStrcmp(SqStrings,SqStringt)
{
inti,comlen;
if(s.lencomlen=s.len;//求s和t的共同长度
else
comlen=t.len;
for(i=0;iif(s.data[i]return-1;
elseif(s.data[i]>t.data[i])
return1;
}
if(s.len==t.len)
return0;//s==t
elseif(s.lenreturn-1;//selse
return1;//s>t
}
实现串逆序输出的函数:
voidReverseSq(SqString&str)
{
inti,j;
chart;
i=0;
j=str.len-1;//首尾调换
while(i{
t=str.data[i];
str.data[i]=str.data[j];
str.data[j]=t;
i++;
j--;
}
}
五.调试分析
系统运行结果如下:
六.用户使用说明
用户可任意输入两个串,系统将会自动对这两个串进行比较,复制,判断是否相等,删除,插入,替换等一系列串的基本操作。
七.参考文献
(1)数据结构教程清华大学出版社2009年3月第3版
(2)C语言程序设计高等教育出版社2008年1月第1版
(3)数据结构教程上机实验指导清华大学出版社
(4)数据结构(C语言)实践教程西安电子科技大学出版社
八.对所设计的软件进行自我评价
这个软件所运用了这学期所学的数据结构编写,在要求实现的功能上另外加了功能,如串的插入,删除,连接,逆序输出等。
让这个软件的编写方式不仅仅局限于常规的编程思想上。
没有未解决的问题。
此软件能够正确运行并得到正确结果。
创新点应该在于扩大了软件的功能。
九.程序源代码
#include
#include
#include
//定义顺序串
#defineMaxSize100
typedefstruct
{
chardata[MaxSize];//存放串字符
intlen;//串长
}SqString;
//串赋值
voidStrAssign(SqString&s,charcstr[])
{
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;iif(s.data[i]!
=t.data[i])//有一个对应字符不相同时返回
same=0;
}
returnsame;
}
//将串t复制给串s
voidStrCopy(SqString&s,SqStringt)
{
inti;
for(i=0;is.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;
}
//串的匹配查询(顺序串)
intStrIndex(SqStrings,SqStringt)//s为主串,t为模式串
{
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);//返回主串第一个下标
else
return-1;//匹配失败,返回-1
}
//串的连接:
返回由两个串连接在一起的新串
SqStringConcat(SqStrings,SqStringt)
{
SqStringstr;
inti;
str.len=s.len+t.len;
for(i=0;istr.data[i]=s.data[i];
for(i=0;istr.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;kstr.data[k]=s.data[k];
for(k=0;kstr.data[i+k-1]=t.data[k];
for(k=i+j-1;kstr.data[t.len+k-j]=s.data[k];
str.len=s.len-j+t.len;
returnstr;
}
//插入串:
将串s2插入到串s1的第i个字符中
SqStringInsStr(SqStrings1,inti,SqStrings2)
{
intj;
SqStringstr;
str.len=0;
if(i<=0||i>s1.len+1)//参数不正确时返回空串
returnstr;
for(j=0;j