#include <iostream>#include <Cmath>using namespace std;class CFraction{private:int nume; // 分子int deno; // 分母public:CFraction(int nu=0,int de=1):nume(nu),deno(de){}void simplify();void display();CFraction operator+(const CFraction &c); //兩個分數相加,結果要化簡CFraction operator-(const CFraction &c); //兩個分數相減,結果要化簡CFraction operator*(const CFraction &c); //兩個分數相乘,結果要化簡CFraction operator/(const CFraction &c); //兩個分數相除,結果要化簡CFraction operator+(); //取正一目運算CFraction operator-(); //取反一目運算bool operator>(const CFraction &c);bool operator<(const CFraction &c);bool operator==(const CFraction &c);bool operator!=(const CFraction &c);bool operator>=(const CFraction &c);bool operator<=(const CFraction &c);};// 分數化簡void CFraction::simplify(){int m,n,r;m=fabs(deno);n=fabs(nume);cout<<"===="<<m<<":"<<n;while(r=m%n) // 求m,n的最大公約數{m=n;n=r;}deno/=n; // 化簡nume/=n;if (deno<0) // 將分母轉化為正數{deno=-deno;nume=-nume;}}//顯示分數void CFraction::display(){cout<<"("<<nume<<"/"<<deno<<")"<<endl;}// 分數相加CFraction CFraction::operator+(const CFraction &c){CFraction t;t.nume=nume*c.deno+c.nume*deno;t.deno=deno*c.deno;t.simplify();return t;}// 分數相減CFraction CFraction:: operator-(const CFraction &c){CFraction t;t.nume=nume*c.deno-c.nume*deno; if(t.nume==0) { cout<<"結果為0"; cout<<endl; t.nume==0; t.deno==0;}else{t.deno=deno*c.deno;t.simplify();}return t;}// 分數相乘CFraction CFraction:: operator*(const CFraction &c){CFraction t;t.nume=nume*c.nume;t.deno=deno*c.deno;t.simplify();return t;}// 分數相除CFraction CFraction:: operator/(const CFraction &c){CFraction t;if (!c.nume) return *this; //除法無效時,這種情況需要考慮,但這種處理仍不算合理t.nume=nume*c.deno;t.deno=deno*c.nume;t.simplify();return t;}// 分數取正號CFraction CFraction:: operator+(){return *this;}// 分數取負號CFraction CFraction:: operator-(){CFraction x;x.nume=-nume;x.deno=-deno;return x;}// 分數比較大小bool CFraction::operator>(const CFraction &c){int this_nume,c_nume,common_deno;this_nume=nume*c.deno; // 計算分數通分後的分子,同分母為deno*c.denoc_nume=c.nume*deno;common_deno=deno*c.deno;//if (this_nume>c_nume) return true; 無法應對common_deno<0的情形//下面的語句更簡練的一種寫法if ((this_nume-c_nume)*common_deno>0) return true;if ((this_nume>c_nume&&common_deno>0)||(this_nume<c_nume&&common_deno<0)) return true; // 將通分後的分子比較大小return false;}// 分數比較大小bool CFraction::operator<(const CFraction &c){int this_nume,c_nume,common_deno;this_nume=nume*c.deno;c_nume=c.nume*deno;common_deno=deno*c.deno;if ((this_nume-c_nume)*common_deno<0) return true;return false;}// 分數比較大小bool CFraction::operator==(const CFraction &c){if (*this!=c) return false;return true;}// 分數比較大小bool CFraction::operator!=(const CFraction &c){if (*this>c || *this<c) return true;return false;}// 分數比較大小bool CFraction::operator>=(const CFraction &c){if (*this<c) return false;return true;}// 分數比較大小bool CFraction::operator<=(const CFraction &c){if (*this>c) return false;return true;}int main(){CFraction x(2,6),y(3,9),s;cout<<"分數x=2/6 y=3/9"<<endl;s=+x+y;cout<<"+x+y=";s.display();s=x-y;cout<<"x-y=";s.display();s=x*y;cout<<"x*y=";s.display();s=x/y;cout<<"x/y=";s.display();s=-x+y;cout<<"-x+y=";s.display();x.display();if (x>y) cout<<"大於"<<endl;if (x<y) cout<<"小於"<<endl;if (x==y) cout<<"等於"<<endl;y.display();cout<<endl;return 0;}
運行結果: