第十三周项目1-分数类中的运算符重载(3)

本文介绍了在C++中实现分数类并重载运算符的实践过程,包括遇到的问题、解决策略以及代码展示。通过运行结果展示了运算符重载的正确性,并对相关知识点进行了总结,分享了学习心得。
摘要由CSDN通过智能技术生成

问题及代码:

/*
 *Copyright (c) 2016,烟台大学计算机学院
 *All rights reserved.
 *文件名称:zwj.cpp
 *作    者:张伟晶
 *完成日期:2016年5月24日
 *版 本 号:v1.0
 *
 *问题描述:实现分数类中的运算符重载,加减乘除比较;在此基础上增加取正求反,求倒数运算,交换律
 *输入描述:
 *程序输出:
 */
#include<iostream>
#include<cmath>
using namespace std;
class CFraction
{
private:
    int num;//分子
    int deno;//分母
public:

    //构造函数及运算符重载的声明
    CFraction (int nu=0,int de=1):num(nu),deno(de){}
    void huajian();

   friend istream &operator>>(istream &in,CFraction &x);
   friend ostream &operator<<(ostream &out,CFraction x);
   friend CFraction operator + (double &d,CFraction &c);

    CFraction operator +(const CFraction &c);
    CFraction operator -(const CFraction &c);
    CFraction operator *(const CFraction &c);
    CFraction operator /(const CFraction &c);

    //分数比较大小
    bool operator>(const CFraction &c);
    bool operator<(const CFraction &c);
    bool operator==(const CFraction &c);
    //按位取反运算符
    CFraction operator+();
    CFraction operator-();
    CFraction operator~();

    ///分数与整数
    CFraction operator + (double &d);
    CFraction operator - (double &d);
    CFraction operator * (double &d);
    CFraction operator / (double &d);


};

CFraction CFraction::operator+(double &d)
{
    CFraction n;
    n.num=num+d*deno;
    n.deno=deno;
    n.huajian();
    return n;
}
/**/
CFraction CFraction::operator-(double &d)
{
    CFraction n;
    n.num=num-d*deno;
    n.deno=deno;
    n.huajian();
    return n;
}
CFraction CFraction::operator*(double &d)
{
    CFraction n;
    n.num=num*d;
    n.deno=deno;
    n.huajian();
    return n;
}
CFraction CFraction::operator/(double &d)
{
    CFraction n;
    n.num=num;
    n.deno=deno*d;
    n.huajian();
    return n;
}
//重载函数的实现以及用于测试的main()函数
void CFraction::huajian()
{

        int k;
        if(num>0)
            k=2;
        else
        {
            k=1;
            num=-num;
        }
        int m,n,r=1;
        m=num;
        n=deno;
        while(r=m%n)
        {
            m=n;
            n=r;
        }
        num=num/n*pow(-1,k);
        deno=deno/n;


}
CFraction operator+(double &d,CFraction &c)
{
    CFraction n;
    n.num=c.num+c.deno*d;
    n.deno=c.deno;
    return n;
}

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

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

CFraction CFraction::operator+(const CFraction &c)
{
    CFraction w;
    w.deno=deno*c.deno;
    w.num=num*c.deno+c.num*deno;
    w.huajian();
    return w;
}
CFraction CFraction::operator-(const CFraction &c)
{
    CFraction w;
    w.deno=deno*c.deno;
    w.num=num*c.deno-c.num*deno;
    w.huajian();
    return w;
}
CFraction CFraction::operator*(const CFraction &c)
{
    CFraction w;
    w.deno=deno*c.deno;
    w.num=num*c.num;
    w.huajian();
    return w;
}
CFraction CFraction::operator/(const CFraction &c)
{
    CFraction w;
    w.deno=deno*c.deno;
    w.num=num*c.deno/c.num*deno;
    w.huajian();
    return w;
}
//比较大小
bool CFraction::operator>(const CFraction &c)
{
    int m,n;
    m=num*c.deno;
    n=c.num*deno;
    if((m-n)>0)
        return true;
    else
        return false;
}
bool CFraction::operator<(const CFraction &c)
{

    int m,n;
    m=num*c.deno;
    n=c.num*deno;
    if((m-n)<0)
        return true;
    else
        return false;
}
bool CFraction::operator==(const CFraction &c)
{
    int m,n;
    m=num*c.deno;
    n=c.num*deno;
    if((m-n)==0)
        return true;
    else
        return false;
}
//按位取反
CFraction CFraction::operator+()
{
    return *this;
}
CFraction CFraction ::operator-()
{
    CFraction n;
    n.num=-num;
    n.deno=deno;
    return n;
}
CFraction CFraction::operator~()
{
    CFraction n;


    if(num<0)
    {
        n.deno=-num;
        n.num=-deno;
    }
    else
    {
        n.num=deno;
        n.deno=num;
    }
    return n;
}
int main()
{
    CFraction x,y,z;
    cout<<"请输入x,y"<<endl;

    cout<<"x:";
    cin>>x;
    cout<<"y:";
    cin>>y;
    cout<<"**********加减乘除**********"<<endl;
    z=x+y;
    cout<<"x+y="<<z<<endl;
    z=x-y;
    cout<<"x-y="<<z<<endl;
    z=x*y;
    cout<<"x*y="<<z<<endl;
    z=x/y;
    cout<<"x/y="<<z<<endl;
    cout<<endl;

    cout<<"**********比较大小**********"<<endl;
    if(x>y) cout<<"x>y"<<endl;
    if(x<y) cout<<"x<y"<<endl;
    if(x==y) cout<<"x=y"<<endl;
    cout<<endl;

    cout<<"**********分数取正反倒数**********"<<endl;
    cout<<+x<<endl;
    cout<<-x<<endl;
    cout<<~x<<endl;

    cout<<"**********交换律**********"<<endl;
    z=x+3;
    cout<<"x+3="<<z<<endl;
    z=x-3;
    cout<<"x-3="<<z<<endl;
    z=x*3;
    cout<<"x*3="<<z<<endl;
    z=x/3;
    cout<<"x/3="<<z<<endl;


    return 0;
}

运行结果:

知识点总结:

学习心得:

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值