问题及代码:
/*
*copyright (t) 2016,烟台大学计算机学院
*All rights reserved.
*文件名称:test.cpp
*作者:张晴晴
*完成日期:2016年6月7日
*版本号:v1.0
*问题描述:
(1)实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、比较(6种关系)的运算。
(2)在(1)的基础上,实现分数类中的对象和整型数的四则运算。分数类中的对象可以和整型数进行四则运算,
且运算符合交换律。例如:CFraction a(1,3),b; int i=2; 可以完成b=a+i;。同样,可以完成i+a, 45+a, a*27, 5/a等各种运算。
(3)定义分数的一目运算+和-,分别代表分数取正和求反,将“按位取反运算符”~重载为分数的求倒数运算。
(4)定义分数类中<<和>>运算符重载,实现分数的输入输出,改造原程序中对运算结果显示方式,使程序读起来更自然。
*程序输出:输出结果。
*/
#include<iostream>
#include<cmath>
using namespace std;
class CFraction
{
private:
int nume; // 分子
int deno; // 分母
public:
friend istream &operator>>(istream&in,CFraction &x);
friend ostream &operator<<(ostream&out,CFraction &x);
CFraction(double nu=0,double de=1):nume(nu),deno(de){}
int getnume(){return nume;}
int getdeno(){return deno;}
CFraction operator+();
CFraction operator-();
CFraction operator~();
friend CFraction operator+(const CFraction&c1,const CFraction&c2);
friend CFraction operator-(const CFraction&c1,const CFraction&c2);
friend CFraction operator*(const CFraction&c1,const CFraction&c2);
friend CFraction operator/(const CFraction&c1,const CFraction&c2); //构造函数及运算符重载的函数声明
void simplify();
};//重载函数的实现及用于测试的main()函数1
CFraction CFraction ::operator+()
{
CFraction c;
if(nume<0)
{
c.nume=-nume;
c.deno=deno;
}
else
{
c.nume=nume;
c.deno=deno;
}
return c;
}
CFraction CFraction ::operator-()
{
CFraction c;
c.nume=-nume;
c.deno=deno;
return c;
}
CFraction CFraction ::operator~()
{
CFraction c;
c.nume=deno;
c.deno=nume;
if(c.deno<0)
{
c.nume=-c.nume;
c.deno=-c.deno;
}
return c;
}
istream &operator>>(istream&in,CFraction &x)
{
char t;
while(1)
{
cin>>x.nume>>t>>x.deno;
if(x.deno==0)
cerr<<"分母为0,请重新输入!"<<endl;//注意
if(t!='/')
cerr<<"格式错误,请重新输入!"<<endl;
else
break;
}
if(x.deno<0)//这的问题是为什么非得将分母转换为正数
{
x.deno=-x.deno;//把分母上的正号转换到分子上,因为分子要进行加减运算
x.nume=-x.nume;
}
return in;
}
ostream &operator<<(ostream&out,CFraction &x)
{
if(x.deno!=1&&x.nume!=0)
cout<<x.nume<<'/'<<x.deno<<endl;//这个地方就不能用t了,因为传参的时候没有传进t来
if(x.deno==1)
cout<<x.nume<<endl;
if(x.nume==0)
cout<<"0"<<endl;
return out;
}
CFraction operator+(const CFraction&c1,const CFraction&c2)
{
CFraction c;
c.nume=c1.nume*c2.deno+c2.nume*c1.deno;
c.deno=c1.deno*c2.deno;
c.simplify();
return c;
}
CFraction operator-(const CFraction&c1,const CFraction&c2)
{
CFraction c;
c.nume=c1.nume*c2.deno-c2.nume*c1.deno;
c.deno=c1.deno*c2.deno;
c.simplify();
return c;
}
CFraction operator*(const CFraction&c1,const CFraction&c2)
{
CFraction c;
c.nume=c1.nume*c2.nume;
c.deno=c1.deno*c2.deno;
c.simplify();
return c;
}
CFraction operator/(const CFraction&c1,const CFraction&c2)
{
CFraction c;
if(c2.nume==0||c1.nume==0)
{
c.nume=0;
return c;
}
else
{
c.nume=c1.nume*c2.deno;
c.deno=c1.deno*c2.nume;
c.simplify();
return c;
}
} //构造函数及运算符重载的函数声明
void CFraction ::simplify()
{
int m,n,r;
n=fabs(deno);
m=fabs(nume);
while(r=m%n)
{
m=n;
n=r;
}
deno=deno/n;
nume=nume/n;
if(deno<0)//得将分母转换为正数
{
deno=-deno;//把分母上的正号转换到分子上,因为分子要进行加减运算
nume=-nume;
}
}
int main()
{
CFraction x,a1,a2,b1,b2,c1,c2,d1,d2;
int y;
cout<<"请输入分数x:";
cin>>x;
cout<<"请输入整数y:";
cin>>y;
a1=x+y;
cout<<"x+y="<<a1<<endl;
b1=x-y;
cout<<"x-y="<<b1<<endl;
c1=x*y;
cout<<"x*y="<<c1<<endl;
d1=x/y;
cout<<"x/y="<<d1<<endl;
a2=y+x;
cout<<"y+x="<<a2<<endl;
b2=y-x;
cout<<"y-x="<<b2<<endl;
c2=y*x;
cout<<"y*x="<<c2<<endl;
d2=y/x;
cout<<"y/x="<<d2<<endl;
x=-x;
cout<<"x的相反数为:"<<x<<endl;
x=+x;
cout<<"x取正为:"<<x<<endl;
x=~x;
cout<<"x的倒数为:"<<x<<endl;
return 0;
}
运行结果:
学习心得:
这是比之前写的最简的步骤了吧,输出的对象分母等于1时是一个整数,分子等于0的时候输出的是0,这些输出结果的实现只要在重载的输出流的对象上进行判断就可以。