问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

(1)建立字符串类 (2)利用运算符重载的概念实现串赋值(=)、串比较(==、!=、<、>)、串连接(+)运算; (3

发布网友 发布时间:2022-04-14 20:50

我来回答

2个回答

热心网友 时间:2022-04-14 22:20

先声明网上看到的,大概看了下,应该符合你的要求
/*具体要求:
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;
}
/*赋值符号在重载时,不能作为类的友元函数,只能是类的成员函数*/

热心网友 时间:2022-04-14 23:38

网上摘的和自己做的有什么很大的区别么,我们给你做了你拿去用同样也是网上摘的追问网上的我看了,写的大部分都是错的,我是不会写,会写的话肯定给别人现写。。。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
华为p7支持法语操作系统? 大白鲨HD6750 1GB GDDR5白金版这个显卡怎么样? 请高手们看看我的配置,加装显卡精影HD6670和HD6750哪个比较合适点... 蓝宝石HD 6750 1GB GDDR5白金版基本参数 ...HD5770 HD6750 HD6670 这几个显卡哪个好一些?大神们帮帮忙 蓝宝HD6750 1GB GDDR5白金版重要参数 ...是蓝宝石 HD6670 1G DDR5 白金版 HD6770 1G DDR5 白金版 HD6750 1G... 蓝宝石: HD6750/1G 黄金版和HD6670 1GB GDDR5白金版哪个好点啊?我的... 如何理解“从众”心理是一把“双刃剑”。 领动用5W30还是用5W40啊 请问有的资产评估题用年金现值系数的公式,有的用整付现值系数的那个公式?两者的区别是什么?内行指点~~ 银行承兑汇票的会计分录! 怎样用PS抠透明的婚纱照 傍一组词有哪些 PCB生产加工需要什么设备呢? 开个钣金加工厂需要多少资本 加工彩钢瓦都需要什么设备? 做橱柜台面要哪些机器设备 七彩雷龙好养不,对水质要求高不,缸里有石头造景行不,还有就是买雷龙一公一母回来他俩下仔吗 彩钢板裁板机为什么切薄板剪不断? 河北太行山的大青石盐酸洗后能当水草缸造景的青龙石用吗? 做整体橱柜要买哪些机器设备? 怎么利用石头造景 皮革裁剪起来麻烦吗?用什么机器裁好? 大家造景用的石头都是哪里弄的? 剪裁1mm厚度不锈钢板,哪种剪板机裁板机剪裁的精确? 青龙石和火山石可以一起造景吗 生态板裁板机价格 山上自己采的青龙石水族箱造景石头先要怎样处理 双划线锯片裁板机和普同裁板锯有何不同 大学线下小游戏有哪些 什么线下活动玩起来会最带劲最刺激呢? 我们有个大学生线下聚会的活动,人数是100人,搞些什么小游戏或者活动比较好玩些? 团队互动小游戏怎么做更有趣又有意义? 这次《植物大战僵尸:全明星》的线下互动展都有那些活动内容? 什么是互动小游戏 求一个与物流相关的真人线下挑战类小游戏、小活动 如果微信发红包或者转账给别人然后对方收到钱后拉黑钱能拿回来不?_百... 台湾股市的介绍 《一壶老酒》歌颂出了英雄的伟大,也唱出了母爱的深明大义! 有个教师合唱比赛需要 用现代诗做串词 : 东方红&#47;走进新时代&#47;相信 东方 长治市石子湖公园在哪 ? 黄冈市石子湖公园在哪 ? 一壶老酒的歌词是啥? 游戏森林石头湖在哪里 文章之间的串词 萤火虫展为什么会被紧急叫停? 广州大学城石头湖有没有竹林 有谁知道株洲石子湖公园管理处的电话吗?我想去那摆摊 unturned hawaii石头湖心怎么出去