C++ DLUT 上机作业(三)
我又来了
1、Myset运算符重载
/定义一个整型集合类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();
}
2、Mystring运算符重载
/完善上一章设计的字符串类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;
}
3、时间运算符重载
/定义描述时间的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;
}
4、重载符号分数类
/定义描述有理数的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;
}
写的不好,请多指正。
溜了溜了。。。。。。