c++课程设计:通过运算符的重载,实现字符串的各种操作。
具体要求:1.使用动态分配存储空间的方法存放字符串,避免使用预先定义的长度很大的数组;2.定义字符串类String,定义相关成员函数(可以是运算符重载函数)实现字符串的连...
具体要求:
1.使用动态分配存储空间的方法存放字符串,避免使用预先定义的长度很大的数组;
2.定义字符串类String,定义相关成员函数(可以是运算符重载函数)实现字符串的连接(+)、拷贝(=和拷贝构造函数)、去掉串首、串尾与子串相同的字符(-),子串在主串中的定位,用新子串更换主串中的指定子串、求字符串的长度等;
3.在主函数main()中添加程序中定义String类的各成员函数的测试语句,来验证字符串处理函数的功能。
------------------------------------------------------------------------------------
这是一个课程设计,请高手能够做的像课程设计一些啊,谢谢! 展开
1.使用动态分配存储空间的方法存放字符串,避免使用预先定义的长度很大的数组;
2.定义字符串类String,定义相关成员函数(可以是运算符重载函数)实现字符串的连接(+)、拷贝(=和拷贝构造函数)、去掉串首、串尾与子串相同的字符(-),子串在主串中的定位,用新子串更换主串中的指定子串、求字符串的长度等;
3.在主函数main()中添加程序中定义String类的各成员函数的测试语句,来验证字符串处理函数的功能。
------------------------------------------------------------------------------------
这是一个课程设计,请高手能够做的像课程设计一些啊,谢谢! 展开
2个回答
展开全部
/*具体要求:
1.使用动态分配存储空间的方法存放字符串,避免使用预先定义的长度很大的数组;
2.定义字符串类String,定义相关成员函数(可以是运算符重载函数)实现字符串的连接(+)、
拷贝(=和拷贝构造函数)、去掉串首、串尾与子串相同的字符(-),子串在主串中的定位
,用新子串更换主串中的指定子串、求字符串的长度等;
3.在主函数main()中添加程序中定义String类的各成员函数的测试语句,来验证字符串处理函数的功能。
------------------------------------------------------------------------------------
这是一个课程设计,请高手能够做的像课程设计一些啊,谢谢!*/
#include<iostream.h>
#include<string.h>
class CString
{
public:
friend int main();
CString();
CString(CString &s);
CString(char *s);
friend bool operator >(CString s1,CString s2);
friend bool operator <(CString s1,CString s2);
friend bool operator ==(CString s1,CString s2);/*字符串比较*/
friend CString operator + (CString &s1,CString &s2);/*字符串连接*/
friend CString operator - (CString &s1,CString &s2);/*去掉串首、串尾与子串相同的字符*/
friend void update(CString &s1,CString &s2);/*用新子串更换主串中的指定子串*/
CString & operator =(CString &s)/*拷贝(=和拷贝构造函数)*/
{
if(str!=NULL)
delete str;
str=new char[strlen(s.str)+1];
strcpy(str,s.str);
return *this;
}
void display();
~CString();
private:
char *str;
};
CString::CString()
{
str=NULL;
}
CString::CString(CString &s)
{
str=new char[strlen(s.str)+1];
if(str!=NULL)
{
strcpy(str,s.str);
}
}
CString::CString(char *s)
{
str=new char[strlen(s)+1];
if(str!=NULL)
{
strcpy(str,s);
}
}
bool operator >(CString s1,CString s2)
{
if(strcmp(s1.str,s2.str)>0)
return true;
else
return false;
}
bool operator <(CString s1,CString s2)
{
if(strcmp(s1.str,s2.str)<0)
return true;
else
return false;
}
bool operator ==(CString s1,CString s2)
{
if(strcmp(s1.str,s2.str)==0)
return true;
else
return false;
}
CString operator + (CString &s1,CString &s2)
{
char *temp;
temp=new char[strlen(s1.str)+strlen(s2.str)+1];
strcpy(temp,s1.str);
strcat(temp,s2.str);
CString result(temp);
return result;
}
CString operator - (CString &s1,CString &s2)
{
cout<<"必须确保s2是s1的字串!"<<endl;
int i=0,j=0,mark=0;/*记录字符串中字符开始相等的位置。*/
int temps1=strlen(s1.str);
int temps2=strlen(s2.str);
if(temps1-1>=temps2-1)
{
while(i<temps2&&j<temps1)
{
if(s1.str[j]==s2.str[i])
{
int k=j;/*这样可以保证k并不是一直随j只增加而增加,只有满足一定条件才增加*/
while(s1.str[j]==s2.str[i])
{
/*const k=j;/*用k暂时记下j的位置*//**************出错k不应该增加随j增加而增加****************/
j++;
i++;/*同时往后走*/
if(i==temps2-1)
{
mark=k;
break;
}
}
if(i==temps2-1)
{
mark=k;
break;/*为跳出了判断外层循环*/
}
}
if(s1.str[j]!=s2.str[i])
{
mark=0;/*mark恢复为原位置*/
i=0;/*字串恢复到起始位置*/
j++;/*表示主字符串的下标*/
}
}
}
/*此时已找到字符相等的起始位置mark*/
CString s1temp1;
CString s1temp2;
// if(mark!=0)
// {
s1temp1.str=new char[mark+1];
for(i=0;i<mark;i++)
{
s1temp1.str[i]=s1.str[i];
}
s1temp1.str[i]='\0';
// }
s1temp2.str=new char[temps1-mark+1];
for(i=0;i<temps1-temps2-mark;i++)
{
s1temp2.str[i]=s1.str[mark+temps2+i];
}
s1temp2.str[i]='\0';
// if(mark==0)
// {
// s1.str=s1temp2.str;
// }
// else
// {
s1=s1temp1+s1temp2;
return s1;
}
void update(CString &s1,CString &s2)/*用s2更新s1中指定的字符串*/
{
int i,j,begin,end;
int length1=strlen(s1.str);
int length2=strlen(s2.str);
cout<<"请输入你要更新的字串在主串中的起始位置和终止位置:";
cout<<"注意位置范围(0,"<<(length1-1)<<")"<<endl;
cin>>begin>>end;
CString s1temp1;
CString s1temp2;/*把主串分为两段分别存储*/
CString stemp;/*因为要更行字符串,更新后字符串可能会边长,故重新定义一个CString变量,用来存放更新后的字符串*/
s1temp1.str=new char[begin+1];
for(i=0;i<begin;i++)
{
s1temp1.str[i]=s1.str[i];
}
s1temp1.str[i]='\0';
s1temp2.str=new char[length1-end+length2-1];
for(i=0,j=end+1;j<length1;i++,j++)
{
s1temp2.str[i]=s1.str[j];
}
s1temp2.str[i]='\0';
stemp.str=new char[length1+length2-(end-begin+1)];
stemp=s1temp1+s2;
stemp=stemp+s1temp2;
stemp.str[strlen(stemp.str)]='\0';
cout<<"用新子串更换主串中的指定子串:"<<stemp.str<<endl;
}
CString::~CString()
{
if(str!=NULL)
{
delete str;
}
}
void CString::display()
{
if(str!=NULL)
{
int temp=strlen(str);
cout<<"字符串"<<str<<"的长度"<<temp<<endl;
}
}
int main()
{
void Update1(CString &s1,CString &s2);
CString s1("liqiankun"),s2("hennansheng"),s3("qian");
cout<<"s1:";s1.display();
cout<<"s2:";s2.display();
cout<<"s3:";s3.display();
if(s1>s2)
{
cout<<"s1大于s2";
cout<<endl;
}
else if(s1<s2)
{
cout<<"s1小于s2";
cout<<endl;
}
else
{
cout<<"s1等于s2";
cout<<endl;
}
cout<<"主字符串:";s1.display();
cout<<"要删除的子字符串:";s3.display();
s1=s1-s3;
cout<<"去掉串首、串尾与子串相同的字符后"<<endl;
cout<<"s1:";s1.display();
cout<<"主字符串:";s1.display();
cout<<"新字符串:";s2.display();
update(s1,s2);
return 0;
}
/*赋值符号在重载时,不能作为类的友元函数,只能是类的成员函数*/
/*完全按你要求做的,已经调试好了,应该都满足你的要求,各种功能都有体现,其中”+"在程序中就有体现,要是有什么不满的,你自己在修改修改吧。程序好像反应有点慢,不知是不是我电脑的问题,你自己看看吧,要是不懂再联系我,呵呵*/
1.使用动态分配存储空间的方法存放字符串,避免使用预先定义的长度很大的数组;
2.定义字符串类String,定义相关成员函数(可以是运算符重载函数)实现字符串的连接(+)、
拷贝(=和拷贝构造函数)、去掉串首、串尾与子串相同的字符(-),子串在主串中的定位
,用新子串更换主串中的指定子串、求字符串的长度等;
3.在主函数main()中添加程序中定义String类的各成员函数的测试语句,来验证字符串处理函数的功能。
------------------------------------------------------------------------------------
这是一个课程设计,请高手能够做的像课程设计一些啊,谢谢!*/
#include<iostream.h>
#include<string.h>
class CString
{
public:
friend int main();
CString();
CString(CString &s);
CString(char *s);
friend bool operator >(CString s1,CString s2);
friend bool operator <(CString s1,CString s2);
friend bool operator ==(CString s1,CString s2);/*字符串比较*/
friend CString operator + (CString &s1,CString &s2);/*字符串连接*/
friend CString operator - (CString &s1,CString &s2);/*去掉串首、串尾与子串相同的字符*/
friend void update(CString &s1,CString &s2);/*用新子串更换主串中的指定子串*/
CString & operator =(CString &s)/*拷贝(=和拷贝构造函数)*/
{
if(str!=NULL)
delete str;
str=new char[strlen(s.str)+1];
strcpy(str,s.str);
return *this;
}
void display();
~CString();
private:
char *str;
};
CString::CString()
{
str=NULL;
}
CString::CString(CString &s)
{
str=new char[strlen(s.str)+1];
if(str!=NULL)
{
strcpy(str,s.str);
}
}
CString::CString(char *s)
{
str=new char[strlen(s)+1];
if(str!=NULL)
{
strcpy(str,s);
}
}
bool operator >(CString s1,CString s2)
{
if(strcmp(s1.str,s2.str)>0)
return true;
else
return false;
}
bool operator <(CString s1,CString s2)
{
if(strcmp(s1.str,s2.str)<0)
return true;
else
return false;
}
bool operator ==(CString s1,CString s2)
{
if(strcmp(s1.str,s2.str)==0)
return true;
else
return false;
}
CString operator + (CString &s1,CString &s2)
{
char *temp;
temp=new char[strlen(s1.str)+strlen(s2.str)+1];
strcpy(temp,s1.str);
strcat(temp,s2.str);
CString result(temp);
return result;
}
CString operator - (CString &s1,CString &s2)
{
cout<<"必须确保s2是s1的字串!"<<endl;
int i=0,j=0,mark=0;/*记录字符串中字符开始相等的位置。*/
int temps1=strlen(s1.str);
int temps2=strlen(s2.str);
if(temps1-1>=temps2-1)
{
while(i<temps2&&j<temps1)
{
if(s1.str[j]==s2.str[i])
{
int k=j;/*这样可以保证k并不是一直随j只增加而增加,只有满足一定条件才增加*/
while(s1.str[j]==s2.str[i])
{
/*const k=j;/*用k暂时记下j的位置*//**************出错k不应该增加随j增加而增加****************/
j++;
i++;/*同时往后走*/
if(i==temps2-1)
{
mark=k;
break;
}
}
if(i==temps2-1)
{
mark=k;
break;/*为跳出了判断外层循环*/
}
}
if(s1.str[j]!=s2.str[i])
{
mark=0;/*mark恢复为原位置*/
i=0;/*字串恢复到起始位置*/
j++;/*表示主字符串的下标*/
}
}
}
/*此时已找到字符相等的起始位置mark*/
CString s1temp1;
CString s1temp2;
// if(mark!=0)
// {
s1temp1.str=new char[mark+1];
for(i=0;i<mark;i++)
{
s1temp1.str[i]=s1.str[i];
}
s1temp1.str[i]='\0';
// }
s1temp2.str=new char[temps1-mark+1];
for(i=0;i<temps1-temps2-mark;i++)
{
s1temp2.str[i]=s1.str[mark+temps2+i];
}
s1temp2.str[i]='\0';
// if(mark==0)
// {
// s1.str=s1temp2.str;
// }
// else
// {
s1=s1temp1+s1temp2;
return s1;
}
void update(CString &s1,CString &s2)/*用s2更新s1中指定的字符串*/
{
int i,j,begin,end;
int length1=strlen(s1.str);
int length2=strlen(s2.str);
cout<<"请输入你要更新的字串在主串中的起始位置和终止位置:";
cout<<"注意位置范围(0,"<<(length1-1)<<")"<<endl;
cin>>begin>>end;
CString s1temp1;
CString s1temp2;/*把主串分为两段分别存储*/
CString stemp;/*因为要更行字符串,更新后字符串可能会边长,故重新定义一个CString变量,用来存放更新后的字符串*/
s1temp1.str=new char[begin+1];
for(i=0;i<begin;i++)
{
s1temp1.str[i]=s1.str[i];
}
s1temp1.str[i]='\0';
s1temp2.str=new char[length1-end+length2-1];
for(i=0,j=end+1;j<length1;i++,j++)
{
s1temp2.str[i]=s1.str[j];
}
s1temp2.str[i]='\0';
stemp.str=new char[length1+length2-(end-begin+1)];
stemp=s1temp1+s2;
stemp=stemp+s1temp2;
stemp.str[strlen(stemp.str)]='\0';
cout<<"用新子串更换主串中的指定子串:"<<stemp.str<<endl;
}
CString::~CString()
{
if(str!=NULL)
{
delete str;
}
}
void CString::display()
{
if(str!=NULL)
{
int temp=strlen(str);
cout<<"字符串"<<str<<"的长度"<<temp<<endl;
}
}
int main()
{
void Update1(CString &s1,CString &s2);
CString s1("liqiankun"),s2("hennansheng"),s3("qian");
cout<<"s1:";s1.display();
cout<<"s2:";s2.display();
cout<<"s3:";s3.display();
if(s1>s2)
{
cout<<"s1大于s2";
cout<<endl;
}
else if(s1<s2)
{
cout<<"s1小于s2";
cout<<endl;
}
else
{
cout<<"s1等于s2";
cout<<endl;
}
cout<<"主字符串:";s1.display();
cout<<"要删除的子字符串:";s3.display();
s1=s1-s3;
cout<<"去掉串首、串尾与子串相同的字符后"<<endl;
cout<<"s1:";s1.display();
cout<<"主字符串:";s1.display();
cout<<"新字符串:";s2.display();
update(s1,s2);
return 0;
}
/*赋值符号在重载时,不能作为类的友元函数,只能是类的成员函数*/
/*完全按你要求做的,已经调试好了,应该都满足你的要求,各种功能都有体现,其中”+"在程序中就有体现,要是有什么不满的,你自己在修改修改吧。程序好像反应有点慢,不知是不是我电脑的问题,你自己看看吧,要是不懂再联系我,呵呵*/
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询