实验四 串
一、实验目的
(1)熟悉串的类型定义。
(2)熟练掌握顺序串的基本操作。
二、实验内容 定义如下的顺序串:1
2
3
4typedef struct newstr{
char str[MAX_LEN];
int str_len;
}Sstring;
编制一C程序,实现串的如下操作:
串赋值 assign(s,t) —-将一个字符串常量赋给串s,即生成 一个其值等于t的顺序串s。
获取串长度strLength(s)—- 计算并返回顺序串s的长度(即s的字符个数)。
串连接 concat(s,t) —- 返回由两个顺序串s和t连接在一起形成的新串(注意:s 和 t 不能改变)。
求子串 subStr(s,k , len) ——-返回顺序串s中从第k(1≤k≤StrLength(s))个字符开始的、由连续len个字符组成的子顺序串。
插入insStr (s,i,t) —– 将字符串t插入到顺序串s的第k(1≤i≤strLength(s)+1)个字符中,即将t的第一个字符作为s的第i个字符, t 的第二个字符作为是的第i+1个字符,以此类推。并返回产生的新串。算法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19if (i<1 || i>s.str_len) return ERROR;
len=strlen(t);
for (j=0; j<len; j++) {
p=i+j;
for (k=0; k<s.str_len -p +1; k++){
s.str\[s.str\_len-k\]=s.str\[s.str\_len -k-1\];
}
s.str\[i+j-1\] = *(str+j);
s.str_len++;
}串删除 delStr (s,i,j) —–从顺序串s中删去从第i(1≤i≤strLength(s))个字符开始的长度为j的子串,并返回产生新串,算法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13if (i<1 || i>s.str_len) return ERROR;
for (j=0; j<l; j++) {
for (k=0; i+k<s.str_len ; k++){
s.str\[i-1+k\]=s.str\[i+k\];
}
s.str_len--;
}显示 串dispStr(s) 在屏幕上显示顺序串s的所有字符,字符之间不能有空格或制表符。
利用如上定义的字符串,实现如下操作:
将”Hello everyone, “ 赋值(用前面定义的串赋值 assign(s,t),后同)给串变量 string1; “I love you! “ 赋值给串变量string2,然后将string1和string2 合并(用串连接 concat(s,t) )得到串string3,并在屏幕上显示string3及其的长度。
找出顺序串(用求子串 subStr(s,k , len) )string3第7个字符开始的连续5个字符,以及第19个字符后的连续4个字符,并在屏幕上显示。
删除(用串删除 delStr (s,i,j) ) string3中的第7个字符起的连续8个字符,然后用 “ Data Structure” 插入string3的第7个字符起的位置,并在屏幕上显示插入后的串string3及其长度。
附:程序输出样例:
三、实验要求: (1)实验报告中需要显示所建立的抽象数据模型。 (2)按步骤将程序运行结果截图写入实验报告。 (3)实验需要在两周内按时完成。
学习资料:
-
顺序串:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
using namespace std;
//定义顺序串
typedef struct newstr{
char str\[MAX_LEN\];
int str_len;
}Sstring;
//串赋值
Sstring assign(Sstring s,char t\[\]){
int i;
for(i=0;t\[i\]!='\\0';i++)
{
s.str\[i\]=t\[i\];
}
s.str_len=i;
return s;
}
int test(int a,int b){
int c;
c=a+b;
}
//获取串长度
int strLength(Sstring s){
return s.str_len;
}
//串连接
Sstring concat(Sstring s,Sstring t)
{
int i;
Sstring str;
str.str\_len=s.str\_len+t.str_len; //连接后的长度
for(i=0;i<s.str_len;i++)
{
str.str\[i\]=s.str\[i\];
}
for(i=0;i<t.str_len;i++)
{
str.str\[i+s.str_len\]=t.str\[i\];
}
return str;
}
//求子串
Sstring subStr(Sstring s,int k,int len)
{
Sstring str;
int i;
str.str_len=0;
if(k<0||k>s.str\_len||k+len-1>s.str\_len)
{
return str;
}
for(i=0;i<len;i++)
{
str.str\[i\]=s.str\[k+i-1\];
}
str.str_len=len;
return str;
}
//插入字符串
Sstring insStr(Sstring s,int i,char *t)
{
int len,j,p,k;
if (i<1 || i>s.str_len) printf("cannot insert!");
len=strlen(t);
for (j=0; j<len; j++) {
p=i+j;
for (k=0; k<s.str_len -p +1; k++){
s.str\[s.str\_len-k\]=s.str\[s.str\_len -k-1\];
}
s.str\[i+j-1\] = *(t+j);
s.str_len++;
}
return s;
}
//串删除
Sstring delStr(Sstring s,int i,int j)
{
int l,k;
l=strLength(s);
if (i<1 || i>s.str_len) printf("cannot insert!");
for (l=0; l<j; l++) {
for (k=0; i+k<s.str_len ; k++){
s.str\[i-1+k\]=s.str\[i+k\];
}
s.str_len--;
}
return s;
}
//显示串
int dispStr(Sstring s){
int i=0;
if(s.str_len>0)
{
for(i=0;i<s.str_len;i++)
{
printf("%c",s.str\[i\]);
}
printf("\\n");
}
}
int main(){
Sstring s,string1,string2,string3;
char t\[100\]="Hello everyone, ";
char t2\[100\]="I love you! ";
//串赋值
string1 = assign(s,t);
string2 = assign(s,t2);
//串连接
string3 = concat(string1,string2);
//显示串
dispStr(string3);
printf("\\n");
//串长度
printf("The length of string3 is:%d \\n\\n",strLength(string3));
//找出顺序串
printf("string3第7个字符开始的连续5个字符是 %s \\n\\n",subStr(string3,7,5));
printf("string3第19个字符开始的连续4个字符是 %s \\n\\n",subStr(string3,19,4));
//串删除
string3 = delStr(string3,7,8);
//串插入
char t3\[100\]="Data Structure";
string3 = insStr(string3,7,t3);
dispStr(string3); //显示串
printf("The length of string3 is:%d \\n\\n",strLength(string3));
return 0;
}