程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> c++ Fraction類 操作符重載練習

c++ Fraction類 操作符重載練習

編輯:C++入門知識

#include <iostream>
using namespace std;

int GreatestCommonDivisor(int m,int n) //輾轉相除法求最大公約數
{
    int r;
    do  
    {   
        r = m % n;  
        m = n;  
        n = r;  
    } while ( r != 0 ); 
    return m;
}

class Fraction;                                            //
ostream& operator<<(ostream& out,const Fraction &fra);    //
istream& operator>>(istream& in,const Fraction& fra);    //此三行為滿足vc6.0的編譯邏輯而聲明

class Fraction{
private:
    int fenzi,fenmu;                            //分子,分母
public:
    Fraction(){}
    ~Fraction(){}
    Fraction(int fenzi,int fenmu);
    Fraction operator+(const Fraction &fra)const;
    Fraction operator-(const Fraction &fra)const;
    Fraction operator*(const Fraction &fra)const;
    Fraction operator/(const Fraction &fra)const;
    friend ostream& operator<<(ostream& out,const Fraction& fra);//i/o重載必須使用友元重載
    friend istream& operator>>(istream& in,const Fraction& fra);
    void setValue(int mu,int zi);
};
Fraction::Fraction(int zi,int mu):fenzi(zi),fenmu(mu){
    if(mu==0){
        cout<<"分母不能為0!"<<endl;        
        exit(0);
    }
}
ostream& operator<<(ostream& out,const Fraction &fra){    
    if(fra.fenmu<0)
        out<<"(-"<<fra.fenzi<<"/"<<-fra.fenmu<<")";        //負分數顯示
    else if(fra.fenzi<0)
        out<<"(-"<<-fra.fenzi<<"/"<<fra.fenmu<<")";
    else if(fra.fenmu==1)
        out<<fra.fenzi;                                    //整數顯示
    else
        out<<fra.fenzi<<"/"<<fra.fenmu;                    //正分數顯示
    return out;
}

istream& operator>>(istream& in, Fraction& fra){
    int mu,zi;
    cout<<"請輸入分母與分子"<<endl;
    in>>mu>>zi;
    fra.setValue(mu,zi);
    return in;
}
void Fraction::setValue(int mu,int zi){
    fenmu=mu;
    fenzi=zi;
}
Fraction Fraction::operator+(const Fraction &fra)const{
    int a=fenzi,b=fenmu;    //▲▲▲重點▲▲▲
    //一定要使用const,因為不用的話會使上次運算的數據賦值到下次的運算l-value中
    //因為const函數無法改變類的內部變量,所以要用替身,若此處重載改用friend重載
    //則可以有效地避免此問題,因為friend重載的操作符有兩個引用的參數
    a=fra.fenmu*fenzi+fra.fenzi*fenmu;
    b*=fra.fenmu;    
    int g=GreatestCommonDivisor(a,b);
    if (g!=1)
    {
        a/=g;
        b/=g;
    }
    return Fraction(a,b);
}
Fraction Fraction::operator-(const Fraction &fra)const{
    int a=fenzi,b=fenmu;
    a=fra.fenmu*fenzi-fra.fenzi*fenmu;
    b*=fra.fenmu;    
    int g=GreatestCommonDivisor(a,b);
    if (g!=1)
    {
        a/=g;
        b/=g;
    }
    return Fraction(a,b);
}
Fraction Fraction::operator*(const Fraction &fra)const{
    int a=fenzi,b=fenmu;
    a*=fra.fenzi;
    b*=fra.fenmu;
    int g=GreatestCommonDivisor(a,b);
    if (g!=1)
    {
        a/=g;
        b/=g;
    }
    return Fraction(a,b);
}
Fraction Fraction::operator/(const Fraction &fra)const{
    return *this*Fraction(fra.fenmu,fra.fenzi);
}
void main()
{
    Fraction a(1,2);
    Fraction b(1,4);
    Fraction c=a+b;
    Fraction d=a-b;
    Fraction e=b-a;
    Fraction f=a*b;
    Fraction g=a/b;
    cout<<"a=1/2"<<endl
        <<"b=1/4"<<endl
        <<"a+b="<<c<<endl
        <<"a-b="<<d<<endl
        <<"b-a="<<e<<endl
        <<"a*b="<<f<<endl
        <<"a/b="<<g<<endl;
    Fraction h;
    cin>>h;
    cout<<h<<endl;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved