/*
* Copyright (c) 2014, 烟台大学计算机学院
* All rights reserved.
* 文件名称:test.cpp
* 作 者:李晓凯
* 完成日期:2015年 5 月 9 日
* 版 本 号:v1.0
*
* 问题描述:在第八周项目三(2)的基础上,(1)定义分数的一目运算+和-,分别代表分数取正和求反,将“按位取反运算符”~重载为分数的求倒数运算,(2)定义分数类中的<<和>>运算符运算,实现分数的输入和输出。
* 输入描述:
* 程序输出:运算结果
*/
代码:
#include <iostream>
#include <Cmath>
using namespace std;
int gcd(int a,int b);
class CFraction
{
private:
int nume; // 分子
int deno; // 分母
public:
CFraction(int n=0,int d=1):nume(n),deno(d) {}
void simplify();
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);
friend CFraction operator + (int i,const CFraction &c);
friend CFraction operator + (const CFraction &c,int i);
friend CFraction operator - (int i,const CFraction &c);
friend CFraction operator - (const CFraction &c,int i);
friend CFraction operator * (int i,const CFraction &c);
friend CFraction operator * (const CFraction &c,int i);
friend CFraction operator / (int i,const CFraction &c);
friend CFraction operator / (const CFraction &c,int i);
friend istream& operator>>(istream& ,CFraction& c);
friend ostream& operator<<(ostream& ,CFraction& c);
friend bool operator > (const CFraction &c1,const CFraction &c2);
friend bool operator < (const CFraction &c1,const CFraction &c2);
friend bool operator == (const CFraction &c1,const CFraction &c2);
friend bool operator != (const CFraction &c1,const CFraction &c2);
friend bool operator >= (const CFraction &c1,const CFraction &c2);
friend bool operator <= (const CFraction &c1,const CFraction &c2);
friend bool operator > (int i,const CFraction &c);
friend bool operator > (const CFraction &c,int i);
friend bool operator < (int i,const CFraction &c);
friend bool operator < (const CFraction &c,int i);
friend bool operator == (int i,const CFraction &c);
friend bool operator == (const CFraction &c,int i);
friend bool operator != (int i,const CFraction &c);
friend bool operator != (const CFraction &c,int i);
friend bool operator >= (int i,const CFraction &c);
friend bool operator >= (const CFraction &c,int i);
friend bool operator <= (int i,const CFraction &c);
friend bool operator <= (const CFraction &c,int i);
CFraction operator + ();//取正一目函数
CFraction operator - ();//取反一目函数
CFraction operator ~ ();//取倒数一目函数
};
void CFraction::simplify()
{
int n;
n=gcd(nume,deno);
deno/=n;
nume/=n;
if (deno<0)
{
deno=-deno;
nume=-nume;
}
}
int gcd(int a,int b)
{
int m;
while(b!=0)
{
m=a%b;
a=b;
b=m;
}
return a;
}
CFraction operator + (const CFraction &c1,const CFraction &c2)
{
CFraction d;
d.nume=c1.nume*c2.deno+c2.nume*c1.deno;
d.deno=c1.deno*c2.deno;
d.simplify();
return d;
}
CFraction operator - (const CFraction &c1,const CFraction &c2)
{
CFraction d;
d.nume=c1.nume*c2.deno-c2.nume*c1.deno;
d.deno=c1.deno*c2.deno;
d.simplify();
return d;
}
CFraction operator * (const CFraction &c1,const CFraction &c2)
{
CFraction d;
d.nume=c1.nume*c2.nume;
d.deno=c1.deno*c2.deno;
d.simplify();
return d;
}
CFraction operator / (const CFraction &c1,const CFraction &c2)
{
CFraction d;
if (c2.nume==0)
return c1;
d.nume=c1.nume*c2.deno;
d.deno=c1.deno*c2.nume;
d.simplify();
return d;
}
CFraction operator + (int i,const CFraction &c)
{
CFraction s(c.nume+i*c.deno,c.deno);
s.simplify();
return s;
}
CFraction operator + (const CFraction &c,int i)
{
CFraction s(c.nume+i*c.deno,c.deno);
s.simplify();
return s;
}
CFraction operator - (int i,const CFraction &c)
{
CFraction s(c.nume-i*c.deno,c.deno);
s.simplify();
return s;
}
CFraction operator - (const CFraction &c,int i)
{
CFraction s(c.nume-i*c.deno,c.deno);
s.simplify();
return s;
}
CFraction operator * (int i,const CFraction &c)
{
CFraction s(c.nume*i,c.deno);
s.simplify();
return s;
}
CFraction operator * (const CFraction &c,int i)
{
CFraction s(c.nume*i,c.deno);
s.simplify();
return s;
}
CFraction operator / (int i,const CFraction &c)
{
CFraction s(c.nume,c.deno*i);
s.simplify();
return s;
}
CFraction operator / (const CFraction &c,int i)
{
CFraction s(c.nume,c.deno*i);
s.simplify();
return s;
}
bool operator > (const CFraction &c1,const CFraction &c2)
{
int c1_nume,c2_nume,common_deno;
c1_nume=c1.nume*c2.deno;
c2_nume=c2.nume*c1.deno;
common_deno=c1.deno*c2.deno;
if ((c1_nume-c2_nume)*common_deno>0)
return true;
return false;
}
bool operator<(const CFraction &c1,const CFraction &c2)
{
int c1_nume,c2_nume,common_deno;
c1_nume=c1.nume*c2.deno;
c2_nume=c2.nume*c1.deno;
common_deno=c1.deno*c2.deno;
if ((c1_nume-c2_nume)*common_deno<0)
return true;
return false;
}
bool operator==(const CFraction &c1,const CFraction &c2)
{
if (c1!=c2)
return false;
return true;
}
bool operator!=(const CFraction &c1,const CFraction &c2)
{
if (c1>c2 || c1<c2)
return true;
return false;
}
bool operator>=(const CFraction &c1,const CFraction &c2)
{
if (c1<c2)
return false;
return true;
}
bool operator<=(const CFraction &c1,const CFraction &c2)
{
if (c1>c2)
return false;
return true;
}
CFraction CFraction::operator+()
{
CFraction c;
c.nume=nume;
c.deno=deno;
c.simplify();
return c;
}
CFraction CFraction::operator-()
{
CFraction c;
c.nume=-nume;
c.deno=deno;
c.simplify();
return c;
}
CFraction CFraction::operator~()
{
CFraction t;
t=-*this;
t.simplify();
return t;
}
istream& operator>>(istream& input,CFraction& c)
{
char ch;
while(1)
{
input>>c.nume>>ch>>c.deno;
if(c.deno==0)
cout<<"分母为0,请重新输入!"<<endl;
else if(ch!='/')
cout<<"格式不正确,请重新输入!"<<endl;
else
break;
}
return input;
}
ostream& operator<<(ostream& output,CFraction& c)
{
output<<c.nume<<"/"<<c.deno;
}
int main()
{
CFraction c1,c2,s;
cin>>c1;
cin>>c2;
cout<<"分数:"<<endl<<"c1="<<c1;
cout<<'\t'<<"c2="<<c2<<endl;
s=+c1+c2;
cout<<endl;
cout<<"+c1+c2="<<s;
cout<<endl;
s=c1-c2;
cout<<"c1-c2="<<s;
cout<<endl;
s=c1*c2;
cout<<"c1*c2="<<s;
cout<<endl;
s=c1/c2;
cout<<"c1/c2="<<s;
cout<<endl;
s=-c1-c2;
cout<<"-c1-c2="<<s;
cout<<endl<<endl;
cout<<c1;
if (c1>c2) cout<<"大于";
if (c1<c2) cout<<"小于";
if (c1==c2) cout<<"等于";
cout<<c2;
cout<<endl;
CFraction c3(7,4),c4;
cout<<"c3="<<c3<<endl;
c4=c3+4;
cout<<"c3+4="<<c4;
c4=4+c3;
cout<<'\t'<<"4+c3="<<c4<<endl;
c4=c3-2;
cout<<"c3-2="<<c4;
c4=2-c3;
cout<<'\t'<<"3-c3="<<c4;
cout<<endl;
c4=c3*2;
cout<<"c3*2="<<c4;
c4=2*c3;
cout<<'\t'<<"2*c3="<<c4;
cout<<endl;
c4=c3/2;
cout<<"c3/2="<<c4;
c4=2/c3;
cout<<'\t'<<"2/c3="<<c4;
cout<<endl;
c4=-c3;
cout<<"-c3="<<c4<<endl;
return 0;
}