正文

有理数(运算符重载集锦)2005-09-15 11:29:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/soliddream/4778.html

分享到:

#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,测试异常处理;}

阅读(3707) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册