实验目的】
(1)掌握顺序串的基本概念;
(2)掌握顺序串的基本运算;
(3)加深对串数据结构的理解,逐步培养解决实际问题的编程能力。
【实验准备】
(1)串的顺序存储结构的特点及算法描述;
(2)顺序串的基本操作。
【实验要求】
(1)采用函数调用的方式完成;
(2)文件funp4-1.cpp的作用是完成顺序串的各项基本操作;
(3)实验提交必须有完整正确的程序,核心语句的注释以及程序运行结果的截图。
【实验内容】
编写一个程序,实现顺序串的各种基本运算,完成如下功能:
(1)建立串s=”abcdefghijk”和串s1=”xy”。
(2)输出串s。
(3)输出串s的长度。
(4)输出串s1。
(5)输出串s1的长度。
(6)提取串s中从第3个字符开始的4个字符而产生串s2。
(7)输出串s2。
(8)将串s1和串s2连接起来而产生串s3。
(9)输出串s3。
注:在Visual Studio 2019中不能成功运行
#include<stdio.h>
#define MAX_SIZE 100
typedef struct
{
char data[MAX_SIZE];
int length;
}SqString;
static void str_assign(SqString& s, char cstr[])
{
int i;
for (i = 0; cstr[i] != '\0'; i++)
s.data[i] = cstr[i];
s.length = i;
}
static void str_copy(SqString& s, SqString t)
{
int i;
for (i = 0; i < t.length; i++)
s.data[i] = t.data[i];
s.length = t.length;
}
static bool str_equal(SqString s, SqString t)
{
bool same = true;
if (s.length != t.length) // 长度不相等时返回false
same = false;
else
{
for (int i = 0; i < s.length; i++)
{
if (s.data[i] != t.data[i]) // 有一个对应字符不相同时返回假
{
same = false;
break;
}
}
}
return same;
}
static int str_length(SqString s)
{
return s.length;
}
static SqString str_concat(SqString s, SqString t)
{
int index;
SqString str;
str.length = 0;
for (index = 0; index < s.length; index++)
str.data[index] = s.data[index];
for (index = 0; index < t.length; index++)
str.data[s.length + index] = t.data[index];
str.length = s.length + t.length;
return str;
}
static SqString sub_str(SqString s, int start, int len)
{
int index;
SqString str;
str.length = 0;
if ((start <= 0) || (start > s.length) || (len < 0) || (start + len - 1 > s.length))
return str;
for (index = start - 1; index < start + len - 1; index++)
str.data[index - start + 1] = s.data[index];
str.length = len;
return str;
}
static SqString ins_str(SqString s1, int i, SqString s2)
{
int j;
SqString str;
str.length = 0;
if (i <= 0 || i > s1.length + 1) // 参数不正确时返回空串
return str;
for (j = 0; j < i - 1; j++) // s1.data[0...i-2]->str
str.data[j] = s1.data[j];
for (j = 0; j < s2.length; j++) // s2.data[0...s2.length-1]->str
str.data[i + j - 1] = s2.data[j];
for (j = i - 1; j < s1.length; j++) // s1.data[i-1...s1.length-1]->str
str.data[s2.length + j] = s1.data[j];
str.length = s1.length + s2.length;
return str;
}
static SqString del_str(SqString s, int start, int len)
{
int index;
SqString str;
str.length = 0;
if ((start <= 0) || (start > s.length) || (start + len > s.length + 1))
return str;
for (index = 0; index < start - 1; index++) // s.data[0...start-2]->str
str.data[index] = s.data[index];
for (index = start + len - 1; index < s.length; index++) // s.data[start + len - 1...s.length-1]->str
str.data[index - len] = s.data[index];
str.length = s.length - len;
return str;
}
static SqString rep_str(SqString s, int start, int len, SqString t)
{
int index;
SqString str;
str.length = 0;
if ((start <= 0) || (start > s.length) || (start + len - 1 > s.length))
return str;
for (index = 0; index < start - 1; index++)
str.data[index] = s.data[index];
for (index = 0; index < t.length; index++)
str.data[start + index - 1] = t.data[index];
for (index = start + len - 1; index < s.length; index++)
str.data[t.length + index - len] = s.data[index];
str.length = s.length - len + t.length;
return str;
}
static void disp_str(SqString s)
{
int i;
if (s.length > 0)
{
for (i = 0; i < s.length; i++)
printf("%c", s.data[i]);
printf("\n");
}
}
int main(int argc, char* argv[])
{
SqString s, s1, s2, s3, s4;
printf("顺序串的基本运算如下:\n");
printf(" (1)建立串s和串s1\n");
str_assign(s, "abcdefghijk");
str_assign(s1, "xy");
printf(" (2)输出串s:");
disp_str(s);
printf(" (3)串s的长度:%d\n", str_length(s));
printf(" (4)输出串s1:");
disp_str(s1);
printf(" (5)串s1的长度:%d\n", str_length(s1));
printf(" (6)提取串s的第3个字符开始的4个字符而产生串s2\n");
s2 = sub_str(s, 3, 4);
printf(" (7)输出串s2:");
disp_str(s2);
printf(" (8)将串s1和串s2连接起来而产生串s3\n");
s3 = str_concat(s1, s2);
printf(" (9)输出串s3:");
disp_str(s3);
return 0;
}