第九周 【專案3-分數類中的運算子過載(續)】
阿新 • • 發佈:2019-01-29
問題描述:
在第8周專案3基礎上
(1)定義分數的一目運算+和-,分別代表分數取正和求反,將“按位取反運算子”~過載為分數的求倒數運算。
(2)定義分數類中<<和>>運算子過載,實現分數的輸入輸出,改造原程式中對運算結果顯示方式,使程式讀起來更自然。
程式碼:
#include <iostream> #include <stdlib.h> using namespace std; class CFraction { private: int nume; // 分子 int deno; // 分母 public: CFraction(int nu=0,int de=1); //建構函式,初始化用 void set(int nu=0,int de=1); //置值,改變值時用 void input(); //按照"nu/de"的格式,如"5/2"的形式輸入 void simplify(); //化簡(使分子分母沒有公因子) void amplify(int n); //放大n倍,如2/3放大5倍為10/3 void display(); //輸出:以8/6為例,style為0時,原樣輸出8/6; int gcd(int,int ); //style為1時,輸出化簡後形式4/3; //style為2時,輸出1(1/3)形式,表示一又三分之一; //style為3時,用小數形式輸出,如1.3333; //預設方式0 CFraction operator+(const CFraction &c); //兩個分數相加,結果要化簡 CFraction operator-(const CFraction &c); //兩個分數相減,結果要化簡 CFraction operator*(const CFraction &c); //兩個分數相乘,結果要化簡 CFraction 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); bool operator<=(const CFraction &c); friend CFraction operator+(const CFraction &c,int i); //兩個分數相加,結果要化簡 friend CFraction operator-(const CFraction &c,int i); //兩個分數相減,結果要化簡 friend CFraction operator*(const CFraction &c,int i); //兩個分數相乘,結果要化簡 friend CFraction operator/(const CFraction &c,int i); //兩個分數相除,結果要化簡 friend bool operator>(const CFraction &c,int i); friend bool operator<(const CFraction &c,int i); friend bool operator==(const CFraction &c,int i); friend bool operator!=(const CFraction &c,int i); friend bool operator>=(const CFraction &c,int i); friend bool operator<=(const CFraction &c,int i); friend CFraction operator+(int i,const CFraction &c); //兩個分數相加,結果要化簡 friend CFraction operator-(int i,const CFraction &c); //兩個分數相減,結果要化簡 friend CFraction operator*(int i,const CFraction &c); //兩個分數相乘,結果要化簡 friend CFraction operator/(int i,const CFraction &c); //兩個分數相除,結果要化簡 friend bool operator>(int i,const CFraction &c); friend bool operator<(int i,const CFraction &c); friend bool operator==(int i,const CFraction &c); friend bool operator!=(int i,const CFraction &c); friend bool operator>=(int i,const CFraction &c); friend bool operator<=(int i,const CFraction &c); friend istream&operator>>(istream& in,CFraction &c); friend ostream&operator<<(ostream& out,const CFraction &c); CFraction operator+(); CFraction operator-(); CFraction operator~(); }; istream & operator>>(istream& in,CFraction &c){ char ch; while(1){ in>>c.nume>>ch>>c.deno; if (c.deno==0) cerr<<"分母為0, 請重新輸入\n"; else if(ch!='/') cerr<<"格式錯誤(形如m/n)! 請重新輸入\n"; else break; } return in; } ostream & operator<<(ostream& out,const CFraction &c){ out<<c.nume<<'/'<<c.deno; return out; } CFraction CFraction::operator+(){ return *this; } CFraction CFraction::operator-(){ CFraction t; t.deno=-deno; t.nume=nume; return t; } CFraction CFraction::operator~(){ CFraction t; t.deno=nume; t.nume=deno; if(t.deno<0){ t.deno=-t.deno; t.nume=-t.nume; } return t; } CFraction::CFraction(int nu,int de){ if(de==0){ cerr<<"初始化中發生錯誤,程式退出\n"; exit(0); } else { nume=nu; deno=de; } } void CFraction ::input (){ int nu,de; char c; while(1) { cout<<"請輸入分數: "; cin>>nu>>c>>de; if(c!='/') cout<<"輸入格式錯誤!\n "; else if (de==0) cout<<"分母不能為零!\n "; else break; } nume=nu; deno=de; } void CFraction ::set(int nu,int de){ if(de==0); else { deno=de; nume=nu; } } void CFraction ::simplify(){ int a; a=gcd(nume,deno); deno/=a; nume/=a; } void CFraction::amplify(int n){ nume*=n; } int CFraction::gcd(int m, int n){ int r; if (m<n){ r=m; m=n; n=r; } while(r=m%n){ m=n; n=r; } return n; } void CFraction::display(){ int n,style; cout<<"請選擇輸出模式(0:原樣\t1:化簡形式\t2:帶分數形式\t3:近似值)\n"; cin>>style; switch(style) { case 0: cout<<"原樣:" <<nume<<'/'<<deno<<endl; break; case 1: n=gcd(deno, nume); cout<<"化簡形式: "<<nume/n<<'/'<<deno/n<<endl; break; case 2: cout<<"帶分數形式:" <<nume/deno<<'('<<nume%deno<<'/'<<deno<<')'<<endl; break; case 3: cout<<"近似值:" <<nume/double(deno)<<endl; break; default: 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; 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){ if (!c.nume) { cout<<"運算錯誤!\n"; return *this; } CFraction t; t.nume=nume*c.deno; t.deno=deno*c.nume; t.simplify(); return t; } bool CFraction::operator>(const CFraction &c){ CFraction t; t=*this-c; if(t.nume*t.deno>0) return true; else false; } bool CFraction::operator<(const CFraction &c){ CFraction t; t=*this-c; if(t.nume*t.deno<0) return true; else false; } bool CFraction::operator>=(const CFraction &c){ if(*this<c) return false; else true; } bool CFraction::operator<=(const CFraction &c){ if(*this>c) return false; else true; } bool CFraction::operator==(const CFraction &c){ if(nume-c.nume==0&&deno-c.nume==0) return true; else false; } bool CFraction::operator!=(const CFraction &c){ if(*this==c) return false; else true; } CFraction operator+(const CFraction &c, int i){ CFraction c1(c.nume+i*c.deno,c.deno); c1.simplify(); return c1; } CFraction operator+(int i, const CFraction &c ) { CFraction c1(c.nume+i*c.deno,c.deno); c1.simplify(); return c1; } CFraction operator-(const CFraction &c, int i) { CFraction c1(c.nume-i*c.deno,c.deno); c1.simplify(); return c1; } CFraction operator-(int i, const CFraction &c ) { CFraction c1(i*c.deno-c.nume,c.deno); c1.simplify(); return c1; } CFraction operator*(const CFraction &c, int i) { CFraction c1(c.nume*i,c.deno); c1.simplify(); return c1; } CFraction operator*(int i, const CFraction &c ) { CFraction c1(c.nume*i,c.deno); c1.simplify(); return c1; } CFraction operator/(const CFraction &c, int i) { CFraction c1(c.nume,c.deno*i); c1.simplify(); return c1; } CFraction operator/(int i, const CFraction &c ) { CFraction c1(i*c.deno,c.nume); c1.simplify(); return c1; } bool operator>(const CFraction &c, int i) { if(c.deno>0) return c.nume>(i*c.deno); else return c.nume<(i*c.deno); } bool operator>(int i, const CFraction &c) { if(c.deno>0) return (i*c.deno)>c.nume; else return (i*c.deno)<c.nume; } bool operator<(const CFraction &c, int i) { if(c.deno>0) return c.nume<(i*c.deno); else return c.nume>(i*c.deno); } bool operator<(int i, const CFraction &c) { if(c.deno>0) return (i*c.deno)<c.nume; else return (i*c.deno)>c.nume; } bool operator==(const CFraction &c, int i) { return c.nume==(i*c.deno); } bool operator==(int i, const CFraction &c) { return c.nume==(i*c.deno); } bool operator!=(const CFraction &c, int i) { return c.nume!=(i*c.deno); } bool operator!=(int i, const CFraction &c) { return c.nume!=(i*c.deno); } bool operator>=(const CFraction &c, int i) { return !(c<i); } bool operator>=(int i, const CFraction &c) { return !(i<c); } bool operator<=(const CFraction &c, int i) { return !(c>i); } bool operator<=(int i, const CFraction &c) { return !(i>c); } int main() { CFraction x,y,s; cout<<"輸入x: "; cin>>x; cout<<"輸入y: "; cin>>y; s=+x+y; cout<<"+x+y="<<s<<endl; s=x-y; cout<<"x-y="<<s<<endl; s=x*y; cout<<"x*y="<<s<<endl; s=x/y; cout<<"x/y="<<s<<endl; cout<<"-x="<<-x<<endl; cout<<"+x="<<+x<<endl; cout<<"x的倒數: "<<~x<<endl; cout<<x; if (x>y) cout<<"大於\n"; if (x<y) cout<<"小於\n"; if (x==y) cout<<"等於\n"; cout<<y<<endl; return 0; }
執行結果: