第 04 章作业答案.docx
《第 04 章作业答案.docx》由会员分享,可在线阅读,更多相关《第 04 章作业答案.docx(8页珍藏版)》请在冰豆网上搜索。
第04章作业答案
习题
习题(p.119)
1.设s=’IAMASTUDENT’,t=’GOOD’,q=’WORKER’。
给出下列操作的结果:
StrLength(s);SubString(sub1,s,0,7);SubString(sub2,s,6,1);
StrIndex(s,4,’A’);StrReplace(s,’STUDENT’,q);
StrCat(StrCat(sub1,t),StrCat(sub2,q))。
9.写一个函数将顺序串s1中的第i个字符到第j个字符之间的字符用s2串替换。
[提示]:
包括第i个字符和第j个字符,第j个字符后面的所有字符可能需要左移或右移。
11.写算法,实现顺序串的基本操作StrReplace(&s,t,v)。
1.设s=’IAMASTUDENT’,t=’GOOD’,q=’WORKER’。
给出下列操作的结果:
StrLength(s);SubString(sub1,s,0,7);SubString(sub2,s,6,1);
StrIndex(s,4,’A’);StrReplace(s,’STUDENT’,q);
StrCat(StrCat(sub1,t),StrCat(sub2,q))。
[参考答案]
StrLength(s)=14;sub1=’IAMA_’;
sub2=’_’;StrIndex(s,’A’,4)=6;
StrReplace(s,’STUDENT’,q)=’IAMAWORKER’;
StrCat(StrCat(sub1,t),StrCat(sub2,q))
=’IAMAGOODWORKER’;
9.写一个函数将顺序串s1中的第i个字符到第j个字符之间的字符用s2串替换。
[提示]:
包括第i个字符和第j个字符,第j个字符后面的所有字符可能需要左移或右移。
Replace(s1,i,j,s2)
len=j-i+1;
//如果len>s2.len,左移缩位
if(len>s2.len)
{d=len–s2.len;
for(k=j+1;klen;k++)
s1->ch[k–d]=s1->ch[k];
}
//如果len//暂不考虑截断
elseif(len{d=s2.len–len;
for(k=s1->len–1;k>=j+1;k--)
s1->ch[k+d]=s1->ch[k];
}
//复制替换串
for(k=0;ks1->ch[i+k]=v.ch[k];
s1->len=s1->len–len+s2.len;
11.写算法,实现顺序串的基本操作StrReplace(s,t,v)。
[提示]:
●算法思路:
(1)被替换子串定位
(2)被替换子串后面的字符左移或右移(为替换子串准备房间)
(3)替换子串入住(复制)
(4)重复上述,直到……
●实现策略:
可以先采用调用子函数的方法:
(1)利用StrIndex(s,pos,t)找到被替换串的位置pos,
(2)利用Replace(s,pos,len,v),实现一次替换
(3)在此基础上,消去子函数调用即可
●采用调用子函数的方法如下:
V1:
仅完成一次代换
StrReplace(s,t,v)
{
k=StrIndex(s,0,t);
Replace(s,k,t.len,v);
}
V2:
完成多次代换(无条件)
StrReplace(s,t,v)
{
pos=0;
重复下面操作:
{
k=StrIndex(s,pos,t);
Replace(s,k,t.len,v);
pos=k+v.len;
}
}
V3:
完成多次代换(循环条件1)
StrReplace(s,t,v)
{
pos=0;
while(pos<=s->len)
{
k=StrIndex(s,pos,t);
if(k>=0)
{
Replace(s,k,t.len,v);
pos=k+v.len;
}
elsebreak;
}
}
V4:
完成多次代换(循环条件2)
StrReplace(s,t,v)
{
pos=0;
while(pos<=s->len–t.len)
{
k=StrIndex(s,pos,t);
if(k>=0)
{
Replace(s,k,t.len,v);
pos=k+v.len;
}
elsebreak;
}
}
V5:
返回完成情况状态码
intStrReplace(s,t,v)
{intflag=0;
pos=0;
while(pos<=s->len–t.len)
{
k=StrIndex(s,pos,t);
if(k>=0)
{
Replace(s,k,t.len,v);
pos=k+v.len;
flag=1;
}
elsebreak;
}
returnflag;
}
●消去子函数调用的过程如下:
V4:
完成多次代换(循环条件2)
StrReplace(s,t,v)
{
pos=0;
while(pos<=s->len–t.len)
{
k=StrIndex(s,pos,t);
if(k>=0)
{
Replace(s,k,t.len,v);
pos=k+v.len;
}
elsebreak;
}
}
V4':
完成多次代换(循环条件2)
StrReplace(s,t,v)
{
if(t.len==0)return(0);//代换失败
start=0;
while(start<=s->len–t.len)
{
//k=StrIndex(s,start,t);
i=start;j=0;
while(jif(s->ch[i]==t.ch[j]){i++;j++;}
else{if(start==s->len–t.len)
{start=-1;break;}
++start;
i=start;
j=0;
}
if(start>=0)
{
//Replace(s,start,t.len,v);
//如果t.len>v.len,左移缩位
if(t.len>v.len)
{d=t.len–v.len;
for(i=start+t.len;ilen;i++)
s->ch[i–d]=s->ch[i];
}
//如果t.len//暂不考虑截断
elseif(t.len{d=v.len–t.len;
for(i=s->len–1;i>=start+t.len;i--)
s->ch[i+d]=s->ch[i];
}
//复制替换串
for(i=0;is->ch[start+i]=v.ch[i];
s->len=s->len–t.len+v.len;
start=start+v.len;
}
elsebreak;
}
}