#if!defined(RATIONAL_H)#define RATIONAL_H #include<iostream>#include<stdlib.h>using namespace std;namespace std{ class Rational{ private: long num,den; void Standardize(void); long gcd(long m,long n)const; public: Rational(long p=0,long q=1); Rational(double x); friend istream&operator>>(istream&istr,Rational&x); friend ostream&operator<<(ostream&ostr,const Rational&x); Rational operator+(Rational&x)const; Rational operator-(Rational&x)const; Rational operator*(Rational&x)const; Rational operator/(Rational&x)const; Rational operator-(void)const; int operator<(Rational&x)const; int operator<=(Rational&x)const; int operator==(Rational&x)const; int operator!=(Rational&x)const; int operator>(Rational&x)const; int operator>=(Rational&x)const; operator double(void)const; int GetNumberator(void)const{return num;} int GetDenominator(void)const{return den;} void Reduce(void); }; Rational::Rational(long p,long q):num(p),den(q) { if(den==0) { cerr<<"A Zero denominator is invalid"<<endl; exit(1); } Standardize(); Reduce(); } Rational::Rational(double x) { double val1,val2; val1=100000000L*x; val2=10000000L*x; num=long(val1-val2); den=90000000L; //Standardize(); Reduce(); } void Rational::Standardize(void) { if(den<0) { num=-num; den=-den; } } long Rational::gcd(long m,long n)const { static long x; if(m>n) { if(n==0)x=m; else gcd(n,m%n); } else { if(m==0)x=n; else gcd(m,n%m); } return x; } istream&operator>>(istream&istr,Rational&x) { char c; istr>>x.num>>c>>x.den; if(x.den==0){ cerr<<"A Zero denominator is invalid"<<endl; exit(1); } x.Standardize(); x.Reduce(); return istr; } ostream&operator<<(ostream&ostr,const Rational&x) { ostr<<x.num<<'/'<<x.den; return ostr; } Rational Rational::operator +(Rational&x)const { Rational temp=Rational(num*x.den+den*x.num,den*x.den); temp.Reduce(); return temp; } Rational Rational::operator -(Rational&x)const { Rational temp=Rational(num*x.den-den*x.num,den*x.den); temp.Reduce(); return temp; } Rational Rational::operator *(Rational&x)const { Rational temp=Rational(num*x.num,den*x.den); temp.Reduce(); return temp; } Rational Rational::operator /(Rational&x)const { Rational temp=Rational(num*x.den,den*x.num); temp.Standardize(); temp.Reduce(); return temp; } Rational Rational::operator -(void)const {return Rational(-num,den);} int Rational::operator <(Rational&x)const {return (num*x.den<den*x.num);} int Rational::operator <=(Rational&x)const {return(num*x.den<=den*x.num);} int Rational::operator ==(Rational&x)const {return(num*x.den==den*x.num);} int Rational::operator !=(Rational&x)const {return(num*x.den!=den*x.num);} int Rational::operator >(Rational&x)const {return(num*x.den>den*x.num);} int Rational::operator >=(Rational&x)const {return(num*x.den>=den*x.num);} Rational::operator double(void)const {return double(num)/den;} void Rational::Reduce(void) { long bigdivisor,tempnumerator; tempnumerator=(num<0)?-num:num; if(num==0) den=1; else { bigdivisor=gcd(tempnumerator,den); if(bigdivisor>1) { num/=bigdivisor; den/=bigdivisor; } } } void PrintMixedNumber(Rational x) { long wholepart=long(x.GetNumberator()/x.GetDenominator()); Rational fractionpart=x-Rational(wholepart); if(fractionpart==Rational(0L)) cout<<wholepart<<" "; else { fractionpart.Reduce(); if(wholepart<0) fractionpart=-fractionpart; if(wholepart!=0) cout<<wholepart<<" "<<fractionpart<<" "; else cout<<fractionpart<<" "; } } }#endif//测试程序void main(){ Rational a(2,3),b(1,2),c,e; //输出输入流的重载; cout<<a<<setw(3)<<b<<endl; c=a+b; //operator+()重载; PrintMixedNumber(c); //void PrintMixedNumber(Rational x)应用; Rational d(.5); //调用第二个构造函数; cout<<d<<endl; if(c>d) //调用关系运算符重载; cout<<c; else cout<<d; cout<<endl; cin>>e; //输入3/0,测试异常处理;}

评论