问题及代码:
/*
*Copyright (c) 2016,烟台大学计算机学院
*All rights reserved.
*文件名称:zwj.cpp
*作 者:张伟晶
*完成日期:2016年5月24日
*版 本 号:v1.0
*
*问题描述:实现分数类中的运算符重载,加减乘除比较;在此基础上增加取正求反,求倒数运算,交换律
*输入描述:
*程序输出:
*/
#include<iostream>
#include<cmath>
using namespace std;
class CFraction
{
private:
int num;//分子
int deno;//分母
public:
//构造函数及运算符重载的声明
CFraction (int nu=0,int de=1):num(nu),deno(de){}
void huajian();
friend istream &operator>>(istream &in,CFraction &x);
friend ostream &operator<<(ostream &out,CFraction x);
friend CFraction operator + (double &d,CFraction &c);
CFraction operator +(const CFraction &c);
CFraction operator -(const CFraction &c);
CFraction operator *(const CFraction &c);
CFraction operator /(const CFraction &c);
//分数比较大小
bool operator>(const CFraction &c);
bool operator<(const CFraction &c);
bool operator==(const CFraction &c);
//按位取反运算符
CFraction operator+();
CFraction operator-();
CFraction operator~();
///分数与整数
CFraction operator + (double &d);
CFraction operator - (double &d);
CFraction operator * (double &d);
CFraction operator / (double &d);
};
CFraction CFraction::operator+(double &d)
{
CFraction n;
n.num=num+d*deno;
n.deno=deno;
n.huajian();
return n;
}
/**/
CFraction CFraction::operator-(double &d)
{
CFraction n;
n.num=num-d*deno;
n.deno=deno;
n.huajian();
return n;
}
CFraction CFraction::operator*(double &d)
{
CFraction n;
n.num=num*d;
n.deno=deno;
n.huajian();
return n;
}
CFraction CFraction::operator/(double &d)
{
CFraction n;
n.num=num;
n.deno=deno*d;
n.huajian();
return n;
}
//重载函数的实现以及用于测试的main()函数
void CFraction::huajian()
{
int k;
if(num>0)
k=2;
else
{
k=1;
num=-num;
}
int m,n,r=1;
m=num;
n=deno;
while(r=m%n)
{
m=n;
n=r;
}
num=num/n*pow(-1,k);
deno=deno/n;
}
CFraction operator+(double &d,CFraction &c)
{
CFraction n;
n.num=c.num+c.deno*d;
n.deno=c.deno;
return n;
}
// 重载输入运算符>>
istream &operator>>(istream &in,CFraction &x)
{
char ch;
while(1)
{
cin>>x.num>>ch>>x.deno;
if (x.deno==0)
cerr<<"分母为0, 请重新输入\n";
else if(ch!='/')
cerr<<"格式错误(形如m/n)! 请重新输入\n";
else
break;
}
return cin;
}
// 重载输出运算符<<
ostream &operator<<(ostream &out,CFraction x)
{
cout<<x.num<<'/'<<x.deno;
return cout;
}
CFraction CFraction::operator+(const CFraction &c)
{
CFraction w;
w.deno=deno*c.deno;
w.num=num*c.deno+c.num*deno;
w.huajian();
return w;
}
CFraction CFraction::operator-(const CFraction &c)
{
CFraction w;
w.deno=deno*c.deno;
w.num=num*c.deno-c.num*deno;
w.huajian();
return w;
}
CFraction CFraction::operator*(const CFraction &c)
{
CFraction w;
w.deno=deno*c.deno;
w.num=num*c.num;
w.huajian();
return w;
}
CFraction CFraction::operator/(const CFraction &c)
{
CFraction w;
w.deno=deno*c.deno;
w.num=num*c.deno/c.num*deno;
w.huajian();
return w;
}
//比较大小
bool CFraction::operator>(const CFraction &c)
{
int m,n;
m=num*c.deno;
n=c.num*deno;
if((m-n)>0)
return true;
else
return false;
}
bool CFraction::operator<(const CFraction &c)
{
int m,n;
m=num*c.deno;
n=c.num*deno;
if((m-n)<0)
return true;
else
return false;
}
bool CFraction::operator==(const CFraction &c)
{
int m,n;
m=num*c.deno;
n=c.num*deno;
if((m-n)==0)
return true;
else
return false;
}
//按位取反
CFraction CFraction::operator+()
{
return *this;
}
CFraction CFraction ::operator-()
{
CFraction n;
n.num=-num;
n.deno=deno;
return n;
}
CFraction CFraction::operator~()
{
CFraction n;
if(num<0)
{
n.deno=-num;
n.num=-deno;
}
else
{
n.num=deno;
n.deno=num;
}
return n;
}
int main()
{
CFraction x,y,z;
cout<<"请输入x,y"<<endl;
cout<<"x:";
cin>>x;
cout<<"y:";
cin>>y;
cout<<"**********加减乘除**********"<<endl;
z=x+y;
cout<<"x+y="<<z<<endl;
z=x-y;
cout<<"x-y="<<z<<endl;
z=x*y;
cout<<"x*y="<<z<<endl;
z=x/y;
cout<<"x/y="<<z<<endl;
cout<<endl;
cout<<"**********比较大小**********"<<endl;
if(x>y) cout<<"x>y"<<endl;
if(x<y) cout<<"x<y"<<endl;
if(x==y) cout<<"x=y"<<endl;
cout<<endl;
cout<<"**********分数取正反倒数**********"<<endl;
cout<<+x<<endl;
cout<<-x<<endl;
cout<<~x<<endl;
cout<<"**********交换律**********"<<endl;
z=x+3;
cout<<"x+3="<<z<<endl;
z=x-3;
cout<<"x-3="<<z<<endl;
z=x*3;
cout<<"x*3="<<z<<endl;
z=x/3;
cout<<"x/3="<<z<<endl;
return 0;
}
运行结果:
知识点总结:
学习心得: