29行的函数应该注意下。。。
#include<iostream>
using namespace std;
enum number{zero,one,two,three,four};
class CFraction
{
private:
int nume; // 分子
int deno; // 分母
public:
CFraction(int nu=0,int de=1); //构造函数,初始化用
void set(int nu=0,int de=1); //置值,改变值时用
void input(); //按照"nu/de"的格式,如"5/2"的形式输入
void simplify(); //化简(使分子分母没有公因子)
void amplify(int n); //放大n倍,如2/3放大5倍为10/3
void output(number style=zero); //输出:以8/6为例,style为0时,原样输出8/6;
//style为1时,输出化简后形式4/3;
//style为2时,输出1(1/3)形式,表示一又三分之一;
//style为3时,用小数形式输出,如1.3333
//不给出参数和非1、2,认为是方式0
friend CFraction operator+(const CFraction&a,const CFraction&b);
CFraction operator+=(const CFraction&a);
friend CFraction operator-(const CFraction&a,const CFraction&b);
CFraction operator-=(const CFraction&a);
friend CFraction operator*(const CFraction&a,const CFraction&b);
CFraction operator*=(const CFraction&a);
friend CFraction operator/(const CFraction&a,const CFraction&b);
CFraction operator/=(const CFraction&a);
friend CFraction operator-(CFraction&a);
CFraction operator-(int);//这里的int是为了与面的友元函数区别的,如果不写,函数报错。
friend bool operator>(const CFraction&a,const CFraction&b);
bool operator>(const CFraction&a);
};
//额外的两个普通函数
int GCD(int m,int n);//求两个数的最大公约数。
int LCM(int m,int n);//求两个数的最小公倍数。
int main()
{
CFraction aa(16,12);
CFraction bb(18,10);
cout<<"友元函数+:";
CFraction cc;
cc=aa+bb;//cc=aa-bb;//可以直接替换变成减法
cc.output(zero);
cc.output(one);
cout<<"成员函数+=:";
aa+=bb;//aa-=bb;//可以直接替换变成减法
aa.output(zero);
aa.output(one);
cout<<endl;
CFraction dd(16,12);
CFraction ee(5,10);
CFraction ff;
ff=dd*ee;//ff=dd*ee;
cout<<"友元函数*:";
ff.output(zero);
ff.output(one);
cout<<"成员函数*=:";
dd*=ee;//dd/=ee
dd.output(zero);
dd.output(one);
cout<<endl;
CFraction gg(25,12);
CFraction hh(10,5);
if(gg>hh)cout<<"gg大于hh。。"<<endl;
else cout<<"gg不大于hh"<<endl;
-gg;
gg.output(zero);
gg.output(one);
return 0;
}
CFraction::CFraction(int nu,int de):nume(nu),deno(de)
{
}
void CFraction::set(int nu,int de)
{
nume=nu;
deno=de;
}
void CFraction::input()
{
cout<<"输入分子:";
cin>>nume;
cout<<"输入分母:";
cin>>deno;
}
void CFraction::simplify()
{
int divisor=GCD(nume,deno);
nume/=divisor;
deno/=divisor;
}
int GCD(int m,int n)
{
int r=m%n;
while(r)
{
m=n;
n=r;
r=m%n;
}
return n;
}
int LCM(int m,int n)
{
return (m*n)/GCD(m,n);
}
void CFraction::amplify(int n)
{
nume*=n;
}
void CFraction::output(number style)
{
switch(style)
{
case zero: cout<<nume<<"/"<<deno<<endl;break;
case one: simplify();cout<<nume<<"/"<<deno<<endl;break;
case two: cout<<nume/deno<<"("<<nume%deno<<"/"<<deno<<")"<<endl;break;
case three:cout<<(double)nume/deno<<endl;break;
default : cout<<"输入错误。。"<<endl;break;
}
}
CFraction operator+(const CFraction&a,const CFraction&b)
{
CFraction c;
int n=LCM(a.deno,b.deno);
c.nume=a.nume*(n/a.deno)+b.nume*(n/b.deno);
c.deno=n;
return c;
}
CFraction CFraction::operator+=(const CFraction&a)
{
*this=*this+a;
return *this;
}
CFraction operator-(const CFraction&a,const CFraction&b)
{
CFraction c;
int n=LCM(a.deno,b.deno);
c.nume=a.nume*(n/a.deno)-b.nume*(n/b.deno);
c.deno=n;
return c;
}
CFraction CFraction::operator-=(const CFraction&a)
{
*this=*this-a;
return *this;
}
CFraction operator*(const CFraction&a,const CFraction&b)
{
CFraction c;
c.nume=a.nume*b.nume;
c.deno=a.deno*b.deno;
return c;
}
CFraction CFraction::operator*=(const CFraction&a)
{
*this=*this*a;
return *this;
}
CFraction operator/(const CFraction&a,const CFraction&b)
{
CFraction c;
c.nume=a.nume*b.deno;
c.deno=a.deno*b.nume;
return c;
}
CFraction CFraction::operator/=(const CFraction&a)
{
*this=*this/a;
return *this;
}
CFraction operator-(CFraction&a)
{
a.nume=-a.nume;
return a;
}
CFraction CFraction::operator-(int)
{
nume=-nume;
return *this;
}
bool operator>(const CFraction&a,const CFraction&b)
{
cout<<"ccc"<<endl;
CFraction c=a-b;
if((c.nume>0&&c.deno>0)||(c.deno<0&&c.nume<0))return true;
else return false;
}
bool CFraction::operator>(const CFraction&a)
{
CFraction c=*this-a;
if(c.nume*c.deno>0)return true;
else return false;
}