何仙姑倒拔垂杨柳523 2021-12-14 00:33 采纳率: 100%
浏览 66
已结题

运用成员函数和友元函数运算符进行运算

分别用成员函数和友元函数重载运算符,使对整型的运算符=、+、-、*、/适用于分数运算。要求:(1)输出结果是最简分数(可以是带分数);(2)分母为1,只输出分子。

  • 写回答

2条回答 默认 最新

  • _GX_ 2021-12-14 06:02
    关注
    
    // g++ -Wall -std=c++17 main.cpp
    
    #include <iostream>
    #include <numeric>
    
    class RationalNumber
    {
    public:
        typedef int value_type;
    
        constexpr RationalNumber(value_type a, value_type b) : _a(a), _b(b)
        {
            simplify();
        }
    
        constexpr RationalNumber &operator=(const RationalNumber &other)
        {
            _a = other._a;
            _b = other._b;
            return *this;
        }
    
        constexpr RationalNumber &operator+=(const RationalNumber &other)
        {
            auto a = _a * other._b + other._a * _b;
            auto b = _b * other._b;
            _a = a;
            _b = b;
            simplify();
            return *this;
        }
    
        constexpr RationalNumber &operator-=(const RationalNumber &other)
        {
            auto a = _a * other._b - other._a * _b;
            auto b = _b * other._b;
            _a = a;
            _b = b;
            simplify();
            return *this;
        }
    
        constexpr RationalNumber &operator*=(const RationalNumber &other)
        {
            _a *= other._a;
            _b *= other._b;
            simplify();
            return *this;
        }
    
        constexpr RationalNumber &operator/=(const RationalNumber &other)
        {
            _a *= other._b;
            _b *= other._a;
            simplify();
            return *this;
        }
    
        constexpr void simplify()
        {
            auto c = std::gcd(_a, _b);
            if (c != 0)
            {
                _a /= c;
                _b /= c;
            }
        }
    
    private:
        value_type _a;
        value_type _b;
    
        friend constexpr RationalNumber operator+(const RationalNumber &lhs, const RationalNumber &rhs);
        friend constexpr RationalNumber operator-(const RationalNumber &lhs, const RationalNumber &rhs);
        friend constexpr RationalNumber operator*(const RationalNumber &lhs, const RationalNumber &rhs);
        friend constexpr RationalNumber operator/(const RationalNumber &lhs, const RationalNumber &rhs);
        template <typename CharT, typename Traits>
        friend std::basic_ostream<CharT, Traits> &operator<<(std::basic_ostream<CharT, Traits> &os, const RationalNumber &number);
    };
    
    constexpr RationalNumber operator+(const RationalNumber &lhs, const RationalNumber &rhs)
    {
        RationalNumber tmp = lhs;
        tmp += rhs;
        return tmp;
    }
    
    constexpr RationalNumber operator-(const RationalNumber &lhs, const RationalNumber &rhs)
    {
        RationalNumber tmp = lhs;
        tmp -= rhs;
        return tmp;
    }
    
    constexpr RationalNumber operator*(const RationalNumber &lhs, const RationalNumber &rhs)
    {
        RationalNumber tmp = lhs;
        tmp *= rhs;
        return tmp;
    }
    
    constexpr RationalNumber operator/(const RationalNumber &lhs, const RationalNumber &rhs)
    {
        RationalNumber tmp = lhs;
        tmp /= rhs;
        return tmp;
    }
    
    template <typename CharT, typename Traits>
    std::basic_ostream<CharT, Traits> &operator<<(std::basic_ostream<CharT, Traits> &os, const RationalNumber &r)
    {
        if (r._b == 0)
        {
            os << "INF";
        }
        else if (r._b == 1)
        {
            os << r._a;
        }
        else
        {
            auto c = r._a / r._b;
            if (c == 0)
            {
                os << r._a << '/' << r._b;
            }
            else
            {
                auto a = r._a % r._b;
                os << c << '+' << a << '/' << r._b;
            }
        }
        return os;
    }
    
    int main()
    {
        char ch;
        int a1, b1, a2, b2;
        std::cout << "Input Fraction 1 (Format: a/b): ";
        std::cin >> a1 >> ch >> b1;
        std::cout << "Input Fraction 2 (Format: a/b): ";
        std::cin >> a2 >> ch >> b2;
        RationalNumber r1(a1, b1);
        RationalNumber r2(a2, b2);
        std::cout << r1 << " + " << r2 << " = " << r1 + r2 << '\n';
        std::cout << r1 << " - " << r2 << " = " << r1 - r2 << '\n';
        std::cout << r1 << " * " << r2 << " = " << r1 * r2 << '\n';
        std::cout << r1 << " / " << r2 << " = " << r1 / r2 << '\n';
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月22日
  • 已采纳回答 12月14日
  • 创建了问题 12月14日

悬赏问题

  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B
  • ¥15 想问一下stata17中这段代码哪里有问题呀