串基本操作的演示Word文件下载.docx
《串基本操作的演示Word文件下载.docx》由会员分享,可在线阅读,更多相关《串基本操作的演示Word文件下载.docx(26页珍藏版)》请在冰豆网上搜索。
UNEQUAL"
。
(3)联接。
C
将两串拼接产生结果串,它的内部名和串值都显示出来。
(4)求长度。
L〈串标识>
显示串的长度。
(5)求子串。
S
+<
数1>
数2>
如果参数合法,则显示子串的内部名和串值。
数>
不带正负号。
(6)子串定位。
I
显示第二个串在第一个串中首次出现时的起始位置。
(7)串替换。
R
串标识3>
将第一个串中所有出现的第二个串用第三个串替换,显示结果串的内部名和串值,原串不变。
(8)显示。
P
显示所有在系统中被保持的串的内部名和串值的对照表。
(9)删除。
D
内部名>
删除该内部名对应的串,即赋值的逆操作。
(10)退出。
Q
结束程序的运行。
在上述命令中,如果一个自变量是串,则应首先建立它。
基本操作函数的结果(即函数值)如果是一个串,则应在尚未分配的区域内新辟空间存放。
【测试数据】
自定。
但要包括以下几组:
(1)E
‘’
‘’<
应显示"
(2)E
‘abc’
‘abcd’<
(3)C
‘
(4)I
‘a’
应报告:
参数非法。
(5)R
‘aaa’
‘aa’
‘b’<
应显示'
ba’
(6)R
‘aaabc’
‘aab’<
应显示’aabaabaabbc’。
(7)R
‘Faaaaaaaa’
‘aaaa’
‘ab’,<
应显示’Fabab’。
二、概要设计
实现串的抽象数据类型和实现其基本操作,程序中将涉及下列抽象数据类型:
1.定义串的基本主结构
ADTString{
数据对象:
D={ai|ai∈charcaterset,i=1,2,…,n,n>
=0}
数据关系:
R1={<
ai-1,ai>
|ai-1,ai∈D,i=1,2,…,n}
基本操作:
compare(hstrings,hstringt)
初始条件:
S和T是已存在的Hstring类型。
操作结果:
比较其值,显示结果“UNEQUAL”或“EQUAL”。
length(hstrings)
S是已存在的Hstring类型。
返回该串的长度。
concat(hstring&
t,hstrings1,hstrings2)
S1和S2是已存在的Hstring类型。
由S1和S2联接成新串。
index(hstrings,hstringt,intpos)
显示第二个串在第一个串中首次出现的起始位置。
replace(hstring&
s,hstringt,hstringv)
M、t和v是已存在的Hstring类型。
将第一个串中所有出现的第二个串用第三个串替换,显示结果串的内部名和串值,原串不变。
sub(hstring&
sub,hstrings,intpos,intlen)
如果参数合法,则显示子串的内部名和串值。
display(HStringS)
显示串S的内部名和串值。
copy(hstring&
t,hstrings)
由串s复制得串t
getin(intn)
处理命令串S1,
把串值存入串头表中
}ADTString
三、详细设计
1、自定义数据类型
typedefstructhstring{
char*ch;
intlength;
}hstring;
hstringheadlist[100];
//串头数组
2、基本操作函数
1、赋值
voidstrassign(){
charc;
inti;
chara[20];
while((c=getchar())!
='
\n'
){
if(c=='
\'
'
i=0;
)
a[i++]=c;
headlist[curnum].ch=(char*)malloc((i+1)*sizeof(char));
headlist[curnum].length=i;
for(i=0;
i<
headlist[curnum].length;
i++)
headlist[curnum].ch[i]=a[i];
curnum++;
}
printf("
内部名:
%d串值:
"
curnum-1);
=headlist[curnum-1].length-1;
%c"
headlist[curnum-1].ch[i]);
\n"
);
}
2比较
voidcompare(){
inti,m,n,j=0;
if(c>
=48&
&
c<
=57){
b[i++]=c;
while((c=getchar())>
=57)//还是数字
b[i]='
\0'
;
s[j]=atoi(b);
j++;
s[j++]=curnum++;
if(s[0]>
=curnum||s[1]>
=curnum)
参数不合法\n"
else{
j=strcompare(headlist[s[0]],headlist[s[1]]);
if(j==0)printf("
EQUAL\n"
elseprintf("
UNEQUAL\n"
3、求长
voidlength(){
s[j]=curnum++;
=curnum){printf("
return;
%d\n"
headlist[s[0]].length);
4、连接
voidconcat(){
连接后串内部名:
curnum);
strconcat(headlist[curnum++],headlist[s[0]],headlist[s[1]]);
5、子串定位
voidindex(){
strindex(headlist[s[0]],headlist[s[1]],1));
6、显示
voiddisplay(){
inti,j;
){;
curnum;
i++){
\n内部名%d"
i);
for(j=0;
j<
headlist[i].length;
j++)
headlist[i].ch[j]);
7、删除
voidDelete(){
=curnum)printf("
elseclearstring(headlist[s[0]]);
8求子串
voidsub(){
j=substring(headlist[curnum],headlist[s[0]],s[1],s[2]);
if(j==1){
子串内部名:
%d"
s[2];
headlist[curnum].ch[i]);
9、替换
voidreplace(){
strcopy(headlist[curnum],headlist[curnum-3]);
strreplace(headlist[curnum-1],headlist[curnum-3],headlist[curnum-2]);
headlist[curnum-1].length;
%C"
3、主函数
voidmain(){
**************************************************************\n"
A:
赋值E:
判相等C:
联接L:
求长度\nS:
求子串I:
子串定位R:
串替换P:
显示\nD:
删除Q:
退出\n"
请输入命令:
while((c=getchar())!
Q'
switch(c){
case'
E'
:
compare();
printf("
串数:
break;
A'
strassign();
break;
L'
length();
C'
concat();
\n串数:
I'
index();
P'
display();
D'
Delete();
S'
sub();
R'
replace();
四、调试分析
五、用户手册
1.本程序的运行环境为DOS操作系统,执行文件为:
数据结构课程设计.exe.
2.进入程序后即会显示可以使用的命令和命令用途和对应命令的语法格式的列表,用户可以根据命令列表输入正确的命令。
如果输入正确就会显示相应的结果,接着可以输入下一条命令。
如果输入错误,会显示相应的错误的原因并提示重新输入命令。
3.命令是以回车为结束的标志。
4.本程序只能输入字符串,且字符串支持空格符,不过字符串必须用双单引号括住。
所以Delete命令需要输入的数字也必须用双单引号括住。
但命令Substring并不需要如此,在提示“请输入子串的开始位置:
”和“请输入子串的结束中位置:
”直接输入数字即可。
5.命令Subsring在输出正确结果后会接着输出“此命令不存在!
请重新输入!
”此提示,此问题一直都没有解决,也是该程序的缺陷,但是结果是正确的。
6.若要退出程序,请键入命令:
Q。
六、测试结果
(1)E‘’‘’
命令输出的结果为:
EQUAL
(2)E‘abc’‘abcd’
UNEQUAL
(3)I‘a’‘’
语法格式错误!
(4)R‘aaa’‘aa’’b’
命令输出的结果为:
ba
(5)R‘aaabc’’a’’aab’
aabaabaabbc
(6)R‘aaaaaaaa’‘aaaa’‘ab’
abab
(7)A‘string’
新赋值的字符串的内部名为:
4,串值为:
string
七、实验中出现的问题、解决方法和心得体会
这个实验是对串的操作的时间,实现串操作的基本函数,在接受命令的输入格式方面,试了很多种方法。
开始时尝试过用getchar()函数来接收命令,并根据接受到的指令进行操作。
在调试程序的过程中,遇到一些结果不正确或超出范围的情况,又要重新返回相应的函数进行检查和修改补充,才能使程序更加健壮和完整,才能做出一个更加实用的软件
八、附录
源程序
#include<
stdio.h>
stdlib.h>
math.h>
malloc.h>
intcurnum=0;
//系统中现有的串的数目
ints[3];
//命令的串参数的内部名(最多3)
chara[20];
charb[5];
intstrcompare(hstrings,hstringt){
//若s>
t,则返回值>
0;
若s=t,则返回值=0;
若s<
t,则返回值<
s.length&
t.length;
++i)
if(s.ch[i]!
=t.ch[i])returns.ch[i]-t.ch[i];
returns.length-t.length;
voidclearstring(hstring&
s){
//将s清为空串
if(s.ch){
free(s.ch);
s.ch=0;
s.length=0;
voidstrconcat(hstring&
t,hstrings1,hstrings2){
//用t返回由s1和s2联接而成的新串
if(t.ch)free(t.ch);
if(!
(t.ch=(char*)malloc((s1.length+s2.length+1)*sizeof(char)))){
overflow\n"
return;
=s1.length-1;
t.ch[i]=s1.ch[i];
t.length=s1.length+s2.length;
for(i=s1.length,j=0;
=t.length-1;
i++,j++)
t.ch[i]=s2.ch[j];
t.ch[i]);
intsubstring(hstring&
sub,hstrings,intpos,intlen){
//用sub返回