/** Copyright (c) 2013, 煙台大學電腦學院* All rights reserved.* 檔案名稱:test.cpp* 作者:邱學偉* 完成日期:2013 年 5 月 4 日* 版本號碼:v1.0* 輸入描述:無* 問題描述:分數和整型數的運算子多載“+ - * /等”* 程式輸出:* 問題分析:* 演算法設計:略*/#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){}//建構函式定義,de=1分母不能為0! void simplify();//化簡分數 void display();//展示分數 friend CFraction operator+(const CFraction &c1,const CFraction &c2);//分數之間的加減乘除,友元函數實現 friend CFraction operator-(const CFraction &c1,const CFraction &c2); friend CFraction operator*(const CFraction &c1,const CFraction &c2); friend CFraction operator/(const CFraction &c1,const CFraction &c2); friend CFraction operator+(const CFraction &c,const int i);//分數和整數的加減乘除 friend CFraction operator+(const int i,const CFraction &c); friend CFraction operator-(const CFraction &c,const int i); friend CFraction operator-(const int i,const CFraction &c); friend CFraction operator*(const CFraction &c,const int i); friend CFraction operator*(const int i,const CFraction &c); friend CFraction operator/(const CFraction &c,const int i); friend CFraction operator/(const int i,const CFraction &c); friend bool operator==(const CFraction &c1,const CFraction &c2); friend bool operator!=(const CFraction &c1,const CFraction &c2); friend bool operator<=(const CFraction &c1,const CFraction &c2); friend bool operator>=(const CFraction &c1,const CFraction &c2); friend bool operator>(const CFraction &c1,const CFraction &c2); //比較大小 friend bool operator<(const CFraction &c1,const CFraction &c2); CFraction operator+();//取正 CFraction operator-();//取反};//分數的化簡void CFraction::simplify(){ int d,n,r; d=fabs(deno);//分母 “fabs()” 的作用求浮點數x的絕對值。 n=fabs(nume);//分子 if(d<n) { r=d; d=n; n=r; } while(r=d%n) { d=n; n=r; } deno=deno/n; nume=nume/n; //將分母轉化成正數 if(deno<0) { deno=-deno; nume=-nume; }}//展示分數void CFraction::display(){ cout<<"("<<nume<<"/"<<deno<<")"<<endl;}//分數相加CFraction operator+(const CFraction &c1,const CFraction &c2){ CFraction c; c.nume=c1.nume*c2.deno+c2.nume*c1.deno; c.deno=c1.deno*c2.deno; c.simplify(); return c;}//分數相減CFraction operator-(const CFraction &c1,const CFraction &c2){ CFraction c; c.nume=c1.nume*c2.deno-c2.nume*c1.deno; c.deno=c1.deno*c2.deno; c.simplify(); return c;}//分數相乘CFraction operator*(const CFraction &c1,const CFraction &c2){ CFraction c; c.nume=c1.nume*c2.nume; c.deno=c1.deno*c2.deno; c.simplify(); return c;}//分數相除CFraction operator/(const CFraction &c1,const CFraction &c2){ CFraction c; c.nume=c1.nume*c2.deno; c.deno=c1.deno*c2.nume; c.simplify(); return c;}//分數和整數的加法CFraction operator+(const CFraction &c,const int i){ CFraction c0; c0.nume=c.nume+i*c.deno; c0.deno=c.deno; c0.simplify(); return c0;}CFraction operator+(const int i,const CFraction &c){ CFraction c0; c0.nume=c.nume+i*c.deno; c0.deno=c.deno; c0.simplify(); return c0;}//分數和整數的減法CFraction operator-(const CFraction &c,const int i){ CFraction c0; c0.nume=c.nume-i*c.deno; c0.deno=c.deno; c0.simplify(); return c0;}CFraction operator-(const int i,const CFraction &c){ CFraction c0; c0.nume=i*c.deno-c.nume; c0.deno=c.deno; c0.simplify(); return c0;}//分數和整數的乘法CFraction operator*(const CFraction &c,const int i){ CFraction c0; c0.nume=c.nume*i; c0.deno=c.deno; c0.simplify(); return c0;}CFraction operator*(const int i,const CFraction &c){ CFraction c0; c0.nume=c.nume*i; c0.deno=c.deno; c0.simplify(); return c0;}//分數和整數的除法CFraction operator/(const CFraction &c,const int i){ CFraction c0; c0.nume=c.nume; c0.deno=c.deno*i; c0.simplify(); return c0;}CFraction operator/(const int i,const CFraction &c){ CFraction c0; c0.nume=c.deno*i; c0.deno=c.nume; c0.simplify(); return c0;}//分數取正CFraction CFraction::operator +(){ return *this;}//分數取負號CFraction CFraction::operator -(){ CFraction c; c.deno=-deno; c.nume=-nume; return c;}//比較兩個分數的大小bool operator>(const CFraction &c1,const CFraction &c2){ double t1,t2; t1=c1.nume*c2.deno; t2=c2.nume*c1.deno; if(t1>t2) return true; else return false;}bool operator<(const CFraction &c1,const CFraction &c2){ double t1,t2; t1=c1.nume*c2.deno; t2=c2.nume*c1.deno; if(t1<t2) return true; else return false;}bool operator >=(const CFraction &c1,const CFraction &c2){ double t1,t2; t1=c1.nume*c2.deno; t2=c2.nume*c1.deno; if(t1<t2) return false; else return true;}bool operator <=(const CFraction &c1,const CFraction &c2){ double t1,t2; t1=c1.nume*c2.deno; t2=c2.nume*c1.deno; if(t1>t2) return false; else return true;}bool operator ==(const CFraction &c1,const CFraction &c2){ if(c1!=c2) return false; else return true;}bool operator!=(const CFraction &c1,const CFraction &c2){ if(c1>c2 || c1<c2 ) return true; else return false;}int main(){ CFraction x(1,3),y(-5,10),s; cout<<"分數x=1/3 y=-5/10"<<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; CFraction c1(5,3),c2; //以下建議在調試環境中完成測試, c2=c1+5; c2=5+c1; c2=c1-5; c2=5-c1; c2=c1*5; c2=5*c1; c2=c1/5; c2=5/c1; bool b; b=(c1>2); b=(2>c1); return 0;}