分数类中的运算符重载

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值