字符串类课程设计说明书Word文档格式.docx
《字符串类课程设计说明书Word文档格式.docx》由会员分享,可在线阅读,更多相关《字符串类课程设计说明书Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
再依次实现其它操作。
2.3设计方法和内容
2.3.1开发环境
硬件环境:
一台联想计算机,其配置为:
CPU:
Pentium(R)42.4GHz内存:
256MB硬盘:
40G主板:
SIS651-A201-8100.
软件环境:
MicrosoftWindowsXPProfessional版本2002ServicePack2并且安装了可供编程的MicrosoftvisualC++6.0.
2.3.2设计流程图
本次程序的类命名为String,里面的成员函数包括:
逻辑bool类型的有StrAssign(char*chars)(利用已有的一个char串建立一个字符串),Insert()(在主串中插入一个子串),Delete()(在子串中删除一个子串),substring(String&
sub)(返回主串中的一个子串),concat(Strings)(将两个字符串连接起来);
整型的有Length()(求一个字符串的长度),Index()(匹配模式),pare(Strings)(比较两个字符串的大小),Huiwen(char*str)(判断一个字符串是否是回文),count_vowel(constchar*s)(计算串中元音字母个数);
还有display()(输出函数),clear()(将一个字符串清空),Strcopy()(复制一个字符串),Strrev()(将一个字符串反转输出)。
具体流程如图一:
图2-1设计流程图
2.3.3设计内容
在各种高级语言的编译程序中,源程序和目标程序都被处理成字符串数据,各种源程序编辑器的功能强弱有差异,但其基本操作是一致的,一般都包括串的查找、插入、删除、转换等[4]。
本设计中,整个程序分为三个独立的文档。
其中包括:
头文件string.h,源文件string.cpp和main.cpp。
头文件包括一个类classString,里面是对各个函数进行声明。
类的私有成员有一维数组str1[40]。
字符串的最大长度maxlen;
字符串的当前长度curlen。
串是一种特殊的线性表,它的每一个元素仅有一个字符所组成。
因此可以用线性表的存储方法来存储串。
串的实现方式大致分为三种:
1.串的顺序存储;
2.串的块链存储;
3.串的堆分配存储。
串的顺序存储是用一组地址连续的储存单元存储字符串的字符序列,这样的存储结构访问一组连续字符非常方便,体现了顺序表的优点:
随机存储[6]。
串的块链丰储类似线性表中的链表,不过在一个结点中它储存的并不是一个字符,而是一个字符串,一般来说,以块链作为存储结构时实现串的操作比较麻烦。
串的堆分配存储的特点是串变量的存储空间是程序执行过程中动态分配而得,程序中出现的所有串变量可用的存储空间是一个称之为“堆〞的共享空间。
在本设计中,运用的是已知一个字符串再建立一个字符串。
[8]存储方式的代码如下:
boolSString:
:
StrAssign(char*chars)//生成一个值为chars的串
{
if(strlen(chars)>
maxsize)//判断chars的长度是否比串的长度大
returnfalse;
//大,则错误
else
{
curlen=strlen(chars);
//令串的长度等于chars的长度
for(inti=1;
i<
=curlen;
i++)
str1[i-1]=chars[i-1];
//串的内容等于chars里面的内容
}
returntrue;
}
经过从键盘输出chars里面的数据,能得到字符串。
调试结果如下图:
图2-2建立字符串
确定建立串的程序正确之后,就可以逐渐加入其它程序段了。
串的长度是求该字符串的当前长度。
因为它有自己的当前长度curlen,所以returncurlen就可以求出字符串的长度。
[11]插入和删除是字符串中两个常见的操作。
插入操作是指将一个指定的串插入到当前串中的指定位置。
插入的算法是:
〔1〕当插入位置超出合法的范围,即当pos<
0或pos>
curlen时,显示出错信息并终止。
〔2〕当插入后的新串长度超出当前串的最大值,即curlen+tlen>
=maxlen-1时,重新分配空间。
〔3〕将当前串中从pos开始至串尾的一些字符后移留出tlen个空位,然后将子串插入到对应的空位中。
〔4〕更新当前串的长度为curlen+tlen,返回当前串。
删除操作是指删除当前串中指定范围内的串值。
删除的算法是:
〔1〕输出所要删除的子串的位置pos与子串的长度tlen。
〔2〕检查位置的合法性。
即当pos>
curlen-1或pos<
0或tlen<
1,显示出错信息并终止。
〔2〕若长度超出最大可供删除的长度,即当tlen>
curlen-pos时,则按截尾法对tlen进行调整。
〔3〕确定新串的长度为curlen-tlen,删除当前串中从pos开始的长度为tlen的子串,即重新形成当前串中pos开始至新串串尾cluren-1的一些字符,这些字符分别由相隔tlen个位置的对应字符前移而来。
〔5〕返回当前串。
子串的定位操作通常称为字符串的模式匹配,是指在当前串中查找与子串,若查找成功则返回该子串的位置。
[13]定位操作的基本思想是:
(1)设主串S=s1,s2,…sn,子串P=p1,p2,…pm。
〔2〕i为指向S中字符的指针,j为指向P中字符的指针,从主串S中第pos个字符起和模式中第一个字符比较。
若相等,则继续逐个比较后续字符;
否则从主串的下个字符起再重新和模式字符比较。
〔3〕匹配失败:
si!
=pj时,(si-j+1…si-1)=(p1…pj-1)。
〔4〕回溯:
i=i-j+1;
j=0.此程序由于重复回溯太多,所以时间复杂度是O(m*n)。
[9]改进后的模式匹配算法称作KMP算法。
这个算法是同D.E.Knuth,J.H.Morris,V.R.Pratt同时发现的。
在该算法中指针i没有回溯。
它的核心思想是利用已经得到的部分匹配信息来进行后面的匹配过程。
改进后的算法如下:
intString:
Index_KMP(char*t,intk)//KMP算法
inti,j,tlen;
i=k;
j=0;
tlen=strlen(t);
while((i<
curlen)&
&
(j<
tlen))
if(str[i]==t[j])
{i++;
j++}//如果子串和主串相等,两个下标均自增
else
j=next[j];
if(j==tlen)
return(i-tlen);
elsereturn-1;
复制字符串是指将一个已知的字符串复制,定义一个char型指针T,并开辟一块空间。
令T等于已被定义的str即可。
[16]串的比较的算法是:
在两个串的当前长度范围内,逐个取出字符进行比较,一旦发现不相等,立即根据大于或小于的关系返回位置值。
串的联结是指把第二个串直接放到第一个串的尾部,再修改第一个串的长度。
基本算法是:
先判断两个串S1,S2连接起来是否大于串S,若不大,则先把串S1的所有字符放入串S中,然后将串S2的所有字符放在串S1的后面依次放入串S中,并返回逻辑真。
若两个串的长度大于串S,S的当前长度就等于S的最大长度,并返回逻辑假。
[7]返回子串操作的功能是:
在当前串中截取从pos开始的长为tlen的子串,并返回该子串。
过程是:
〔1〕输入所要返回的子串的位置pos与长度tlen。
〔2〕检查位置是否合适,当pos>
0或len<
1,则返回逻辑假。
〔2〕若长度超过最大可供截取长度,则将长度调整为最大可截取的长度。
〔3〕生成一个字符串,将当前串中从pos开始的长度为tlen的内容复制到该串中并返回字符串。
串的反转操作是将串倒置输出。
找出字符串中元音字符的个数。
在该程序段中有两个函数:
intvowel(chara)和intcount_vowel(constchar*s),[12]第一个函数是判断一个字符是否是元音,是则返回1,否则返回0。
第二个函数是数字符串中元音个数。
基本思想是:
逐个查看字符,若是元音,则计数num加1,否则就不加。
最后返回的是num。
转换函数大写操作是将字符串中的所有小写字母转换成大写,若已经是小写则直接输出。
小写转换成大写是将字符的ASCⅡ码-32。
转换函数小写操作是将字符串中的所有大写字母转换成小写,若已经是小写就直接输出。
大写转换成小写则是将字符的ASCⅡ码+32。
[10]回文是指首尾内容相同。
要判断一个字符串是否是回文,其算法是:
将字符串的第一个和最后一个相比较,相同,则比较字符串的第二个和倒数第二个,依次类推,如果都相等,说明该字符串是回文。
否则,该字符串就不是回文。
在主函数里面,利用switch语句制作一个字符串菜单。
在菜单里通过选择里面的选项来实现选项所对应的操作。
2.4设计创新和关键技术
随着世界经济的多元化发展,以计算机为基础的信息技术迅速扩展到各个领域,社会和人类对信息的依赖迅速增长,计算机技术和基于计算机的应用技术已经成为信息社会的重要基础设施。
现在,计算机已经被大量用来处理非数值计算问题,如信息检索、文字编辑、自然语言翻译等[14]。
这些问题中所涉与的处理对象多数是字符串数据。
在传统的程序设计中,人们往往要为每一种应用项目单独的进行一次程序的开发,显然,这种方法的重复工作量是很大的,人们无法利用现有的丰富的软件资源,这就造成软件开发过程中人力、物力和时间的巨大浪费,效率很低,本程序的关键点就是集合串的几乎所有的算法操作,通过对串的编程实现一些串的查找、插入、删除、定位等操作,对以后制作一个信息检索程序起着重大的作用。
本次设计的特点就是囊括了串的许多基础重要算法。
经典的算法也在其中。
难点是将两个字符串连接起来的编写。
由于没有网络,所以不好找资料,图书馆的资料有限,书上只列举了这些算法思想,具体程序得自己努力思考去编写。
刚开始编写的时候是建立两个字符串s1,s2,调用函数s.concat(s1,s2)。
调试是没有错误,但是就是不能将两个串连接起来。
后来,经老师指点,将联结函数体里的语句修改了一下,将参数改成只有一个,意思是将一个串s1直接放在串s的后面,这样就省去了建立两个参数的时间。
[15]该函数的定义如下:
boolString:
concat(Strings)//联结
inti,j=0;
if(curlen+s.curlen<
=maxlen)//当前长度加上串s的长度小于等于最大长度
for(j=0,i=curlen;
curlen+s.curlen;
i++,j++)//i是从串s的下标开始的
str[i]=s.str[j];
//将串s放在串的后面
curlen=curlen+s.curlen;
//长度改变
returntrue;
这样,通过键盘操作两个串,就能实现联结操作了。
不过,通过函数调用,该调试结果如下:
图2-3联结函数的调试
2.5结论
课程设计是对我们综合能力的考察。
数据结构是计算机课程体系中的核心课程之一,里面的各种存储方式、逻辑结构与相关的一些算法思想是我们必须自己去了解的。
串是计算机中最常用的数据结构,是一种数据类型受到限制的特殊线性表,表中每一个元素类型只能是字符型[5]。
串虽然是线性表,但有它特殊的地方,不是作为单个字符进行讨论,而是作为一个整体〔即字符串〕进行讨论。
字符串是计算机处理数据的输入输出对象,所以掌握其操作非常重要。
本次的课程设计主要设计的就是字符串类的有关算法。
相信了解这些算法对以后编辑信息检索系统、文字编辑系统等有非常重大的作用。
致谢
在浩瀚宇宙中,每个人都是渺小的。
在计算机这个更新速度比光速还快的世界中,个人的力量实在太渺小了。
就我们做课程设计来说,书上的内容很精致,图书馆里的资料也比较丰富。
但是要利用书上所学的知识来让我们编写一个实际的程序实在是非常困难。
因为这不仅要求我们收集资料,还要求我们拓展自己的思维,不要局限在书上的仅有的几个程序。
这次的课程设计时间有点短,仅有一周的时间,而且都是在晚上进行。
在调试过程中屡调屡败的状态下,我急得想哭,就在这时,老师给了我热情的帮助,老师指导我调试程序,说哪些是错的,哪些是多余的,哪些是必要的,一个杂乱无章的程序被修改得有条不紊,很显然结果也是最最正确的。
在此,我真诚的感谢帮助我的老师们,老师就是黑暗中的指明灯,没有老师的指导,就没有我们顺利的完成任务的喜悦。
老师每天都来机房为我们指导,与时解决我们所面临的问题,老师的工作态度让我们佩服,老师的一流技术让我们信服,老师的无私奉献让我们折服。
当然,同学们的帮助也是我前进的力量,他们伸出双手,毫不犹豫地接住我的困难,也让我体会到真诚的友谊。
团结就是力量,在老师、同学的帮助下,我顺利完成了此次的课程设计。
也让我体会到了成功的来之不易,只有真正付出过才有满意的收获。
在此,我诚心的对所有帮助过我的老师同学们说一句:
谢谢!
!
参考文献:
[1]苏俊数据结构与数据管理.:
中国人民大学.20##5月.65页~74页
[2]朱振元,朱承.数据结构-C++语言描述.:
清华大学.20##1月.96页~115页
[3]严蔚敏,陈文博.数据结构与应用算法教程.:
清华大学.20##.89页~97页
[4]马秋菊,刘延岭.数据结构和实验与学习指导.:
中国水利水电.20##.55页~59页
[5]殷人昆,陶永雷,谢若阳,盛绚华.数据结构〔用面向对象方法与C++描述〕.:
清华大学.20##3月.59页~64页
[6]谭浩强.C程序设计〔第三版〕.:
清华大学.20##.315页~318页
[7]王晓东.数据结构〔C++语言版〕.:
科学.20##.1页~70页
[8]侯识忠.数据结构算法VisualC++6.0程序集.:
中国水利水电.20##5月.117页~122页
[9]李根强.数据结构〔C++版〕.:
中国水利水电.20##10月.61页~72页
[10]何军,胡元义.数据结构500题.:
人民邮电.20##4月.49页~62页
[11]蒋盛益.数据结构学习指导与训练.:
中国水利水电.20##.42页~57页
[12]朱战立.数据结构〔C++语言描述〕.:
高等教育.20##.1页~50页
[13]李大友.数据结构与算法.:
机械工业.1996年.65页~67页
[14]严蔚敏,吴伟民.数据结构.:
清华大学.1997年.83页~102页
[15]徐孝凯.数据结构实用教程〔C/C++描述〕.:
清华大学.1999年.66页~89页
[16]王立柱.C/C++与数据结构.:
清华大学.20##.20页~39页
附录:
为了更好的体现本程序,特将代码列出,以作为参考.
在头文件string.h中,代码如下:
//string.h
#include<
iostream>
string>
usingnamespacestd;
classString
public:
boolStrAssign(char*chars);
//生成一个其值为chars的串
char*Mytoupper(char*src);
//转换函数大写
char*Mytolower(char*src);
//转换函数小写
intLength();
//求串的长度
boolInsert();
//插入一个子串
boolDelete();
//删除一个子串
intIndex();
//定位
voidprint();
//输出函数
voiddisplay();
voidStrcopy();
//复制串
intpare(Strings);
//比较两个串的大小
boolconcat(Strings);
//将两个串合成一个串
boolsubstring(String&
sub);
//返回子串
voidstrrev();
//串反转
intvowel(chara);
intcount_vowel(constchar*s);
//计算元音个数
inthuiwen(char*str);
//判断字符串是否是回文
private:
intmaxlen;
//串的最大长度
intcurlen;
//串的当前长度
charstr[40];
//建立一个数组str
};
//endofstring.h在源程序string.cpp中,代码如下:
//string.cpp
#include"
string.h"
StrAssign(char*chars)//生成一个其值为chars的串
maxlen=100;
maxlen)//判断chars的长度是否大于串的最大长度
//串的长度等于chars的长度
for(inti=0;
curlen;
str[i]=chars[i];
//将chars里的值赋给串
char*String:
Mytoupper(char*src)//转换函数大写
cout<
<
"
转换成大写:
;
char*p=src;
while(*p!
='
\0'
)
if(96<
*p&
*p<
123)//如果字符的值在96和123之间
{
*p=(*p-32);
//将其值减去32
}
p++;
returnsrc;
Mytolower(char*src)//转换函数小写
转换成小写:
endl;
char*p=src;
)
if(64<
91)//如果字符的值在64和91之间
*p=(*p+32);
//将其值加上32
Length()//求长度
该字符串的长度是:
returncurlen;
//返回串的当前长度
Insert()//插入
intpos;
//要插入的位置
请输入所要插入的位置:
cin>
>
pos;
inttlen;
//要插入的子串
chars[20];
请输入所要插入的子串:
s;
tlen=strlen(s);
if(pos<
0||pos>
curlen)//判断pos位置是否合法
for(inti=curlen-1;
i>
=pos-1;
i--)
str[i+tlen]=str[i];
//移位,空出子串的位置
for(i=0;
tlen;
str[pos+i-1]=s[i];
//将子串插入主串中
curlen=curlen+tlen;
Delete()//删除
//要删除的位置
请输入所要删除的子串的位置:
//要删除的子串的长度
请输入所要删除的子串的长度:
curlen)//判断位置是否合法
for(inti=pos-1;
str[i]=str[i+tlen];
//将所删除的子串的位置填上
curlen=curlen-tlen;
Index()//定位
inti,j,k=0,tlen;
//i是串的下标,j是所要查找的子串的下标,tlen是子串的长度
ch