欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++实现有理数类加减乘除

程序员文章站 2022-07-10 18:38:49
...

C++上机题,题目如下:
设计一个有理数类,要求如下:
有理数有整数类型的分子、分母组成,通过运算符重载,完成有理数的加、减、乘、除运算,运算结果要求为最简分数,即分子分母没有公约数。在主程序中测试类与方法。

不多废话,完整代码我已经贴出来了,注释也很详细,唯一要注意的就是分母不能为0和第二个有理数的分子也不能为0(因为除数不能为0)。希望对初学C++,碰巧有类似练习的童鞋有帮助@[email protected]

#include <iostream>
#include <cmath>
//numerator分子  denominator分母
using namespace std;
class Rational {
public:
    Rational(int n=0,int d=1):num(n),den(d) {} //有参构造函数

    friend Rational operator+(const Rational &r1,const Rational &r2);//相加
    friend Rational operator-(const Rational &r1,const Rational &r2);//相减
    friend Rational operator/(const Rational &r1,const Rational &r2);//相除
    friend Rational operator*(const Rational &r1,const Rational &r2);//相乘


    void simplify();//对有理数进行化简
    void display();  //显示结果
private :
    double num;
    double den;

};
Rational operator+(const Rational &r1,const Rational &r2) {
    Rational r;
    r.num = r1.den*r2.num+r1.num*r2.den;//相加的分子等于r1分母和r2分子相乘,r1分子和r2分母相乘之和
    r.den = r1.den*r2.den;//分母等于两个有理数分母的相乘
    r.simplify();//调用simplify对结果进行化简
    return r;//将结果返回
}
Rational operator-(const Rational &r1,const Rational &r2) {
    Rational r;
    r.num = r1.num*r2.den-r1.den*r2.num;//相加的分子等于r1分母和r2分子相乘,r1分子和r2分母相乘之差
    r.den = r1.den*r2.den;//分母等于两个有理数分母的相乘
    r.simplify();
    return r;
}
Rational operator/(const Rational &r1,const Rational &r2) {
    Rational r;
    if(r1.den==0||r2.den==0||r2.num==0) {
        cout<<"分母或者除数不能为0"<<endl;
    } else if(r1.num==0) {
        cout<<"0/0"<<endl;
    } else {
        r.num = r1.num*r2.den;//相除的分子等于r1分子和r2分母相乘
        r.den = r1.den*r2.num;//分母等于两个r1分母和r2分子相乘
        r.simplify();
        return r;
    }
}
Rational operator*(const Rational &r1,const Rational &r2) {
    Rational r;
    if(r1.den==0||r2.den==0) {
        cout<<"分母不能为0"<<endl;
    } else if(r1.num==0||r2.num==0) {
        cout<<"0/0"<<endl;
    } else {
        r.num = r1.num*r2.den;//分子等于r1分子和r2分母相乘
        r.den = r1.den*r2.num;//分母等于两个r1分母和r2分子相乘
        r.simplify();
        return r;
    }
}
void Rational::simplify() {
    int i,j,temp;
    i=abs(den);
    j=abs(num);
    //如果i对j取余不为0,辗转相除法求最大公约数
    while(temp=i%j) {
        i=j;
        j=temp;
    }
    den/=j;
    num/=j;
    if(den<0) {
        den=-den;
        num=-num;
    }
}
void Rational::display() {
    if(num==0||den==0) {

    } else {
        cout<<num<<"/"<<den<<endl;
    }
}
int main() {
    Rational r;
    Rational r1(1,3),r2(0,5);
    r=r1+r2;
    r.display();
    r=r1-r2;
    r.display();
    r=r1*r2;
    r.display();
    r=r1/r2;
    r.display();
    return 0;
}