王彬第六次上机实验报告.docx

上传人:b****6 文档编号:4692870 上传时间:2022-12-07 格式:DOCX 页数:33 大小:142.63KB
下载 相关 举报
王彬第六次上机实验报告.docx_第1页
第1页 / 共33页
王彬第六次上机实验报告.docx_第2页
第2页 / 共33页
王彬第六次上机实验报告.docx_第3页
第3页 / 共33页
王彬第六次上机实验报告.docx_第4页
第4页 / 共33页
王彬第六次上机实验报告.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

王彬第六次上机实验报告.docx

《王彬第六次上机实验报告.docx》由会员分享,可在线阅读,更多相关《王彬第六次上机实验报告.docx(33页珍藏版)》请在冰豆网上搜索。

王彬第六次上机实验报告.docx

王彬第六次上机实验报告

上机实验报告

实验名称

串的运行

信管系

姓名

王彬

任课教师

1、实验目的

(1)掌握函数的定义方法、调用方法、参数说明以及返回值;

2、实验内容

(1)编辑、编译、运行实验指导中给出的程序,并分析输出结果。

 

3、算法描述

4源程序

5#include

6#include

7#defineOVERFLOW-1

8#defineOK1

9#defineERROR0

10typedefintstatus;

11typedefstruct

12{

13char*ch;//按串长分配存储空间

14intlength;//存放串长

15}sstring;

16statusinitstring(sstring&s)

17{//初始化串,堆存储方式

18s.ch=(char*)malloc(sizeof(char));

19if(!

s.ch)returnERROR;//分配存储空间失败

20s.ch=NULL;

21s.length=0;//串长为0

22returnOK;

23}

24statusstrassign(sstring&s,char*chars)

25{//串赋值

26inti=0,j;

27if(s.ch)free(s.ch);

28while(chars[i]!

='\0')

29{

30i++;

31}//求串的长度

32s.ch=(char*)malloc(i*sizeof(char));

33if(!

s.ch)returnERROR;

34for(j=0;j

35{

36s.ch[j]=chars[j];

37}

38s.length=i;

39returnOK;

40}

41statusgetlength(sstrings,int&len)

42{//求串长

43len=s.length;

44returnlen;

45}

46statusinsert(sstring&s1,sstrings2,intpos)

47{//在字符串s1的第pos个字符之前插入字符串s2,并显示

48intj,k;

49if(pos<1||pos>s1.length+1)

50{//pos不合法

51printf("theposisawrongvalue\n");

52returnERROR;

53}

54s1.ch=(char*)realloc(s1.ch,(s1.length+s2.length)*sizeof(char));

55if(!

s1.ch)

56returnERROR;//空间分配失败

57for(j=s1.length-1,k=s1.length+s2.length-1;j>=pos-1;j--)

58{//字符串后移

59s1.ch[k]=s1.ch[j];

60k--;

61}

62for(j=s2.length-1;j>=0;j--)

63{

64s1.ch[k]=s2.ch[j];

65k--;

66}

67s1.length+=s2.length;

68printf("thenewstrings1is%s\n",s1.ch);

69returnOK;

70}

71statusdelstr(sstring&s,intpos,intj)

72{//在串s中删除从第pos个字符起长度为j的字串(此处不显示删除的字串)

73inti,k=pos,m=pos-1;

74if(pos<1||pos+j-1>s.length)

75{

76printf("参数不合法\n");

77returnERROR;

78}

79for(i=k+j-1;i<=s.length-1;i++)

80{

81s.ch[m]=s.ch[i];

82m++;

83}

84s.ch[m]='\0';

85printf("thenewstringsis%s\n",s.ch);

86returnOK;

87}

88intstrcompare(sstrings,sstrings1)

89{//比较串s和s1的大小,如果s>s1,则返回正数;如果s=s1,则返回0;如果s

90inti;

91for(i=0;i

92{

93if(s.ch[i]!

=s1.ch[i])

94returns.ch[i]-s1.ch[i];

95}

96returns.length-s1.length;

97}

98statusconcat(sstring&t,sstrings,sstrings1)

99{//由串t返回串s和s1联接而成的新串,并显示

100inti,j;

101t.ch=(char*)malloc((s.length+s1.length)*sizeof(char));

102if(!

t.ch)returnERROR;

103for(i=0;i

104{

105t.ch[i]=s.ch[i];

106}

107for(i=s.length,j=0;j

108{

109t.ch[i]=s1.ch[j];

110}

111t.ch[i]='\0';

112t.length=s.length+s1.length;

113printf("thestringtis%s\n",t.ch);

114returnOK;

115}

116statussubstr(sstring&sub,sstrings,intpos,intl)

117{//求出串s第pos个字符起长为l的字串,并用sub返回

118inti,j=0;

119if(pos<1||pos>s.length||l<1||pos+l-1>s.length)

120{

121printf("参数不合法\n");

122returnERROR;

123}

124sub.ch=(char*)malloc(l*sizeof(char));

125if(!

sub.ch)returnERROR;

126for(i=pos;i<=pos+l-1;i++,j++)

127sub.ch[j]=s.ch[i-1];

128sub.length=l;

129printf("thestringsubis%s\n",sub.ch);

130returnOK;

131}

132voidgetnext(sstringt,intnext[])

133{//求串t的next函数,并存入数组next

134inti=0,j=-1;

135next[0]=-1;

136while(i

137{

138if(j==-1||t.ch[i]==t.ch[j])

139{

140++i;++j;next[i]=j;

141}

142elsej=next[j];

143}

144}

145intKMPindex(sstrings,sstringt)

146{//KMP算法,其中s为主串,t为子串

147intnext[50],i=0,j=0,v;

148getnext(t,next);

149while(i

150{

151if(j==-1||s.ch[i]==t.ch[j])

152{

153i++;j++;

154}

155elsej=next[j];

156}

157if(j>=t.length)

158v=i-t.length;

159else

160v=-1;

161returnv;

162}

163voidmain()

164{

165sstrings1,s2,t,sub;

166charstr[50];

167intpos,len,next[50],j,v,l;

168initstring(s1);

169printf("**************初始化完毕**************\n");

170

171

172printf("*************字符串s1赋初值*************\n");

173printf("pleaseinputthechars\n");

174scanf("%s",str);

175strassign(s1,str);//字符串赋初值

176

177

178printf("*************输出字符串s1*************\n");

179printf("thestrings1is%s\n",s1.ch);//输出字符串

180printf("************字符串s1的长度为************\n");

181len=getlength(s1,len);

182printf("thelengthofthestrings1is%d\n",len);

183printf("*************字符串s2赋初值*************\n");

184initstring(s2);

185printf("pleaseinputthechars\n");

186scanf("%s",str);

187strassign(s2,str);//字符串赋初值

188printf("*************输出字符串s2*************\n");

189printf("thestrings2is%s\n",s2.ch);//输出字符串

190

191

192printf("*************字符串的插入**************\n");

193printf("在字符串s1的第pos个位置之前插入字符串s2,pos=");scanf("%d",&pos);

194printf("\n");

195insert(s1,s2,pos);

196

197

198printf("*************字符串的删除*************\n");

199printf("删除字符串s2第pos个字符起长为j的字符串\n");

200printf("pos=");scanf("%d",&pos);printf("j=");scanf("%d",&j);

201delstr(s2,pos,j);//串删除

202printf("***************串比较******************\n");

203if(strcompare(s1,s2)>0)//串比较

204printf("s1>s2\n");

205else

206if(strcompare(s1,s2)==0)

207printf("s1=s2\n");

208else

209printf("s1

210printf("***************串的合并******************\n");

211printf("将串s1,s2合并于串t后\n");

212initstring(t);

213concat(t,s1,s2);

214printf("***************取子串******************\n");

215printf("取出字符串s1第pos个字符起长为l的子串\n");

216printf("pos=");scanf("%d",&pos);

217printf("l=");scanf("%d",&l);

218substr(sub,s1,pos,l);

219printf("***************求模式串的next******************\n");

220printf("thenextofthestringis");

221getnext(s1,next);

222for(j=0;j

223{

224printf("%d",next[j]);

225}

226printf("\n");

227printf("***************串的模式匹配******************\n");

228v=KMPindex(s1,s2);

229if(v!

=-1)

230printf("从主串的第%d个字符起,匹配成功!

\n",v+1);

231else

232printf("匹配失败!

主串中没有与模式串匹配的子串\n");

233

234}

235#include

236#include

237#defineOVERFLOW-1

238#defineOK1

239#defineERROR0

240typedefintstatus;

241typedefstruct

242{

243char*ch;//按串长分配存储空间

244intlength;//存放串长

245}sstring;

246statusinitstring(sstring&s)

247{//初始化串,堆存储方式

248s.ch=(char*)malloc(sizeof(char));

249if(!

s.ch)returnERROR;//分配存储空间失败

250s.ch=NULL;

251s.length=0;//串长为0

252returnOK;

253}

254statusstrassign(sstring&s,char*chars)

255{//串赋值

256inti=0,j;

257if(s.ch)free(s.ch);

258while(chars[i]!

='\0')

259{

260i++;

261}//求串的长度

262s.ch=(char*)malloc(i*sizeof(char));

263if(!

s.ch)returnERROR;

264for(j=0;j

265{

266s.ch[j]=chars[j];

267}

268s.length=i;

269returnOK;

270}

271statusgetlength(sstrings,int&len)

272{//求串长

273len=s.length;

274returnlen;

275}

276statusinsert(sstring&s1,sstrings2,intpos)

277{//在字符串s1的第pos个字符之前插入字符串s2,并显示

278intj,k;

279if(pos<1||pos>s1.length+1)

280{//pos不合法

281printf("theposisawrongvalue\n");

282returnERROR;

283}

284s1.ch=(char*)realloc(s1.ch,(s1.length+s2.length)*sizeof(char));

285if(!

s1.ch)

286returnERROR;//空间分配失败

287for(j=s1.length-1,k=s1.length+s2.length-1;j>=pos-1;j--)

288{//字符串后移

289s1.ch[k]=s1.ch[j];

290k--;

291}

292for(j=s2.length-1;j>=0;j--)

293{

294s1.ch[k]=s2.ch[j];

295k--;

296}

297s1.length+=s2.length;

298printf("thenewstrings1is%s\n",s1.ch);

299returnOK;

300}

301statusdelstr(sstring&s,intpos,intj)

302{//在串s中删除从第pos个字符起长度为j的字串(此处不显示删除的字串)

303inti,k=pos,m=pos-1;

304if(pos<1||pos+j-1>s.length)

305{

306printf("参数不合法\n");

307returnERROR;

308}

309for(i=k+j-1;i<=s.length-1;i++)

310{

311s.ch[m]=s.ch[i];

312m++;

313}

314s.ch[m]='\0';

315printf("thenewstringsis%s\n",s.ch);

316returnOK;

317}

318intstrcompare(sstrings,sstrings1)

319{//比较串s和s1的大小,如果s>s1,则返回正数;如果s=s1,则返回0;如果s

320inti;

321for(i=0;i

322{

323if(s.ch[i]!

=s1.ch[i])

324returns.ch[i]-s1.ch[i];

325}

326returns.length-s1.length;

327}

328statusconcat(sstring&t,sstrings,sstrings1)

329{//由串t返回串s和s1联接而成的新串,并显示

330inti,j;

331t.ch=(char*)malloc((s.length+s1.length)*sizeof(char));

332if(!

t.ch)returnERROR;

333for(i=0;i

334{

335t.ch[i]=s.ch[i];

336}

337for(i=s.length,j=0;j

338{

339t.ch[i]=s1.ch[j];

340}

341t.ch[i]='\0';

342t.length=s.length+s1.length;

343printf("thestringtis%s\n",t.ch);

344returnOK;

345}

346statussubstr(sstring&sub,sstrings,intpos,intl)

347{//求出串s第pos个字符起长为l的字串,并用sub返回

348inti,j=0;

349if(pos<1||pos>s.length||l<1||pos+l-1>s.length)

350{

351printf("参数不合法\n");

352returnERROR;

353}

354sub.ch=(char*)malloc(l*sizeof(char));

355if(!

sub.ch)returnERROR;

356for(i=pos;i<=pos+l-1;i++,j++)

357sub.ch[j]=s.ch[i-1];

358sub.length=l;

359printf("thestringsubis%s\n",sub.ch);

360returnOK;

361}

362voidgetnext(sstringt,intnext[])

363{//求串t的next函数,并存入数组next

364inti=0,j=-1;

365next[0]=-1;

366while(i

367{

368if(j==-1||t.ch[i]==t.ch[j])

369{

370++i;++j;next[i]=j;

371}

372elsej=next[j];

373}

374}

375intKMPindex(sstrings,sstringt)

376{//KMP算法,其中s为主串,t为子串

377intnext[50],i=0,j=0,v;

378getnext(t,next);

379while(i

380{

381if(j==-1||s.ch[i]==t.ch[j])

382{

383i++;j++;

384}

385elsej=next[j];

386}

387if(j>=t.length)

388v=i-t.length;

389else

390v=-1;

391returnv;

392}

393voidmain()

394{

395sstrings1,s2,t,sub;

396charstr[50];

397intpos,len,next[50],j,v,l;

398initstring(s1);

399printf("**************初始化完毕**************\n");

400

401

402printf("*************字符串s1赋初值*************\n");

403printf("pleaseinputthechars\n");

404scanf("

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 广告传媒

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1