#include<iostream> #include<cstring> using namespace std; class String{ public: char* str; String(char* a){ str=new char[strlen(a)+1]; strcpy(str,a); } String(){ str=NULL; } friend istream & operator>>(istream &i,String &op) //liucharu { char *p =new char[30]; op.str=p; i>>op.str; return i; } friend ostream & operator<<(ostream &o,String &op) //liutiqv { o<<op.str<<endl; return o; } String & operator=(const char* op) { if(str) delete []str; if(op){ str=new char[strlen(op)+1]; strcpy(str,op); } else str=NULL; return* this; } String operator+(const String &op) { strcat(str,op.str); return* this; } String operator+=(char *op) { strcat(str,op); return* this; } char & operator[](int n) str[5] { return str[n]; } bool operator<(const String &op) { if(strcmp(str,op.str)>0) return false; else return true; } void replace(int pos,int n,char* s){ int i=strlen(str); if(i<pos-1) //HUOQVZIFUCHUANCHANGDU cout<<"超出范围!"; else { n=n-1; strcpy(str+pos+n,s); // s到str 拷贝 cong pos +n kaobei } } String(const String &a){ char *b=new char[30]; this->str=b; strcpy(str,a.str); } ~String() { delete []str; } }; char find(String& s,int pos){ // chaxun int i=strlen(s.str); if(i<pos-1) cout<<"超出范围!"; else { pos=pos-1; return s.str[pos]; } } int main() { cout<<"请输入S1与S2\n"; String s1,s2; cin>>s1>>s2; while(1) { cout<<"1.查找s1第pos个字符\n"; cout<<"2.s1从pos开始的n个字符替换为s2\n"; cout<<"3.拷贝s2至s3\n"; int n; cin>>n; switch(n){ case 1:{ cout<<"输入pos\n"; int pos; cin>>pos; cout<<find(s1,pos)<<endl; };break; case 2:{ cout<<"输入pos,n\n"; int pos,n; cin>>pos>>n; s1.replace(pos,n,s2.str); cout<<s1.str<<endl; };break; case 3:{ String s3(s2); cout<<s3.str<<endl; };break; } } return 0; }加注释

时间: 2024-03-05 15:50:34 浏览: 24
```cpp #include<iostream> //输入输出流头文件 #include<cstring> //字符串操作头文件 using namespace std; //命名空间 class String{ //定义String类 public: char* str; //字符指针,用于存储字符串 String(char* a){ //带参构造函数,传入一个字符指针 str=new char[strlen(a)+1]; //动态分配内存,大小为字符串长度+1 strcpy(str,a); //将传入的字符串复制到str指向的内存中 } String(){ //无参构造函数 str=NULL; //将字符指针初始化为空 } //友元函数,重载输入运算符,用于从流中输入一个String对象 friend istream & operator>>(istream &i,String &op){ char *p =new char[30]; //动态分配内存,大小为30 op.str=p; //将p赋值给op的字符指针 i>>op.str; //从流中输入一个字符串,并赋值给op的字符指针 return i; //返回输入流对象 } //友元函数,重载输出运算符,用于输出String对象 friend ostream & operator<<(ostream &o,String &op){ o<<op.str<<endl; //将op的字符指针指向的字符串输出到流中,并换行 return o; //返回输出流对象 } //重载赋值运算符,用于将一个字符指针赋值给String对象 String & operator=(const char* op){ if(str) //如果字符指针不为空,释放其指向的内存 delete []str; if(op){ //如果字符指针不为空 str=new char[strlen(op)+1]; //动态分配内存,大小为字符串长度+1 strcpy(str,op); //将传入的字符串复制到str指向的内存中 } else str=NULL; //否则将字符指针置为空 return *this; //返回当前对象的引用 } //重载加法运算符,用于将两个String对象连接成一个新的String对象 String operator+(const String &op){ strcat(str,op.str); //将op的字符指针指向的字符串连接到当前对象的字符指针指向的字符串末尾 return *this; //返回当前对象的引用 } //重载加等于运算符,用于将一个字符指针连接到当前对象的字符指针指向的字符串末尾 String operator+=(char *op){ strcat(str,op); //将op指向的字符串连接到当前对象的字符指针指向的字符串末尾 return *this; //返回当前对象的引用 } //重载下标运算符,用于访问当前对象的字符指针指向的字符串中的某个字符 char & operator[](int n){ return str[n]; //返回当前对象的字符指针指向的字符串中的第n个字符 } //重载小于运算符,用于比较两个String对象的字符指针指向的字符串的大小 bool operator<(const String &op){ if(strcmp(str,op.str)>0) //如果当前对象的字符指针指向的字符串大于op的字符指针指向的字符串 return false; //返回false else return true; //否则返回true } //定义replace函数,用于替换当前对象的字符指针指向的字符串中从pos开始的n个字符为s指向的字符串 void replace(int pos,int n,char* s){ int i=strlen(str); //获取当前对象的字符指针指向的字符串长度 if(i<pos-1) //如果pos超出了范围 cout<<"超出范围!"; //输出超出范围提示 else{ n=n-1; //将n减1,为了方便替换 strcpy(str+pos+n,s); //将s指向的字符串拷贝到当前对象的字符指针指向的字符串从pos+n开始的位置中 } } //拷贝构造函数,用于将一个String对象复制给另一个String对象 String(const String &a){ char *b=new char[30]; //动态分配内存,大小为30 this->str=b; //将b赋值给当前对象的字符指针 strcpy(str,a.str); //将a的字符指针指向的字符串复制到当前对象的字符指针指向的内存中 } //析构函数,用于释放当前对象的字符指针指向的内存 ~String(){ delete []str; } }; //定义find函数,用于查找传入的String对象中第pos个字符 char find(String& s,int pos){ int i=strlen(s.str); //获取传入的String对象的字符指针指向的字符串长度 if(i<pos-1) //如果pos超出了范围 cout<<"超出范围!"; //输出超出范围提示 else{ pos=pos-1; //将pos减1,因为下标从0开始 return s.str[pos]; //返回传入的String对象的字符指针指向的字符串中第pos个字符 } } int main(){ cout<<"请输入S1与S2\n"; //输出提示 String s1,s2; //定义两个String对象 cin>>s1>>s2; //从流中输入两个字符串,并赋值给s1和s2的字符指针 while(1){ cout<<"1.查找s1第pos个字符\n"; //输出提示 cout<<"2.s1从pos开始的n个字符替换为s2\n"; //输出提示 cout<<"3.拷贝s2至s3\n"; //输出提示 int n; cin>>n; //从流中输入一个整数,用于选择操作 switch(n){ case 1:{ //如果选择了1 cout<<"输入pos\n"; //输出提示 int pos; cin>>pos; //从流中输入一个整数,表示要查找的字符的位置 cout<<find(s1,pos)<<endl; //输出查找到的字符,并换行 };break; case 2:{ //如果选择了2 cout<<"输入pos,n\n"; //输出提示 int pos,n; cin>>pos>>n; //从流中输入两个整数,分别表示要替换的字符的起始位置和数量 s1.replace(pos,n,s2.str); //调用replace函数,将s2的字符指针指向的字符串替换到s1的字符指针指向的字符串中 cout<<s1.str<<endl; //输出替换后的字符串,并换行 };break; case 3:{ //如果选择了3 String s3(s2); //用s2的字符指针指向的字符串构造一个新的String对象,赋值给s3 cout<<s3.str<<endl; //输出s3的字符指针指向的字符串,并换行 };break; } } return 0; //程序结束 } ```

相关推荐

[题目]编程将两个字符串连接成一个字符串,并将连接后的字符串按升序排列。如字符串s1的值为"pear",字符串s2的值是"apple",连接后的字符串存入字符数组s3,排序后得到"aaeelpppr"。 [编程要求] 试建立一个类STRING,实现将两个成员数组(str1和str2)中的字符串连接成一个字符串,并将连接后的字符串按升序排列存入成员数组str3中。 如str1中字符串"pear",str2中存字符串"apple",连接并排序后存入成员数组str3中的字符串为"aaeelpppr"。 具体要求如下: (1)私有数据成员。 char str1[100]; char str2[100]; char str3[100]; (2)公有成员函数 STRING(char ch1[],char ch2[]):构造函数,用分别参数ch1数组初始化私有成员str1数组,参数ch2数组初始化私有成员str2数组; void process():实现把成员数组str1和str2连接,并把连接后的字符串按升序排列后存入成员数组str3中; void show():输出成员数组str3; (3)在主函数中完成对该类的测试。定义一个STRING类的对象s;分别用"pear"初始化对象s1中的成员数组str1,用"apple"初始化成员数组str2,按上述要求处理并输出结果 */ #include<iostream.h> #include<string.h> #include<fstream.h> class STRING { char str1[100]; char str2[100]; char str3[100]; public: STRING(char ch1[],char ch2[]) { strcpy(str1,ch1); strcpy(str2,ch2); } void process() { /********** Begin **********/ /********** End ***********/ } void show() { cout<<str3<<endl; //此处将结果输出到文件"bc02.in",请勿改动,否则影响判分 ofstream outf("bc02.in"); outf<<str3<<endl; outf.close(); } }; void main() { STRING s("pear","apple"); s.process(); s.show(); }

#include<iostream> #include<cstring> using namespace std; class String{ public: char Str[20]; friend istream &operator>>(istream &in, String &s); friend ostream &operator<<(ostream &out, String &s); }; istream &operator>>(istream &in,String &s){ cin>>s.Str; return in; } ostream &operator<<(ostream &out,String &s){ cout<<s.Str; return out; } template<class TNo, class TScore, int num>//TNo和TScore为参数化类型 class Student{ private: TNo StudentID; //参数化类型,存储姓名 TScore score[num]; //参数化类型数组,存储num门课程的分数 public: void Input();//数据的录入 TScore MaxScore(); //查找score的最大值并返回该值 void Update(TScore sscore,int i);//更新学生的第i门课程成绩为sscore void SelectSort(); //采用选择排序法对学生成绩进行升序排列 void Print(); //输出所有学生的信息 }; template<class TNo, class TScore, int num> void Student<TNo,TScore,num>::Input(){ for(int i=0;i<3;i++){ cin>>score[i]; } } template<class TNo, class TScore, int num> TScore Student<TNo,TScore,num>::MaxScore(){ TScore max=score[0]; for(int i=1;i<num;i++){ if(score[i]>max)max=score[i]; }return max; } template<class TNo, class TScore, int num> void Student<TNo,TScore,num>::Update(TScore sscore,int i) { cin>>i>>sscore; score[i-1]=sscore; } template<class TNo, class TScore, int num> void Student<TNo,TScore,num>::Print(){ cout<<MaxScore()<<endl; cout<<StudentID<<" "; for(int i=0;i<num;i++){ cout<<score[i]<<" "; } } template<class TNo, class TScore, int num> void Student<TNo,TScore,num>::SelectSort(){ for(int i=0;i<num-1;i++){ int minindex=i; for(int j=i+1;j<num;j++){ if(score[j]<score[minindex]) minindex=j; } if(minindex!=i){ double tmp=score[minindex]; score[minindex]=score[i]; score[i]=tmp; } } } int main(){ Student<String,float,3>student; student.Input(); double sscore;int i; student.Update(sscore,i); student.SelectSort(); student.Print(); return 0; }为什么更改分数输入不进去

最新推荐

recommend-type

QT5开发及实例配套源代码.zip

QT5开发及实例配套[源代码],Qt是诺基亚公司的C++可视化开发平台,本书以Qt 5作为平台,每个章节在简单介绍开发环境的基础上,用一个小实例,介绍Qt 5应用程序开发各个方面,然后系统介绍Qt 5应用程序的开发技术,一般均通过实例介绍和讲解内容。最后通过三个大实例,系统介绍Qt 5综合应用开发。光盘中包含本书教学课件和书中所有实例源代码及其相关文件。通过学习本书,结合实例上机练习,一般能够在比较短的时间内掌握Qt 5应用技术。本书既可作为Qt 5的学习和参考用书,也可作为大学教材或Qt 5培训用书。
recommend-type

grpcio-1.46.3-cp37-cp37m-musllinux_1_1_i686.whl

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

用Spring boot和vue写一个登录注册界面

好的,这是一个比较常见的技术问题,我可以为您提供一些参考资料和思路。首先,您可以使用Spring Boot作为后端框架来处理用户认证和注册的逻辑,比如使用Spring Security实现用户登录认证。同时,您还需要设计相应的数据模型和数据库表结构来存储用户信息。在前端方面,您可以使用Vue.js作为框架来构建登录注册页面,使用Axios来发起API请求并和后端进行交互。当然,在实现过程中,还需要考虑一些具体细节,比如数据校验、安全性和用户体验等方面。希望这些信息能够帮助到您。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

MATLAB柱状图在数据分析中的作用:从可视化到洞察

![MATLAB柱状图在数据分析中的作用:从可视化到洞察](https://img-blog.csdnimg.cn/img_convert/1a36558cefc0339f7836cca7680c0aef.png) # 1. MATLAB柱状图概述** 柱状图是一种广泛用于数据可视化的图表类型,它使用垂直条形来表示数据中不同类别或组别的值。在MATLAB中,柱状图通过`bar`函数创建,该函数接受数据向量或矩阵作为输入,并生成相应的高度条形。 柱状图的优点在于其简单性和易于理解性。它们可以快速有效地传达数据分布和组别之间的比较。此外,MATLAB提供了广泛的定制选项,允许用户调整条形颜色、
recommend-type

命名ACL和拓展ACL标准ACL的具体区别

命名ACL和标准ACL的主要区别在于匹配条件和作用范围。命名ACL可以基于协议、端口和其他条件进行匹配,并可以应用到接口、VLAN和其他范围。而标准ACL只能基于源地址进行匹配,并只能应用到接口。拓展ACL则可以基于源地址、目的地址、协议、端口和其他条件进行匹配,并可以应用到接口、VLAN和其他范围。