/定义一个整型集合类MySet,最多存放10个不重复的整数
class MySet{
int s[10]; //整数集合
int size;
pu blic:
MySet( int num =0);
…
};
定义如下成员函数实现集合的相关操作:
1)增加某个整型元素,保证集合中没有重复元素data, 成功添加返回true: bool add(int data)
2) 删除指定的元素,查找该元素data在集合中则从集合中删除该元素,否则返回false;bool del(int data)
3)重载运算符“+”,实现两个集合对象的合并操作, 合并后集合不存在重复的数据 , 使表达式s1= s2+s3成立;
4)重载运算符“”,求两个集合对象的交集操作,新集合中的元素是两个集合中相同的元素, 使表达式s1= s2s3成立;/
#include <iostream> using namespace std; class Myset { private: int s[10]; int size; public: Myset(); Myset(int num); bool add(int data); bool del(int data); Myset operator+(Myset& p); Myset operator*(Myset& p); void show(); }; Myset::Myset(int num) { int i; for(i=0;i<10;i++) { s[i]=num; } size=1; } Myset::Myset() { int i; for(i=0;i<10;i++) { s[i]=-1; } size=1; } bool Myset::add(int data) { int i; for(i=0;i<10;i++) { if(s[i]==data) return false; } s[size++]=data; return true; } bool Myset::del(int data) { int k,i,j; for(i=0;i<size;i++) { if(data==s[i]) { k=i; break; } } if(i>=size) { return false; } else { for(j=k;j<size-1;j++) { s[j]=s[j+1]; } size--; return true; } } Myset Myset::operator+(Myset& p) { Myset temp; int i,j; temp.size=size; for(i=0;i<size;i++) temp.s[i]=s[i]; for(i=0;i<p.size;i++) { for(j=0;j<size;j++) { if(p.s[i]==s[j]) break; } if(j==size) { temp.s[temp.size]=p.s[i]; temp.size++; } } return temp; } Myset Myset::operator*(Myset& p) { int i,j=0,k; Myset temp; for(i=0;i<size;i++) { for(k=0;k<p.size;k++) { if(s[i]==p.s[k]) break; } if(k<p.size) { temp.s[j++]=s[i]; } } temp.size=j; return temp; } void Myset::show() { int i; cout<<"有效元素个数:"<<size<<endl; cout<<"有效元素:"; for(i=0;i<size;i++) { cout<<s[i]<<" "; } cout<<endl; } int main() { Myset s1(1),s2(5); for(int i=2;i<8;i++) { s1.add(i); } s1.show(); s2.add(7); s2.show(); Myset s3=s1+s2; cout<<"并集:"<<endl; s3.show(); Myset s4=s1*s2; cout<<"交集:"<<endl; s4.show(); }
/完善上一章设计的字符串类MyString,私有数据成员包括char p, int size; //字符串长度
定义相关的构造函数、拷贝构造、析构函数及成员函数,重载运算符实现如下功能:
1)重载“+”实现字符串连接功能,使表达式s1= s2+s3成立;
2)重载“==”判断两个字符串是否相等,根据字符串内容的字典顺序返回true/false;
3)重载“<<”与“>>”,实现字符串的输入与输出操作,如cin>>s3; cout<<s2<<endl;
4)重载运算符“()”,从字符串对象中返回一个子串。如s1(2,4)表示返回从子串,即从s2开始的子串(包括s1[2]、s1[3]和s1[4]三个字符)。
5) 重载“=”,使表达式s1= s2成立;*/
#include<iostream> #include<cstring> using namespace std; class Mystring{ private: char* p; int size;//字符串长度 public: Mystring(); Mystring(const char* n); Mystring(const Mystring& s); ~Mystring(); Mystring operator()(int a,int b); Mystring operator+(const Mystring &s); bool operator==(const Mystring &s); friend ostream& operator<<(ostream& out,Mystring &s); friend istream& operator>>(istream& in,Mystring &s); Mystring &operator=(const Mystring &s); }; Mystring::Mystring() { p=new char[1]; p[0]='\0'; // strcpy(p,'\0'); size=0; } Mystring::Mystring(const char *n) { size=strlen(n); p=new char[size+1]; strcpy(p,n); p[size]='\0'; } Mystring::Mystring(const Mystring& s) { size=strlen(s.p); p=new char[size+1]; strcpy(p,s.p); p[size]='\0'; } Mystring::~Mystring() { if(p) delete [] p; size=0; } Mystring Mystring::operator+(const Mystring& s) { int length=size+s.size; char* newp=new char[length+1]; strcpy(newp,p); strcat(newp,s.p); newp[length+1]='\0'; return Mystring(newp); } bool Mystring::operator==(const Mystring &s) { if(strcmp(p,s.p)) return true; return false; } ostream& operator<<(ostream& out,Mystring &s) { out<<s.p<<endl; return out; } istream& operator>>(istream& in,Mystring &s) { in>>s.p; s.size=strlen(s.p); return in; } Mystring &Mystring::operator=(const Mystring& s) { strcpy(p,s.p); size=s.size; } Mystring Mystring::operator()(int a,int b) { Mystring r1; r1.p = new char[b-a+1]; strncpy(r1.p,p+a,b-a+1); return r1; /*char *q=NULL; int i,j=0; for(i=a;i<=b;i++) { q[j++]=p[i]; } q[j]='\0'; return Mystring(q);*/ } int main() { Mystring s1,s2; cin>>s1; cin>>s2; Mystring s3=s1+s2; cout<<s3; Mystring s4; cin>>s4; if(s3==s4) cout<<"s3和s4不等"<<endl; else cout<<"s3和s4相等"<<endl; Mystring s5; s5=s1; cout<<s5; Mystring s6; s6=s1(2,4); cout<<"字符串1(2,4)"<<endl; cout<<s6<<endl; }
/定义描述时间的Time类,包括数据成员小时hour、分钟minute和秒second,定义相关函数实现如下操作:
1)重载运算符“+”与“-”,能够实现时间对象与整数秒的加减操作。
2)重载运算符“<<”输出时间对象,能够按照“小时:分钟:秒”的方式显示时间。
3)重载运算符“++”与“–”,要求能够实现时间的合理自增自减功能(秒数的增减)/
#include<iostream> using namespace std; class Time{ private: int hour; int minute; int second; public: Time(int h=0,int m=0,int s=0); Time operator+(int);//时间加法 Time operator-(int);//时间减法 friend ostream& operator<<(ostream&, Time&);//输出时间对象 Time &operator++();//自增 Time &operator--();//自减 }; Time::Time(int h,int m,int s) { hour=h; minute=m; second=s; } Time Time::operator+(int x) { second+=x; int m=second/60; second%=60; minute+=m; int h=minute/60; minute%=60; hour+=h; hour%=24; return *this; } Time Time::operator-(int n) { int i,j,k; i=second-n%60; if(i>=0) { second=i; } else { second=i+60; minute--; } j=minute-n/60; if(j>=0) { minute=j; } else { minute=j+60; hour--; } k=hour-n/60/60; if(k>=0) { hour=k; } else { hour=k+24; } return *this; } ostream& operator<<(ostream&out,Time &a) { out <<a.hour<<" "<<a.minute<<" "<<a.second<<endl; return out; } Time &Time::operator++() { second++; if(second==60) { minute++; second=0; if(minute==60) { hour++; minute=0; if(hour==24) { hour=0; } } } return *this; } Time &Time::operator--() { second--; if(second==-1) { second=59; minute--; if(minute==-1) { minute=59; hour--; if(hour==-1) { hour=23; } } } return *this; } int main() { Time s(23,59,59); ++s; cout<<s<<endl; --s; cout<<s<<endl; Time s1=s+3; cout<<s1<<endl; s1=s-3; cout<<s1<<endl; }
/定义描述有理数的Rational类
class Rational{
int m; // 分母
int n; // 分子
double d; // n/m
void simple(); //约分
public:
Rational(int nn=1,int mm=1);
……
};
请给出重载以下运算符的函数的定义形式
1)重载算术运算符“”,实现分数的乘法操作
2)重载比较运算符“>”"<",实现分数的比较操作
3)重载单目运算符“-”,实现分数的取反操作
4)重载双目运算符“-”,实现一个double数据与分数的减法, 两个分数的减法*/
#include<iostream> using namespace std; class Rational{ private: int m;//分母 int n;//分子 double d; //n/m void simple(); //约分 public: Rational(int nn=1,int mm=1); bool setM(int); void setN(int); double setD(); Rational operator*(const Rational &A);//重载*,实现乘法 bool operator>(const Rational &A); bool operator<(const Rational &A);//分数比较 Rational operator-();// 分数取反 void print(); }; int flag=0; int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } void Rational::simple() { int GCD=gcd(n,m); m/=GCD; n/=GCD; } Rational::Rational(int nn,int mm) { setN(nn); flag=setM(mm); } bool Rational::setM(int mm) { if(mm!=0) { m=mm; return true; } return false; } void Rational::setN(int nn) { n=nn; } double Rational::setD() { return (double)n/(double)m; } Rational Rational::operator*(const Rational& A) { Rational c; c.n=A.n*n; c.m=A.m*m; c.simple(); return c; } Rational Rational::operator-() { Rational c; c.m=n; c.n=m; c.simple(); return c; } bool Rational::operator>(const Rational& A) { if(n*A.m-m*A.n>0) return true; return false; } bool Rational::operator<(const Rational& A) { if(n*A.m-m*A.n>0) return false; return true; } void Rational::print() { cout<<"计算结果为:"<<endl; if(n%m!=0) cout<<n<<"/"<<m<<endl; else cout<<n/m<<endl; } double operator-(double &dou,Rational &A) { return dou-A.setD(); } int main() { int nn,mm; double d; cout<<"输入分子:"<<endl; cin>>nn; cout<<"输入分母:"<<endl; cin>>mm; if(flag==1) { cout<<"分母为零错误"<<endl; return 0; } Rational a,b(2,5),c; a.setN(nn); if(!a.setM(mm)) { cout<<"分母为零,错误"<<endl; return 0; } c=a*b; c.print(); c=-a; c.print(); if(a>b) { cout<<"分数a大于b"<<endl; } else { cout<<"分数a小于b"<<endl; } if(c>b) { cout<<"分数a取反大于b"<<endl; } else { cout<<"分数a取反小于b"<<endl; } double dd; cout<<"输入double数据:"<<endl; cin>>dd; cout<<"double数据与分数类a的减法结果为:"<<endl; cout<<dd-a; }
写的不好,请多指正。
溜了溜了。。。。。。