//fraction.h
#ifndef _FRACTION_H
#define _FRACTION_H
#include <iostream>
using namespace std;
class fraction
{
private:
int numerator; //分子
int denominator; //分母
public:
fraction():numerator(0),denominator(1) //构造函数
{
}
fraction(int a):numerator(a),denominator(1) //构造函数
{
}
fraction(int a,int b):numerator(a),denominator(b) //构造函数
{
}
friend istream& operator>>(istream&,fraction&); //重载输入流
friend ostream& operator<<(ostream&,fraction&); //重载输出流
friend const fraction& operator+(const fraction&,const fraction&); //重载“+”
friend const fraction& operator-(const fraction&,const fraction&); //重载“-”
friend const fraction& operator*(const fraction&,const fraction&); //重载“*”
friend const fraction& operator/(const fraction&,const fraction&); //重载“/”
bool operator==(const fraction&); //重载“==”
bool operator<(const fraction&); //重载“<”
bool operator>(const fraction&); //重载“>”
bool operator<=(const fraction&); //重载“<=”
bool operator>=(const fraction&); //重载“>=”
bool operator!=(const fraction&); //重载“!=”
const fraction& operator+=(const fraction&); //重载“+=”
const fraction& operator-=(const fraction&); //重载“-=”
const fraction& operator*=(const fraction&); //重载“*=”
const fraction& operator/=(const fraction&); //重载“/=”
const fraction& operator=(const fraction&); //重载“=”
const fraction& reciprocal(); //倒数
const fraction& reduct(); //约分
};
#endif
//fraction.cpp
#include "fraction.h"
#include <iostream>
#include <math.h>
using namespace std;
//输入函数
istream& operator>>(istream& in,fraction& f)
{
in>>f.numerator>>f.denominator;
return in;
}
//输出函数
ostream& operator<<(ostream& out,fraction& f)
{
if(f.denominator==0)
{
out<<"分母不能为0!"<<endl;
exit (0);
}
else if(f.numerator%f.denominator==0)
out<<f.numerator/f.denominator;
else
out<<f.numerator<<"/"<<f.denominator;
return out;
}
//最大公约数
int gcd(int a,int b)
{
int temp;
if(a<b)
{
temp=a;
a=b;
b=temp;
}
while(b!=0)
{
temp=a%b;
a=b;
b=temp;
}
return a;
}
//约分
const fraction& fraction::reduct()
{
int GCD=gcd(abs(numerator),abs(denominator));
numerator/=GCD;
denominator/=GCD;
return *this;
}
//倒数
const fraction& fraction::reciprocal()
{
int temp;
if(numerator==0)
{
cout<<"分母不能为0!"<<endl;
exit (0);
}
temp=numerator;
numerator=denominator;
denominator=temp;
return *this;
}
//重载“+”运算符
const fraction& operator+(const fraction& f1,const fraction& f2)
{
fraction f;
f.numerator=f1.numerator*f2.denominator+f2.numerator*f1.denominator;
f.denominator=f1.denominator*f2.denominator;
return f;
}
//重载“-”运算符
const fraction& operator-(const fraction& f1,const fraction& f2)
{
fraction f;
f.numerator=f1.numerator*f2.denominator-f2.numerator*f1.denominator;
f.denominator=f1.denominator*f2.denominator;
return f;
}
//重载“*”运算符
const fraction& operator*(const fraction& f1,const fraction& f2)
{
fraction f;
f.numerator=f1.numerator*f2.numerator;
f.denominator=f1.denominator*f2.denominator;
return f;
}
//重载“/”运算符
const fraction& operator/(const fraction& f1,const fraction& f2)
{
fraction f;
f.numerator=f1.numerator*f2.denominator;
f.denominator=f1.denominator*f2.numerator;
return f;
}
//重载“=”运算符
const fraction& fraction::operator=(const fraction& f)
{
numerator=f.numerator;
denominator=f.denominator;
return *this;
}
//重载“+=”运算符
const fraction& fraction::operator+=(const fraction& f)
{
numerator=numerator*f.denominator+f.numerator*denominator;
denominator*=f.denominator;
return *this;
}
//重载“-=”运算符
const fraction& fraction::operator-=(const fraction& f)
{
numerator=numerator*f.denominator-f.numerator*denominator;
denominator*=f.denominator;
return *this;
}
//重载“*=”运算符
const fraction& fraction::operator*=(const fraction& f)
{
numerator*=f.numerator;
denominator*=f.denominator;
return *this;
}
//重载“/=”运算符
const fraction& fraction::operator/=(const fraction& f)
{
numerator*=f.denominator;
denominator*=f.numerator;
return *this;
}
//重载“==”运算符
bool fraction::operator==(const fraction& f)
{
return (numerator*f.denominator==f.numerator*denominator);
}
//重载“<”运算符
bool fraction::operator<(const fraction& f)
{
return (numerator*f.denominator<f.numerator*denominator);
}
//重载“>”运算符
bool fraction::operator>(const fraction& f)
{
return (numerator*f.denominator>f.numerator*denominator);
}
//重载“<=”运算符
bool fraction::operator<=(const fraction& f)
{
return (numerator*f.denominator<=f.numerator*denominator);
}
//重载“>=”运算符
bool fraction::operator>=(const fraction& f)
{
return (numerator*f.denominator>=f.numerator*denominator);
}
//重载“!=”运算符
bool fraction::operator!=(const fraction& f)
{
return (numerator*f.denominator!=f.numerator*denominator);
}
//test.cpp
#include "fraction.h"
#include <iostream>
using namespace std;
int main()
{
fraction a;
fraction b(24,-10);
fraction c,d,e,f;
fraction g(2);
cout<<"请输入c的分子分母,以空格相隔!"<<endl;
cin>>c;
cout<<"初始值为:\n"<<"a="<<a<<",b="<<b<<",c="<<c<<",d="<<d<<",e="<<e<<",f="<<f<<",g="<<g<<endl;
cout<<"b="<<b<<"约分:"<<"b=";
b.reduct();
cout<<b<<endl;
cout<<"b="<<b<<"倒数:"<<"b=";
b.reciprocal();
cout<<b<<endl;
c=b;
cout<<"将b赋值给c:"<<"c="<<c<<endl;
d+=b+=a;
cout<<"d+=b+=a:"<<"d="<<d<<endl;
e-=b-=a;
cout<<"e-=b-=a:"<<"e="<<e<<endl;
f*=b*=a;
cout<<"f*=b*=a:"<<"f="<<f<<endl;
c/=g;
cout<<"c/=b:"<<"c="<<c<<endl;
f=a+b+d;
cout<<"f=a+b+d:"<<"f="<<f<<endl;
g=a-b-f;
cout<<"g=a-b-f:"<<"g="<<g<<endl;
g=a*b*f;
cout<<"g=a*b*f:"<<"g="<<g<<endl;
cout<<"a="<<a<<",d="<<d<<",";
cout<<"与整数运算:c=";
c+=2;
cout<<c<<endl;
if(a==d)
cout<<"a==d"<<endl;
else
cout<<"a!=d"<<endl;
a.reduct();
b.reduct();
c.reduct();
d.reduct();
e.reduct();
f.reduct();
g.reduct();
cout<<"约分后输出最终值:\n"<<"a="<<a<<",b="<<b<<",c="<<c<<",d="<<d<<",e="<<e<<",f="<<f<<",g="<<g<<endl;
}