这是我写的第一个类,分数类型,虽然比较简单,但我犯的错也并不少,比方成员函数和全局函数打代码时总是搞混,输入负的分数时也出现各种变态的输出,还发现了一个以前不知道的知识点就是 a*1.0/b 和a/b*1.0不一样,收获不小,留下代码供复习用。
#include<iostream>
#include<cmath>
using namespace std;
class fraction
{
public:
fraction():mole(0),deno(1) {};
fraction(int,int);
fraction(double);
void print();
friend istream&operator>>(istream&,fraction&);
friend ostream&operator<<(ostream&,const fraction&);
friend fraction operator+(const fraction&,const fraction&);
friend fraction operator-(const fraction&,const fraction&);
friend fraction operator*(const fraction&,const fraction&);
friend fraction operator/(const fraction&,const fraction&);
friend fraction operator!(const fraction&);
friend bool operator <=(const fraction&,const fraction&);
friend bool operator >=(const fraction&,const fraction&);
friend bool operator <(const fraction&,const fraction&);
friend bool operator >(const fraction&,const fraction&);
friend bool operator ==(const fraction&,const fraction&);
friend bool operator !=(const fraction&,const fraction&);
fraction& operator++();
const fraction operator++(int);
fraction operator-()const;
fraction& operator--();
const fraction operator--(int);
operator double()const;
fraction& operator+=(const fraction&);
fraction& operator-=(const fraction&);
fraction& operator*=(const fraction&);
fraction& operator/=(const fraction&);
private:
int mole;
int deno;
void set(int,int);
static int gcd(const int&,const int &);
};
fraction::fraction(int a,int b)
{
set(a,b);
}
fraction::fraction(double a)
{
mole=0,deno=1;
int flag=a>0?1:-1;
a=fabs(a);
while(fabs(mole*1.0/deno-a)>0.001)
{
if(mole*1.0/deno<a)mole++;
else deno++;
}
mole*=flag;
}
int fraction::gcd(const int& a,const int& b)
{
return b==0?a:gcd(b,a%b);
}
void fraction::print()
{
cout<<mole<<"/"<<deno<<endl;
}
void fraction::set(int a,int b)
{
int t=gcd(a,b);
mole=a/t;
deno=b==0?1:b/t;
}
fraction fraction::operator -()const
{
return fraction(-mole,deno);
}
fraction operator+(const fraction&a,const fraction&b)
{
int z=a.mole*b.deno+b.mole*a.deno;
int m=a.deno*b.deno;
return fraction(z,m);
}
fraction operator-(const fraction&a,const fraction&b)
{
int z=a.mole*b.deno-b.mole*a.deno;
int m=a.deno*b.deno;
return fraction(z,m);
}
fraction operator*(const fraction&a,const fraction&b)
{
int z=a.mole*b.mole;
int m=a.deno*b.deno;
return fraction(z,m);
}
fraction operator/(const fraction&a,const fraction&b)
{
int z=a.mole*b.deno;
int m=a.deno*b.mole;
return fraction(z,m);
}
fraction& fraction::operator++()
{
mole+=deno;
return *this;
}
fraction& fraction::operator--()
{
mole-=deno;
return *this;
}
const fraction fraction::operator--(int)
{
fraction t=*this;
mole-=deno;
return t;
}
const fraction fraction::operator++(int)
{
fraction t=*this;
mole+=deno;
return t;
}
fraction operator!(const fraction& a)
{
return fraction(a.deno,a.mole);
}
istream& operator>>(istream& in,fraction& a)
{
int mole=0,deno=1;
in>>mole;
in.ignore();
in>>deno;
if(mole*1.0/deno<0)
a.set(mole,fabs(deno));
else
a.set(fabs(mole),fabs(deno));
return in;
}
ostream& operator<<(ostream& out,const fraction& b)
{
if(b.mole/b.deno<0)out<<'-';
out<<fabs(b.mole);
if(b.mole&&b.deno!=1)
{
out<<'/';
out<<fabs(b.deno);
}
return out;
}
fraction::operator double()const
{
return mole*1.0/deno;
}
bool operator <=(const fraction& a,const fraction& b)
{
return a.mole*b.deno<=b.mole*a.deno;
}
bool operator >=(const fraction&a,const fraction&b)
{
return a.mole*b.deno>=b.mole*a.deno;
}
bool operator <(const fraction&a,const fraction&b)
{
return a.mole*b.deno<b.mole*a.deno;
}
bool operator >(const fraction&a,const fraction&b)
{
return a.mole*b.deno>b.mole*a.deno;
}
bool operator ==(const fraction&a,const fraction&b)
{
return a.mole*b.deno==b.mole*a.deno;
}
bool operator !=(const fraction&a,const fraction&b)
{
return a.mole*b.deno!=b.mole*a.deno;
}
fraction& fraction::operator +=(const fraction& other)
{
mole=mole*other.deno+deno*other.mole;
deno=deno*other.deno;
int t=gcd(mole,deno);
mole/=t;
deno/=t;
return *this;
}
fraction& fraction::operator -=(const fraction& other)
{
mole=mole*other.deno-deno*other.mole;
deno=deno*other.deno;
int t=gcd(mole,deno);
mole/=t;
deno/=t;
return *this;
}
fraction& fraction::operator *=(const fraction& other)
{
mole*=other.mole;
deno*=other.deno;
int t=gcd(mole,deno);
mole/=t,deno/=t;
return *this;
}
fraction& fraction::operator /=(const fraction& other)
{
mole*=other.deno;
deno*=other.mole;
int t=gcd(mole,deno);
mole/=t,deno/=t;
return *this;
}
int main()
{
fraction a,b;
cout<<"求倒数:"<<endl;
cin>>a;
cout<<"!a:"<<!a<<endl<<endl;
cout<<"强制转换:"<<endl;
cin>>a;
cout<<"double(a)"<<double(a)<<endl;
cout<<"自加自减:"<<endl;
cin>>a;
cout<<"a++:"<<a++<<endl;
cout<<"a:"<<a<<endl;
cout<<"++a:"<<++a<<endl;
cout<<"a:"<<a<<endl<<endl;
cout<<"基本运算:"<<endl;
cin>>a>>b;
cout<<"a+b:"<<a+b<<endl;
cout<<"a/b:"<<a/b<<endl;
cout<<"a*b:"<<a*b<<endl;
cout<<"a-b:"<<a-b<<endl;
cout<<"a+=b"<<(a+=b)<<endl;
cout<<"a="<<a<<"b="<<b<<endl;
cout<<"a-=b"<<(a-=b)<<endl;
cout<<"a="<<a<<"b="<<b<<endl;
cout<<"a*=b"<<(a*=b)<<endl;
cout<<"a="<<a<<"b="<<b<<endl;
cout<<"a/=b"<<(a/=b)<<endl<<endl;
cout<<"关系比较:"<<endl;
cin>>a>>b;
cout<<"a>=b:"<<(a>=b)<<endl;
cout<<"a<=b:"<<(a<=b)<<endl;
cout<<"a>b:"<<(a>b)<<endl;
cout<<"a<b:"<<(a<b)<<endl;
cout<<"a!=b:"<<(a!=b)<<endl;
return 0;
}