串基本操作的演示课程设计_第1页
串基本操作的演示课程设计_第2页
串基本操作的演示课程设计_第3页
串基本操作的演示课程设计_第4页
串基本操作的演示课程设计_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、11题 目 串基本操作的演示学院计算机学院专业网络工程一 .、课程设计任务要求在教科书4.2.2 节用堆分配存储表示实现HString 串的最小操作子集的基础上,实现串抽象数据类型的其余基本操作(不使用C 语言本身提供的串函数)。参数合法性检查必须严格。说明: (在格式中, 表示 0 个、 1 个或多个空格所组成的串。串标识表示一个内部名或一个串文字。前者是一个串的唯一标识,是一种内部形式的(而不是字符形式的)标识符。后者是两端由单引号括起来的仅可打印字符组成的序列。串内每两个连续的单引号表示一个单引号符。)利用上述基本操作函数构造以下系统:它是一个命令解释程序,循环往复地处理用户键入的每一条

2、命令,直至终止程序的命令为止。命令定义如下:( 1) 值。格式:A 串标识 回车用串标识所表示的值建立新串,并显示新串的内部名和串值。如:A Hi!( 2) 判相等。格式: E 串标识1 串标识2 回车若两串相等,则显示“EQUAL ”,否则显示“UNEQUAL ”。( 3) 联接。 格式:C 串标识1 串标识2 回车将两串联接产生结果串,它的内部名和串值都显示出来。( 4) 求长度 格式: L 串标识 回车显示串的长度。( 5) 求子串 格式:S 串标识+数1 +数2 回车如果参数合法,则显示子串的内部名和串值。数不带正负号。( 6) 串定位。格式: I 串标识1 串标识2 回车显示第二个串

3、在第一个串中首次出现时的位置。( 7) 替换格式:R 串标识1 串标识2 串标识2 回车将第一个串中出现所有出现的第二个串用第三个串替换,显示结果串的内部名和串值,原串不变。( 8) 示。格式P 回车显示所有在系统中被保持的串的内部名和串值的对照表( 9) 除。格式D 内部名 回车删除该内部名对应的串,即赋值的逆操作。( 10) 格式:Q 回车结束程序的运行。二、已完成的项目及完成程度( 11) 赋值。StrAssign( SqString &s,char cstr)( 12) 判相等。StrEqual(SqString s,SqString t)( 13) 联接。Concat(SqS

4、tring s,SqString t)( 14) 求长度。 StrLength(SqString s)( 15) 求子串。 SubStr(SqString s,int i,int j)( 6)子串定位。Index(linkstring *s,linkstring *t)( 7)串替换。 Replace(linkstring *&s,linkstring *t,linkstring *r)( 8)显示。Dispstr(linkstring *s)( 9)删除。DelStr(SqString s,int i,int j)( 0)退出。 Quit()完成了项目要求的大部分所有操作。三、理论依

5、据、用到的数据结构,及举例定义串的基本主结构ADT String数据对象:D=ai| ai charcaterset,i=1,2, ,n,n>=0数据关系:R1=<ai-1,ai>|ai-1,ai D, i=1,2, ,n基本操作:StrCompare(HString S,HString T)初始条件:S 和 T 是已存在的Hstring 类型。操作结果:比较其值,显示结果“UNEQUA” L 或“EQUA”L 。StrLength(HString S)初始条件:S 是已存在的Hstring 类型。操作结果:返回该串的长度。Concat(HString S1,HString

6、S2)初始条件:S1 和 S2是已存在的Hstring 类型。操作结果:由S1 和 S2联接成新串。Index(HString S,HString t)初始条件:S 和 T 是已存在的Hstring 类型。操作结果:显示第二个串在第一个串中首次出现的起始位置。Replace(HString M, HString t, HString v)初始条件:M 、 t 和 v 是已存在的Hstring 类型。操作结果:将第一个串中所有出现的第二个串用第三个串替换,显示结果串的内部名和串值,原串不变。SubString(HString S,int pos,int len)初始条件:S 是已存在的Hstri

7、ng 类型。操作结果:如果参数合法,则显示子串的内部名和串值。Strprint(HString S)初始条件:S 是已存在的Hstring 类型。操作结果:显示串S 的内部名和串值。getin(int n)初始条件:处理命令串S1,操作结果:把串值存入串头表中Insert(int n)初始条件:要给指定的串赋值,n 为指定的串的内部名操作结果:为指定内部名的串赋值show()初始条件:要求查看输入格式操作结果:输出各种命令的输入格式ADT Stringtypedef structchar *ch;/若是非空串,则按串长分配存储区,否则ch 为 NULLint length;/串长度HStrin

8、g;四、主要算法流程图五、主要代码引用的头文件:#include <stdio.h>#include <stdlib.h>#include <string.h>使用的结构体:typedef struct char dataMaxSize;/存放串字符int len;/串长SqString;关键函数功能实现:void Scanf(char cstrr) / 输入字符串cstrr100;printf("Enter a string:n");/ 提示用户输入字符串 int j=0;while(cstrrj=getchar()!='n&#

9、39;) j+;cstrrj='0'/串赋值void StrAssign(SqString &s,char cstr)Scanf(cstr);int i;for(i=0;cstri!='0'i+) s.datai=cstri;s.len=i;/判断串是否相等int StrEqual(SqString s,SqString t)int same=1,i;if (s.len!=t.len)/长度不相等时返回same=0; elsefor (i=0;i<s.len;i+)if (s.datai!=t.datai) /有一个对应字符不相同时返回 same=

10、0;return same;/将串t 复制给串svoid StrCopy(SqString &s,SqString t)int i;for(i=0;i<t.len;i+) s.datai=t.datai;s.len=t.len;/求串长int StrLength(SqString s)return s.len;/求子串SqString SubStr(SqString s,int i,int j)SqString str;int k;str.len=0;if(i<=0|i>s.len|j<0|i+j-1>s.len)return str;/参数不正确时返回空

11、串for(k=i-1;k<i+j-1;k+)/将s.datai.i+j复制到strstr.datak-i+1=s.datak;str.len=j;return str;/串的连接:返回由两个串连接在一起的新串SqString Concat(SqString s,SqString t)SqString str;int i;str.len=s.len+t.len;for(i=0;i<s.len;i+)/将s复制到strstr.datai=s.datai;for(i=0;i<t.len;i+)/将t复制到strstr.datas.len+i=t.datai;return str;/

12、串的替换SqString RepStr(SqString s,int i,int j,SqString t)int k;SqString str;str.len=0;/参数不正确时返回空串/将s.data0.i-2复制到str/将t 复制到 str/将 s.datai+j-1.s.len-1复制到strif(i<=0|i>s.len|i+j-1>s.len) return str;for(k=0;k<i-1;k+) str.datak=s.datak;for(k=0;k<t.len;k+)str.datai+k-1=t.datak;for(k=i+j-1;k<

13、;s.len;k+)str.datat.len+k-j=s.datak;str.len=s.len-j+t.len;return str;/串的删除SqString DelStr(SqString s,int i,int j) int k;SqString str;str.len=0;if (i<=0 | i>s.len| i+j>s.len+1) /参数不正确时返回空串printf(" 参数不正确n");return str;for (k=0;k<i-1;k+)/将s.data0 s.datai-2复制到strstr.datak=s.datak;f

14、or (k=i+j-1;k<s.len;k+)/将s.datai+j-1 datas.length-1复制到strstr.datak-j=s.datak;str.len=s.len-j;return str;/串比较int Strcmp(SqString s,SqString t) int i,comlen;/求s和 t 的共同长度if(s.len<t.len)comlen=s.len;elsecomlen=t.len;for(i=0;i<comlen;i+)/在共同长度内逐个字符比较if(s.datai<t.datai)return -1;else if(s.data

15、i>t.datai) return 1;if(s.len=t.len)return 0;else if(s.len<t.len)return -1;elsereturn 1;/s=t/s<t/s>t/输出串void DispStr(SqString str) int i;if (str.len>0)for (i=0;i<str.len;i+)printf("%c",str.datai);printf("n");/菜单函数void menus()int i,j,m,x,y;char n;printf("*n&q

16、uot;);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("

17、输出 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("EQUALn");elseprintf("NUEQUALn");menus();break;case 'C':case 'c

18、9;: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 的长度为:%dn",Str

19、Length(str1);menus();break;case 'S':case 's':printf(" 提取串 str1 的第a个字符开始的b 个字符而产生串s2n");StrAssign(str1,cstr1);int a,b;scanf("%d %d",&a,&b);s2=SubStr(str1,a,b);DispStr(s2);menus();break;case 'R':case 'r':printf(" 在串 str1 中,将第p 个字符开始的q 个字

20、符构成的子串用str2替换 ,形成s3: n");StrAssign(str1,cstr1);int p,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);int x,y;scan

21、f("%d %d",&x,&y);s3=DelStr(str1,x,y);DispStr(s3);menus();break;case 'Q':case 'q':break;void main() /主函数 menus();六、实验截图1. 测试用例(1) A s = deng 回车 ,应显示s = deng ;(2) E“ 回车,应显示“ EQUAL ”;(3) E , abc?,abcd? 回车,应显示“UNEQUAL ”;(4) I,a?“ 回车,应报告:参数非法;(5) R , dengbolun? ,2 4 ?, h

22、uizhi?回车,应显示, ba?;(6) D , dengbolun ? ,2 4?回车,应显示:dolun;(7) 7) D ,fdhagkjh?, 3 6 ? 回车,应显示:fdjh;(8) 8) C ,deng? ,bolun? 回车,应显示:dengbolun;(9) 9) L ,abcdefg?回车,应显示:7;2. 程序截图XMXXXXXMXXXXXXXXX MX*X*X XMXMXXXE刘断裙等 屣S求壬串切P显不Q退出第除联子删定位*M*M*M*XMMXMMg判断串stK和sS2是否相等:Enter a string:abc'Enter a string:abed&#

23、39;MUEQUAL从串stK中删去第i个字符开始的长度为j的子串,形成串S3: Enter a string:fdhagkjh3 6fdIXXXXXXX等HHP 术Uli 断子示显E s p出退富除 联子删颖女要连拼电两个集:一一存串st£和串sti2连接起来形成串si nter a string:longnter a string:olunlengbo lunMXXXXXXMXXXXXXXXA «<E刻断相等C联接L沃长度S求壬R串替换P显小Q退出I子串定位MMMMD 删除 xxxxxxx从串stK中删去第i个字符开始的长度为j的子串,形成串s3 : Enter

24、a string: dengbolun 2 4o lun3. 实验结果分析经检验,测试数据预期结果和测试得出结果一致。Microsoft Visual C+ 上实现的1)熟悉串的定义和串的基本操作。2)掌握顺序串的基本运算。3)加深对串数据结构的理解,逐步培养解决实际问题的编程能力。4)运用到了串的链式存储结构,对链表也有了进一步提高。附录:源代码#include <stdio.h>#include <stdlib.h>#include <string.h>/定义顺序串#define MaxSize 100typedef structchar dataMax

25、Size;/ 存放串字符int len;/串长SqString;void menus();void Scanf(char cstrr)cstrr100;printf("Enter a string:n");/ 提示用户输入字符串int j=0;while(cstrrj=getchar()!='n') j+;cstrrj='0'/串赋值void StrAssign(SqString &s,char cstr)Scanf(cstr);int i;for(i=0;cstri!='0'i+) s.datai=cstri;s.l

26、en=i;/判断串是否相等int StrEqual(SqString s,SqString t)int same=1,i;if (s.len!=t.len)/长度不相等时返回same=0;elsefor (i=0;i<s.len;i+)if (s.datai!=t.datai)/有一个对应字符不相同时返回 same=0;return same;/将串 t 复制给串svoid StrCopy(SqString &s,SqString t)int i;for(i=0;i<t.len;i+)s.datai=t.datai;s.len=t.len;/求串长int StrLength

27、(SqString s)return s.len;/求子串SqString SubStr(SqString s,int i,int j)SqString str;int k;str.len=0;if(i<=0|i>s.len|j<0|i+j-1>s.len)return str;/参数不正确时返回空串for(k=i-1;k<i+j-1;k+)/将s.datai.i+j 复制到 strstr.datak-i+1=s.datak;str.len=j;return str;/串的连接:返回由两个串连接在一起的新串SqString Concat(SqString s,Sq

28、String t)SqString str;int i;str.len=s.len+t.len;for(i=0;i<s.len;i+)/将s复制到 strstr.datai=s.datai;for(i=0;i<t.len;i+)/将t 复制到 strstr.datas.len+i=t.datai;return str;/串的替换SqString RepStr(SqString s,int i,int j,SqString t)int k;SqString str;str.len=0;if(i<=0|i>s.len|i+j-1>s.len) return str;f

29、or(k=0;k<i-1;k+)str.datak=s.datak;for(k=0;k<t.len;k+)str.datai+k-1=t.datak;for(k=i+j-1;k<s.len;k+)str.datat.len+k-j=s.datak;str.len=s.len-j+t.len;return str;/参数不正确时返回空串/将s.data0.i-2复制到str/将 t 复制到 str/将s.datai+j-1.s.len-1 复制到 str/参数不正确时返回空串/将s.data0 s.datai-2复制到 str/将s.datai+j-1 datas.length

30、-1 复制到 str/串的删除SqString DelStr(SqString s,int i,int j) int k;SqString str;str.len=0;if (i<=0 | i>s.len| i+j>s.len+1)printf(" 参数不正确n");return str;for (k=0;k<i-1;k+)str.datak=s.datak;for (k=i+j-1;k<s.len;k+)str.datak-j=s.datak;str.len=s.len-j;return str;/串比较int Strcmp(SqString

31、 s,SqString t)int i,comlen;if(s.len<t.len)comlen=s.len;/求s 和 t 的共同长度elsecomlen=t.len;for(i=0;i<comlen;i+)/在共同长度内逐个字符比较if(s.datai<t.datai)return -1;else if(s.datai>t.datai)return 1;if(s.len=t.len)return 0;/s=telse if(s.len<t.len)return -1;/s<telsereturn 1;/s>t/输出串void DispStr(SqS

32、tring str)int i;if (str.len>0)for (i=0;i<str.len;i+) printf("%c",str.datai);printf("n");void main()menus();char cstr180,cstr280;SqString str1,str2,s1,s2,s3; void menus()int i,j,m,x,y;char n;printf("*A赋值E 判断相等C联接 *n");printf("*L求长度S 求子串I子串定位*n");printf(&q

33、uot;*R串替换P 显示D删除*n");printf("*Q退出*n");printf(*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("EQU

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论