c++重载运算符 和 友元函数 的应用

1.设计一个类,用自己的成员函数重载运算符,使对整型的运算符=+-*/ 适用于分数运算。要求:

1)输出结果是最简分数(可以是带分数);

2)分母为1,只输出分子。

参考的输入输出:

Inputx: 1/6

Inputy: 2/9

x+y=7/18

x-y=-1/18

x*y=1/27

x/y=3/4

 

###输入格式:

 

提示“Input x: ”,输入第一个分数。如:1/6

提示“Input y: ”,输入第二个分数。如:2/9

 

###输出格式:

提示并输出+-*/的结果,如

x+y=7/18

x-y=-1/18

x*y=1/27

x/y=3/4

 

###输入样例(其中的一种情况):

Inputx: 1/6

Inputy: 2/9

 

###输出样例(对应的输出):

x+y=7/18

x-y=-1/18

x*y=1/27

x/y=3

#include <iostream>
using namespace std;
class caculator{
public:
    caculator (int n=0, int d=0):num(n),den(d){}
    caculator operator+(caculator &c2);
    caculator operator-(caculator &c2);
    caculator operator*(caculator &c2);
    caculator operator/(caculator &c2);
    int gys(int a,int b);
    void display()const{
        if(den==1)
        cout<<num<<endl;
        else
        cout<<num<<"/"<<den<<endl;
    }
private:
    int num,den;    //分子分母
};
int caculator::gys(int a,int b){
    int c;
    while(b!=0){
        c=a%b;
        a=b;
        b=c;
    }
    return a>0?a:-a;
}
caculator caculator::operator+(caculator &c2){
    int d3,num3,g;
    d3=den*c2.den;
    num3=num*c2.den + c2.num*den;
    g=gys(d3,num3);
    d3=d3/g;
    num3=num3/g;
    return caculator(num3,d3);
}
caculator caculator::operator-(caculator &c2){
    int d3,num3,g;
    d3=den*c2.den;
    num3=num*c2.den - c2.num*den;
    g=gys(d3,num3);
    d3=d3/g;
    num3=num3/g;
    return caculator(num3,d3);
}
caculator caculator::operator*(caculator &c2){
    int d3,num3,g;
    d3=den*c2.den;
    num3=num * c2.num;
    g=gys(d3,num3);
    d3=d3/g;
    num3=num3/g;
    return caculator(num3,d3);
}
caculator caculator::operator/(caculator &c2){
    int d3,num3,g;
    d3=den*c2.num;
    num3=num*c2.den;
    g=gys(d3,num3);
    d3=d3/g;
    num3=num3/g;
    return caculator(num3,d3);
}
int main()
{
    int d1,n1,d2,n2;
    char c;
    cout<<"Input x: ";
    cin>>d1>>c>>n1;
    cout<<"Input y: ";
    cin>>d2>>c>>n2;
    caculator c1(d1,n1),c2(d2,n2),c3;
    c3=c1+c2;
    cout<<"x+y=";
    c3.display();
    c3=c1-c2;
    cout<<"x-y=";
    c3.display();
    c3=c1*c2;
    cout<<"x*y=";
    c3.display();
    c3=c1/c2;
    cout<<"x/y=";
    c3.display();

    return 0;
}

 
 



 

2.

2、设计一个类,重载运算符为友元函数,使对整型的运算符=+-*/ 适用于分数运算。要求:

1)输出结果是最简分数(可以是带分数);

2)分母为1,只输出分子。

参考的输入输出:

Inputx: 1/6

Inputy: 2/9

x+y=7/18

x-y=-1/18

x*y=1/27

x/y=3/4

 

###输入格式:

 

提示“Input x: ”,输入第一个分数。如:1/6

提示“Input y: ”,输入第二个分数。如:2/9

 

###输出格式:

提示并输出+-*/的结果,如

x+y=7/18

x-y=-1/18

x*y=1/27

x/y=3/4

 

###输入样例(其中的一种情况):

Inputx: 1/6

Inputy: 2/9

 

###输出样例(对应的输出):

x+y=7/18

x-y=-1/18

x*y=1/27

x/y=3/4

#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) {}
    void simplify();

    //输入输出的重载
    friend istream &operator>>(istream &in,CFraction &x);
    friend ostream &operator<<(ostream &out,CFraction x);

    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);  //两个分数相除,结果要化简

};

// 分数化简
void CFraction::simplify()
{
    int m,n,r;
    n=fabs(deno);
    m=fabs(nume);
    while(r=m%n)  // 求m,n的最大公约数
    {
        m=n;
        n=r;
    }
    deno/=n;     // 化简
    nume/=n;
    if (deno<0)  // 将分母转化为正数
    {
        deno=-deno;
        nume=-nume;
    }
}

// 重载输入运算符>>
istream &operator>>(istream &in,CFraction &x)
{
    char ch;
    while(1)
    {
        cin>>x.nume>>ch>>x.deno;
        if (x.deno==0)
            cerr<<"分母为0, 请重新输入"<<endl;
        else if(ch!='/')
            cerr<<"格式错误(形如m/n)! 请重新输入"<<endl;
        else
            break;
    }
    return cin;
}

// 重载输出运算符<<
ostream &operator<<(ostream &out,CFraction x)
{
    if(x.deno==1)
        cout<<x.nume;
    else
        cout<<x.nume<<'/'<<x.deno;
    return cout;
}

// 分数相加
CFraction operator+(const CFraction &c1,const CFraction &c2)
{
    CFraction t;
    t.nume=c1.nume*c2.deno+c2.nume*c1.deno;
    t.deno=c1.deno*c2.deno;
    t.simplify();
    return t;
}

// 分数相减
CFraction operator-(const CFraction &c1,const CFraction &c2)
{
    CFraction t;
    t.nume=c1.nume*c2.deno-c2.nume*c1.deno;
    t.deno=c1.deno*c2.deno;
    t.simplify();
    return t;
}

// 分数相乘
CFraction operator*(const CFraction &c1,const CFraction &c2)
{
    CFraction t;
    t.nume=c1.nume*c2.nume;
    t.deno=c1.deno*c2.deno;
    t.simplify();
    return t;
}

// 分数相除
CFraction operator/(const CFraction &c1,const CFraction &c2)
{
    CFraction t;
    if (!c2.nume) return t;   //除法无效(除数为)时,这种情况需要考虑,但这种处理仍不算合理
    t.nume=c1.nume*c2.deno;
    t.deno=c1.deno*c2.nume;
    t.simplify();
    return t;
}

int main()
{
    CFraction x,y,s;
    cout<<"Input x: ";
    cin>>x;
    cout<<"Input 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;
    return 0;
}



猜你喜欢

转载自blog.csdn.net/Eudoraa/article/details/80680874