1. 程式人生 > >第九周 【專案3-分數類中的運算子過載(續)】

第九周 【專案3-分數類中的運算子過載(續)】

問題描述:

在第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;
}


執行結果: