您的位置:首页 > 其它

第八周 项目三(2)分数类中的运算符重载

2015-05-18 19:49 369 查看
问题及代码:
/*
 * Copyright (c) 2014, 烟台大学计算机学院
 * All rights reserved.
 * 文件名称:test.cpp
 * 作    者:宋健
 * 完成日期:2015年 5月 18日
 * 版 本 号:v1.0
 *
 * 问题描述:在(1)的基础上,实现分数类中的对象和整型数的四则运算。分数类中的对象可以和整型数进行四则运算,且运算符合交换律。例如:CFraction a(1,3),b; int i=2; 可以完成b=a+i;。同样,可以完成i+a, 45+a, a*27, 5/a等各种运算。

 * 程序输入:
 * 程序输出:
 */

#include<iostream>
#include<Cmath>
#include<cstdlib>
#include <iomanip>
using namespace std;
class CFraction
{
private:
    int nume;  // 分子
    int deno;  // 分母
public:
    int gcd(int ,int);
    CFraction(int nu=0,int de=1);   //构造函数,初始化用
    void simplify();			//化简(使分子分母没有公因子)
    CFraction operator+(const CFraction &c);
    CFraction operator-(const CFraction &c);
    CFraction operator*(const CFraction &c);
    CFraction operator/(const CFraction &c);

    friend CFraction operator+( CFraction &c,int a);
    friend CFraction operator+(int a, CFraction &c);
    friend CFraction operator-( CFraction &c,int a);
    friend CFraction operator-(int a, CFraction &c);
    friend CFraction operator*( CFraction &c,int a);
    friend CFraction operator*(int a, CFraction &c);
    friend CFraction operator/( CFraction &c,int a);
    friend CFraction operator/(int a, CFraction &c);

    bool operator>(const CFraction &c);
    bool operator<(const CFraction &c);
    bool operator==(const CFraction &c);
    bool operator!=(const CFraction &c);
    bool operator>=(const CFraction &c);
    bool operator<=(const CFraction &c);
    void display();

};
CFraction::CFraction(int nu,int de)
{
    if(de!=0)
    {
        nume=nu;
        deno=de;
    }
    else cout<<"分母不能为0!";

}

void CFraction::simplify()
{
    int m,n,r;
    m=fabs(deno);
    n=fabs(nume);
    while(r=m%n)  // 求m,n的最大公约数
    {
        m=n;
        n=r;
    }
    deno/=n;     // 化简
    nume/=n;
    if (deno<0)  // 将分母转化为正数
    {
        deno=-deno;
        nume=-nume;
    }
}

CFraction operator+( CFraction &c,int a)
{CFraction c1(c.nume+a*c.deno,c.deno);
    c1.simplify();
    return c1;
}
CFraction operator+(int a, CFraction &c)
{
    CFraction b(a,1),z;
    z=c+b;
    return z;
}
CFraction operator-( CFraction &c,int a)
{
    CFraction b(a,1);
    return c-b;
}
CFraction operator-(int a, CFraction &c)
{
    CFraction b(a,1);
    return b-c;
}
CFraction operator*( CFraction &c,int a)
{
    CFraction b(a,1);
    return c*b;
}
CFraction operator*(int a, CFraction &c)
{
    CFraction b(a,1);
    return c*b;
}
CFraction operator/( CFraction &c,int a)
{
    CFraction b(a,1);
    return c/b;
}
CFraction operator/(int a, CFraction &c)
{
    CFraction b(a,1);
    return b/c;
}
CFraction CFraction::CFraction::operator+(const CFraction &c)
{
    CFraction x(nume*c.deno+deno*c.nume,deno*c.deno);
    x.simplify();
    return x;
}
CFraction CFraction::operator-(const CFraction &c)
{
    CFraction x(nume*c.deno-deno*c.nume,deno*c.deno);
    x.simplify();
    return x;

}
CFraction CFraction::operator*(const CFraction &c)
{
    CFraction x(nume*c.nume,deno*c.deno);
    x.simplify();
    return x;
}
CFraction CFraction::operator/(const CFraction &c)
{
    CFraction x(nume*c.deno,deno*c.nume);
    x.simplify();
    return x;
}
bool CFraction::operator>(const CFraction &c)
{
    if(nume*c.deno>deno*c.nume)
        return true;
    else return false;
}
bool CFraction::operator<(const CFraction &c)
{
    if(nume*c.deno<deno*c.nume)
        return true;
    else return false;
}
bool CFraction::operator==(const CFraction &c)
{
    if(*this>c||*this<c)
        return false;
    else return true;
}
bool CFraction::operator!=(const CFraction &c)
{
    if (*this==c)
        return false;
    else return true;
}
bool CFraction::operator>=(const CFraction &c)
{
    if(*this<c)
        return false;
    else return true;
}
bool CFraction::operator<=(const CFraction &c)
{
    if(*this>c)
        return false;
    else return true;
}
void CFraction::display()
{
    cout<<"("<<nume<<"/"<<deno<<")"<<endl;
}

int main()
{
    CFraction x(1,3),y(-5,10),s;
    cout<<"分数x=1/3      y=-5/10"<<endl;
    s=x+y;
    cout<<"+x+y=";
    s.display();
    s=x-y;
    cout<<"x-y=";
    s.display();
    s=x*y;
    cout<<"x*y=";
    s.display();
    s=x/y;
    cout<<"x/y=";
    s.display();
    s=x+y;
    cout<<"-x+y=";
    s.display();

    x.display();
    if (x>y) cout<<"大于"<<endl;
    if (x<y) cout<<"小于"<<endl;
    if (x==y) cout<<"等于"<<endl;
    y.display();
    cout<<endl;

    CFraction c1(5,3),c2;
    c2=c1+5;
    c2.display();
    c2=5+c1;
    c2.display();
    c2=c1-5;
    c2.display();
    c2=5-c1;
    c2.display();
    c2=c1*5;
    c2.display();
    c2=5*c1;
    c2.display();
    c2=c1/5;
    c2.display();
    c2=5/c1;
    c2.display();

    return 0;
}


运行结果:



知识点总结:

在分数与整数混合运算过程中,不知道为什么在形参或实参之前加const会报错,不得已将const删除,还望老师解答
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: