问题 K: oop实习-11.运算符重载

本文介绍了一个有理数类的实现,通过定义私有数据成员和成员函数来处理有理数的约简和最大公约数计算。文章详细描述了构造函数、赋值运算符、正负号运算符、自增自减运算符、四则运算符、比较运算符以及输入输出流的重载,展示了如何在C++中使用运算符重载来增强类的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

定义有理数类(分母不为0的分数,分子分母均为整数)Rational,实现相应操作符的重载。

(1)定义私有数据成员:分子int iUp; 分母 int iDown。

(2)定义私有成员函数:void Reduce() 和 int Gcd(int l, int r),分别用于有理数的约简和求两个整数的最大公约数。其中,在约简时需要求取分子与分母的最大公约数。

(3)定义构造函数,在构造函数体内可调用Reduce对有理数进行约简。

(4)将负号-和赋值运算符=重载为公有成员函数,分别用于求有理数的负数和赋值。

(5)将前置++、前置--、后置++、后置--重载为公有成员函数,实现有理数自增1或自减1。

(6)将+、-、*、/重载为友员函数,实现有理数的加减乘除。

(7)将<、<=、>、>=重载为友员函数,实现有理数的大小关系比较。

(8)重载流插入符<<和流提取符>>,分别用于有理数的输出和输入。其中,输出格式为“分子/分母”,若为整数,则直接输出整数。

在main函数中,根据输入的分子和分母定义两个有理数对象a和b。再定义几个有理数对象分别用于表示a和b的加、减、乘、除、前置自增a、前置自减a、后置自增a、后置自减a,并依次各个对象的结果。最后依次用<、<=、>、>=比较a和b的大小关系,并依次输出比较结果(true或false)。 

输入

两个有理数a和b的的分子和分母

输出

有理数a和b的加、减、乘、除以及前置自增a、前置自减a、后置自增a、后置自减a

有理数a和b的<、<=、>、>=的结果

样例输入

4 3 3 2

样例输出

a+b: 17/6

a-b: -1/6

a*b: 2

a/b: 8/9

-a: -4/3

++a: 7/3

 --a: 4/3

a++: 4/3

a--: 7/3

a<b: true

a<=b: true

a>b: false

a>=b: false


#include <iostream>
#include <cmath>
using namespace std;
  
class Rational
{
private:
    int iUp,iDown;
    void Reduce()
    {
        int t=abs(Gcd(iUp,iDown));
        iUp=iUp/t;
        iDown=iDown/t;
        if(iDown<0) { iDown=-iDown; iUp=-iUp; }
    }
    int Gcd(int a,int b)
    {
        int r=a%b;
        while(r!=0)
        {
            a=b; b=r; r=a%b;
        }
        return b;
    }
public:
    Rational(){}
    Rational(int a,int b)
    {
        iUp=a; iDown=b;
        Reduce();
    }
    Rational& operator=(const Rational& a)
    {
        iUp=a.iUp;
        iDown=a.iDown;
        Reduce();
        return *this;
    }
    Rational operator-()
    {
        Rational t;
        t.iUp=-iUp;
        t.iDown=iDown;
        return t;
    }
    Rational& operator++();
    Rational operator++(int);
    Rational& operator--();
    Rational operator--(int);
    friend Rational operator+(const Rational&,const Rational&);
    friend Rational operator-(const Rational&,const Rational&);
    friend Rational operator*(const Rational&,const Rational&);
    friend Rational operator/(const Rational&,const Rational&);
    friend bool operator<(const Rational&,const Rational&);
    friend bool operator<=(const Rational&,const Rational&);
    friend bool operator>(const Rational&,const Rational&);
    friend bool operator>=(const Rational&,const Rational&);
    friend ostream& operator<<(ostream& out,const Rational&);
    friend istream& operator>>(istream& in,Rational&);
};
  
Rational& Rational::operator++()
{
    iUp=iUp+iDown;
    return *this;
}
Rational Rational::operator++(int)
{
    Rational temp(iUp,iDown);
    iUp=iUp+iDown;
    return temp;
}
Rational& Rational::operator--()
{
    iUp=iUp-iDown;
    return *this;
}
Rational Rational::operator--(int)
{
    Rational temp(iUp,iDown);
    iUp=iUp-iDown;
    return temp;
}
Rational operator+(const Rational& a,const Rational& b)
{
    Rational t;
    t.iUp = a.iUp*b.iDown + b.iUp*a.iDown;
    t.iDown = a.iDown * b.iDown;
    return t;
  
}
Rational operator-(const Rational& a,const Rational& b)
{
    Rational t;
    t.iUp = a.iUp*b.iDown - b.iUp*a.iDown;
    t.iDown = a.iDown * b.iDown;
    return t;
}
Rational operator*(const Rational& a,const Rational& b)
{
    Rational t;
    t.iUp = a.iUp * b.iUp;
    t.iDown = a.iDown * b.iDown;
    return t;
}
Rational operator/(const Rational& a,const Rational& b)
{
    Rational t;
    t.iUp = a.iUp * b.iDown;
    t.iDown = a.iDown * b.iUp;
    return t;
}
bool operator<(const Rational&a,const Rational&b)
{
    return( a.iUp/(double)a.iDown < b.iUp/(double)b.iDown );
}
bool operator<=(const Rational&a,const Rational&b)
{
    return( a.iUp/(double)a.iDown <= b.iUp/(double)b.iDown );
}
bool operator>(const Rational&a,const Rational&b)
{
    return( a.iUp/(double)a.iDown > b.iUp/(double)b.iDown );
}
bool operator>=(const Rational&a,const Rational&b)
{
    return( a.iUp/(double)a.iDown >= b.iUp/(double)b.iDown );
}
ostream& operator<<(ostream& out,const Rational&a)
{
    if(a.iUp%a.iDown!=0)
    out<<a.iUp<<"/"<<a.iDown;
    else out<<(a.iUp/a.iDown);
    return out;
}
istream& operator>>(istream& in,Rational&a)
{
    in>>a.iUp>>a.iDown;
    return in;
}
  
int main()
{
    Rational a,b;
    cin>>a>>b;
    Rational c;
    c=a+b;
    cout<<"a+b: "<<c<<endl;
    c=a-b;
    cout<<"a-b: "<<c<<endl;
    c=a*b;
    cout<<"a*b: "<<c<<endl;
    c=a/b;
    cout<<"a/b: "<<c<<endl;
    c=-a;
    cout<<"-a: "<<c<<endl;
    c=++a;
    cout<<"++a: "<<c<<endl;
    c=--a;
    cout<<"--a: "<<c<<endl;
    c=a++;
    cout<<"a++: "<<c<<endl;
    c=a--;
    cout<<"a--: "<<c<<endl;
    bool x;
    x=a<b;
    cout<<"a<b: "<<boolalpha<<x<<endl;
    x=a<=b;
    cout<<"a<=b: "<<x<<endl;
    x=a>b;
    cout<<"a>b: "<<x<<endl;
    x=a>=b;
    cout<<"a>=b: "<<x<<endl;
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值