王彬第六次上机实验报告.docx
- 文档编号:4692870
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:33
- 大小:142.63KB
王彬第六次上机实验报告.docx
《王彬第六次上机实验报告.docx》由会员分享,可在线阅读,更多相关《王彬第六次上机实验报告.docx(33页珍藏版)》请在冰豆网上搜索。
王彬第六次上机实验报告
上机实验报告
实验名称
串的运行
系
信管系
姓名
王彬
任课教师
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("
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第六 上机 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)