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

c++课程设计:通过运算符的重载,实现字符串的各种操作。

发布网友 发布时间:2023-08-01 12:09

我来回答

2个回答

热心网友 时间:2024-10-21 02:51

/*具体要求:
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;
}
/*赋值符号在重载时,不能作为类的友元函数,只能是类的成员函数*/
/*完全按你要求做的,已经调试好了,应该都满足你的要求,各种功能都有体现,其中”+"在程序中就有体现,要是有什么不满的,你自己在修改修改吧。程序好像反应有点慢,不知是不是我电脑的问题,你自己看看吧,要是不懂再联系我,呵呵*/

热心网友 时间:2024-10-21 02:51

在百度上搜一下string类的实现,很多的。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
孕妇用微波炉要离多远合适 孕妇使用微波炉的注意事项 微波炉热出来的东西有辐射吗-微波炉辐射范围是几米 当在使用微波炉的时候是不是要离远点?是不是对身体有害? 需 恶魔的小宠儿全集及类似言情小说,谢谢 英雄联盟手游168龙魂水晶免费兑换码-英雄联盟手游168龙魂水晶免费兑换码... 什么是引导区 取得工程技术或工程经济专业中级职务,并任职满3年.3年指的是取得中级... ...全国注册监理工程师考试,并且职称要求3年如何理解 反脸无情的近义词 重庆市第一中学学生成果 c语言 高手进 !!!急!!!高分!!! 西南科技大学文学与艺术学院的专业设置 西南科技大学艺术类专业怎么样 2023年吉林警察学院提前批最低录取分数线? 广东药科大学534分属于一本吗 生产性毒物进入人体的途径有三种 生产性毒物以多种形态存在于生产环境中,其存在形态包括() 压力容器使用中生产性毒物常以什么形式存在 造粒车间毒物存在形式 大疆如影4d屏幕上方没有参数怎么办 二甲四氯对大蒜有影响吗? ...公共场所专为残疾人设计的公共设施有哪些,并说一下用途? 天津市中考分数线是不是比其他省市分数线低 什么时候采摘胎菊最佳 游戏中CF充值页面显示不出来, cf王者轮回充值界面打不开 新会计交接为啥拖到5月份 会计法村委会计交接最多多少个工作日? 岳国君是什么问题 我不认识响铃草。想知道响铃草是怎样的 ...用V替换主串S中出现的所有与T相等的不重叠的子串是什么意思_百度知 ... 用V替换主串S中出现的所有与T相等的不重叠的子串 爱情里,总觉得自己不够好怎么办? 求“心灵杀手”的原声音乐,特别是每一集玩完后的片尾曲,人唱的,超好听... 泉州有哪些特色水果 《泰拉瑞亚》手机版风暴法杖怎么样 小切口双眼皮术后一个半月了,割的太短了能修复吗 魏杰城是什么人?普邦股份独立董事 以“难忘的生活镜头”为题 600字 作文 飞利浦sh71刀片真假 三亚椰梦长廊在哪里 小强今年10岁小明今年6岁3年后小明比小强小几岁 我有个长60厘米宽30的一个草缸,一个200瓦的加热棒,因为家里没地方,就... ...没去处理 睡一觉起来伤口一直在流水 还很粘 黄色的 是怎么回事... 我的脚还有大面积擦伤了,结疤了,但是一直流脓水了,是为什么 胳膊关节被擦伤后伤口一直流脓,怎么办 一个男人对一个女人死心有哪些表现 摔伤膝盖了 现在有点化脓 潘迎紫从谷底飞出来是什么电视剧 那些道士说的风水宝地有科学的依据吗?