模糊数的C++实现

来源:互联网 发布:java web页面打印功能 编辑:程序博客网 时间:2024/06/03 03:44

头文件:

#ifndef 模糊数的实现_H_INCLUDED#define 模糊数的实现_H_INCLUDED#include<iostream>using namespace std;class FuzzyNumber{public:    FuzzyNumber(const double& mu=0.0,const double& alpha=0.0,const double& beta=0.0);    FuzzyNumber(const FuzzyNumber& num);        double mean()const;    double leftSpread()const;    double rightSpread()const;        void setMean(const double& mu);    void setLeftSpread(const double& alpha);    void setRightSpread(const double& beta);        double operator()(const double& x)const;        FuzzyNumber& operator = (const FuzzyNumber& num);    FuzzyNumber operator + (const FuzzyNumber& num)const;    FuzzyNumber operator - (const FuzzyNumber& num)const;    FuzzyNumber operator * (const FuzzyNumber& num)const;    FuzzyNumber operator / (const FuzzyNumber& num)const;    FuzzyNumber operator - ()const;        FuzzyNumber& operator = (const double& num);    FuzzyNumber operator + (const double& num)const;    FuzzyNumber operator - (const double& num)const;    FuzzyNumber operator * (const double& num)const;    FuzzyNumber operator / (const double& num)const;        FuzzyNumber invert()const;        friend FuzzyNumber operator + (const double& crisp,const FuzzyNumber& fuzzy);    friend FuzzyNumber operator - (const double& crisp,const FuzzyNumber& fuzzy);    friend FuzzyNumber operator * (const double& crisp,const FuzzyNumber& fuzzy);    friend FuzzyNumber operator / (const double& crisp,const FuzzyNumber& fuzzy);    friend istream& operator >> (istream& is,FuzzyNumber& num);    friend ostream& operator << (ostream& os,const FuzzyNumber& num)    {        os<<"("<<num._mu<<","<<num._alpha<<","<<num._beta<<")";        return os;    }    private:    double _mu,_alpha,_beta;    double LRfunc(const double& x)const;};FuzzyNumber::FuzzyNumber(const double& mu,const double& alpha,const double& beta):_mu(mu),_alpha(alpha),_beta(beta){};FuzzyNumber::FuzzyNumber(const FuzzyNumber& num){*this=num;}double FuzzyNumber::mean()const{return _mu;}double FuzzyNumber::leftSpread()const{return _alpha;}double FuzzyNumber::rightSpread()const{return _beta;}void FuzzyNumber::setMean(const double& mu){_mu=mu;}void FuzzyNumber::setLeftSpread(const double& alpha){_alpha=alpha;}void FuzzyNumber::setRightSpread(const double& beta){_beta=beta;}double FuzzyNumber::operator()(const double& x)const{    if(x<_mu)        return LRfunc((_mu-x)/_alpha);    else        return LRfunc((x-_mu)/_beta);}FuzzyNumber& FuzzyNumber::operator = (const FuzzyNumber& num){    _mu=num._mu;    _alpha=num._alpha;    _beta=num._beta;        return *this;}FuzzyNumber FuzzyNumber::operator + (const FuzzyNumber& num)const{    double mu=_mu+num._mu;    double alpha=_alpha+num._alpha;    double beta=_beta+num._beta;        return FuzzyNumber(mu,alpha,beta);}FuzzyNumber FuzzyNumber::operator - (const FuzzyNumber& num)const{    double mu=_mu-num._mu;    double alpha=_alpha+num._alpha;    double beta=_beta+num._beta;        return FuzzyNumber(mu,alpha,beta);}FuzzyNumber FuzzyNumber::operator * (const FuzzyNumber& num)const{    double mu=_mu*num._mu;    double alpha=_mu*num._alpha+num._mu*_alpha;    double beta=_mu*num._beta+num._mu*_beta;        return FuzzyNumber(mu,alpha,beta);}FuzzyNumber FuzzyNumber::operator / (const FuzzyNumber& num)const{    return *this*num.invert();}FuzzyNumber FuzzyNumber::operator - ()const{    return FuzzyNumber(-_mu,_alpha,_beta);}FuzzyNumber& FuzzyNumber::operator = (const double& num){    _mu=num;        return *this;}FuzzyNumber FuzzyNumber::operator + (const double& num)const{    double mu=_mu+num;        return FuzzyNumber(mu,_alpha,_beta);}FuzzyNumber FuzzyNumber::operator - (const double& num)const{    double mu=_mu-num;        return FuzzyNumber(-mu,_alpha,_beta);}FuzzyNumber FuzzyNumber::operator * (const double& num)const{    double mu=_mu*num;    double alpha=num*_alpha;    double beta=num*_beta;        return FuzzyNumber(mu,alpha,beta);}FuzzyNumber FuzzyNumber::operator / (const double& num)const{    return *this*((double)1/num);}FuzzyNumber FuzzyNumber::invert()const{    double mu=(double)1/_mu;    double alpha=_beta/(_mu*(_mu+_beta));    double beta=_alpha/(_mu*(_mu+_alpha));        return FuzzyNumber(mu,alpha,beta);}FuzzyNumber operator + (const double& crisp,const FuzzyNumber& fuzzy){    return FuzzyNumber(crisp)+fuzzy;}FuzzyNumber operator - (const double& crisp,const FuzzyNumber& fuzzy){    return FuzzyNumber(crisp)-fuzzy;}FuzzyNumber operator * (const double& crisp,const FuzzyNumber& fuzzy){    return FuzzyNumber(crisp)*fuzzy;}FuzzyNumber operator / (const double& crisp,const FuzzyNumber& fuzzy){    return FuzzyNumber(crisp)/fuzzy;}istream& operator >> (istream& is,FuzzyNumber& num){    is>>num._mu>>num._alpha>>num._beta;        return is;}double FuzzyNumber::LRfunc(const double& x)const{    if((x>=0.0)&&(x<=1.0))        return 1.0-x;    else        return 0.0;}#endif // 模糊数的实现_H_INCLUDED

可以直接运行的版本:

#include <iostream>using namespace std;class FuzzyNumber{public:FuzzyNumber(const double& mu=0.0,const double& alpha=0.0,const double& beta=0.0);FuzzyNumber(const FuzzyNumber& num);double mean()const;double leftSpread()const;double rightSpread()const;void setMean(const double& mu);void setLeftSpread(const double& alpha);void setRightSpread(const double& beta);double operator()(const double& x)const;FuzzyNumber& operator = (const FuzzyNumber& num);FuzzyNumber operator + (const FuzzyNumber& num)const;FuzzyNumber operator - (const FuzzyNumber& num)const;FuzzyNumber operator * (const FuzzyNumber& num)const;FuzzyNumber operator / (const FuzzyNumber& num)const;FuzzyNumber operator - ()const;FuzzyNumber& operator = (const double& num);FuzzyNumber operator + (const double& num)const;FuzzyNumber operator - (const double& num)const;FuzzyNumber operator * (const double& num)const;FuzzyNumber operator / (const double& num)const;FuzzyNumber invert()const;friend FuzzyNumber operator + (const double& crisp,const FuzzyNumber& fuzzy);friend FuzzyNumber operator - (const double& crisp,const FuzzyNumber& fuzzy);friend FuzzyNumber operator * (const double& crisp,const FuzzyNumber& fuzzy);friend FuzzyNumber operator / (const double& crisp,const FuzzyNumber& fuzzy);friend istream& operator >> (istream& is,FuzzyNumber& num);friend ostream& operator << (ostream& os,const FuzzyNumber& num){os<<"("<<num._mu<<","<<num._alpha<<","<<num._beta<<")";return os;}private:double _mu,_alpha,_beta;double LRfunc(const double& x)const;};FuzzyNumber::FuzzyNumber(const double& mu,const double& alpha,const double& beta):_mu(mu),_alpha(alpha),_beta(beta){};FuzzyNumber::FuzzyNumber(const FuzzyNumber& num){*this=num;}double FuzzyNumber::mean()const{return _mu;}double FuzzyNumber::leftSpread()const{return _alpha;}double FuzzyNumber::rightSpread()const{return _beta;}void FuzzyNumber::setMean(const double& mu){_mu=mu;}void FuzzyNumber::setLeftSpread(const double& alpha){_alpha=alpha;}void FuzzyNumber::setRightSpread(const double& beta){_beta=beta;}double FuzzyNumber::operator()(const double& x)const{if(x<_mu)returnLRfunc((_mu-x)/_alpha);elsereturn LRfunc((x-_mu)/_beta);}FuzzyNumber& FuzzyNumber::operator = (const FuzzyNumber& num){_mu=num._mu;_alpha=num._alpha;_beta=num._beta;return *this;}FuzzyNumber FuzzyNumber::operator + (const FuzzyNumber& num)const{double mu=_mu+num._mu;double alpha=_alpha+num._alpha;double beta=_beta+num._beta;return FuzzyNumber(mu,alpha,beta);}FuzzyNumber FuzzyNumber::operator - (const FuzzyNumber& num)const{double mu=_mu-num._mu;double alpha=_alpha+num._alpha;double beta=_beta+num._beta;return FuzzyNumber(mu,alpha,beta);}FuzzyNumber FuzzyNumber::operator * (const FuzzyNumber& num)const{double mu=_mu*num._mu;double alpha=_mu*num._alpha+num._mu*_alpha;double beta=_mu*num._beta+num._mu*_beta;return FuzzyNumber(mu,alpha,beta);}FuzzyNumber FuzzyNumber::operator / (const FuzzyNumber& num)const{return *this*num.invert();}FuzzyNumber FuzzyNumber::operator - ()const{return FuzzyNumber(-_mu,_alpha,_beta);}FuzzyNumber& FuzzyNumber::operator = (const double& num){_mu=num;return *this;}FuzzyNumber FuzzyNumber::operator + (const double& num)const{double mu=_mu+num;return FuzzyNumber(mu,_alpha,_beta);}FuzzyNumber FuzzyNumber::operator - (const double& num)const{double mu=_mu-num;return FuzzyNumber(-mu,_alpha,_beta);}FuzzyNumber FuzzyNumber::operator * (const double& num)const{double mu=_mu*num;double alpha=num*_alpha;double beta=num*_beta;return FuzzyNumber(mu,alpha,beta);}FuzzyNumber FuzzyNumber::operator / (const double& num)const{return *this*((double)1/num);}FuzzyNumber FuzzyNumber::invert()const{double mu=(double)1/_mu;double alpha=_beta/(_mu*(_mu+_beta));double beta=_alpha/(_mu*(_mu+_alpha));return FuzzyNumber(mu,alpha,beta);}FuzzyNumber operator + (const double& crisp,const FuzzyNumber& fuzzy){return FuzzyNumber(crisp)+fuzzy;}FuzzyNumber operator - (const double& crisp,const FuzzyNumber& fuzzy){return FuzzyNumber(crisp)-fuzzy;}FuzzyNumber operator * (const double& crisp,const FuzzyNumber& fuzzy){return FuzzyNumber(crisp)*fuzzy;}FuzzyNumber operator / (const double& crisp,const FuzzyNumber& fuzzy){return FuzzyNumber(crisp)/fuzzy;}istream& operator >> (istream& is,FuzzyNumber& num){is>>num._mu>>num._alpha>>num._beta;return is;}double FuzzyNumber::LRfunc(const double& x)const{if((x>=0.0)&&(x<=1.0))return 1.0-x;else return 0.0;}int main(){FuzzyNumber num1(2.0,0.5,0.5),num2(3.0,0.5,0.5);cout<<num1+num2<<endl;cout<<num1-num2<<endl;cout<<num1*num2<<endl;cout<<num1/num2<<endl;cout<<num1+2<<endl;cout<<num1-2<<endl;cout<<num1*2<<endl;cout<<num1/2<<endl;return 0;}


0 0
原创粉丝点击