【C++作业】分数类 运算符重载

利用运算符重载,实现分数(形式a/b)的输入输出与运算。

//分数类
#include <iostream>
#include <algorithm>
using namespace std;

class Fraction{
public:
    Fraction(int denominator,int numerator):denominator(denominator),numerator(numerator){}
    friend istream& operator>> (istream &in,Fraction &f); 
    friend ostream& operator<< (ostream &out,Fraction &f); 

    Fraction operator+ (const Fraction &f1)const;
    Fraction operator- (const Fraction &f1)const;
    Fraction operator* (const Fraction &f1)const;
    Fraction operator/ (const Fraction &f1)const;
private:
    int denominator,numerator;
}; 

istream& operator>> (istream &in,Fraction &f){
    cout<< "[Enter a Fraction]: ";
    char c;
    while(in>> f.denominator >>c>> f.numerator){
        if(f.numerator == 0){//特判分子是否为零
            cout<< "Error! The numerator is 0!" <<endl; 
            cout<< "[Enter a Fraction]: ";
        }
        else break; 
    }
    return in;
}

ostream& operator<< (ostream &out,Fraction &f){
    if(f.denominator == 0)out<< 0 <<endl;
    else if(f.numerator == 1)out<< f.denominator <<endl;
    else {
        if(f.numerator < 0)//将负号提到前面
            out<< -f.denominator << "/" << -f.numerator <<endl;
        else 
            out<< f.denominator << "/" << f.numerator <<endl;
    }
    return out;
} 

Fraction Fraction::operator+ (const Fraction &f1)const{
    int den = denominator*f1.numerator + numerator*f1.denominator;
    int num = numerator*f1.numerator;
    int GCD = __gcd(den,num);
    return Fraction(den/GCD,num/GCD);//求最大公约数,化简结果
}

Fraction Fraction::operator- (const Fraction &f1)const{
    int den = denominator*f1.numerator - numerator*f1.denominator;
    int num = numerator*f1.numerator;
    int GCD = __gcd(den,num);
    return Fraction(den/GCD,num/GCD);
}

Fraction Fraction::operator* (const Fraction &f1)const{
    int den = denominator*f1.denominator;
    int num = numerator*f1.numerator;
    int GCD = __gcd(den,num);
    return Fraction(den/GCD,num/GCD);
}

Fraction Fraction::operator/ (const Fraction &f1)const{
    int den = denominator*f1.numerator;
    int num = numerator*f1.denominator;
    int GCD = __gcd(den,num);
    return Fraction(den/GCD,num/GCD);
}
int main() {
    Fraction f1(1,1),c3(1,1),c4(1,1),c5(1,1),c6(1,1);
    cin>>f1;
    cout<<"c1="<<f1;
    Fraction f2(0,0);
    cin>>f2;
    cout<<"c2="<<f2;
    c3=f1+f2;
    cout<<"c3=c1+c2="<<c3;
    c4=f1-f2;
    cout<<"c4=c1-c2="<<c4;
    c5=f1*f2;
    cout<<"c5=c1*c2="<<c5;
    c6=f1/f2;
    cout<<"c6=c1/2="<<c6;
    return 0;
}




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来回答您的问题。用C++编写分数运算符重载涉及到分数对象的加、减、乘、除等运算符重载操作。以下是一个示例代码,可供参考: ```c++ class Fraction { public: Fraction(int num = 0, int den = 1) : m_numerator(num), m_denominator(den) { reduce(); } int getNumerator() const { return m_numerator; } int getDenominator() const { return m_denominator; } Fraction operator+(const Fraction& other) const { int num = m_numerator * other.m_denominator + m_denominator * other.m_numerator; int den = m_denominator * other.m_denominator; return Fraction(num, den); } Fraction operator-(const Fraction& other) const { int num = m_numerator * other.m_denominator - m_denominator * other.m_numerator; int den = m_denominator * other.m_denominator; return Fraction(num, den); } Fraction operator*(const Fraction& other) const { int num = m_numerator * other.m_numerator; int den = m_denominator * other.m_denominator; return Fraction(num, den); } Fraction operator/(const Fraction& other) const { int num = m_numerator * other.m_denominator; int den = m_denominator * other.m_numerator; return Fraction(num, den); } private: int m_numerator; int m_denominator; int gcd(int a, int b) const { return b == 0 ? a : gcd(b, a % b); } void reduce() { int common = gcd(m_numerator, m_denominator); m_numerator /= common; m_denominator /= common; } }; ``` 这里定义了一个名为Fraction(分数)的,重载了加、减、乘、除运算符,可以通过该进行分数的运算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值