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

来源:互联网 发布:进化论不能 知乎 编辑:程序博客网 时间:2024/06/08 06:13
/*  * Copyright (c) 2014, 烟台大学计算机学院  * All rights reserved.  * 文件名称:test.cpp  * 作    者:呼亚萍  * 完成日期:2015年5月13日  * 版 本 号:v1.0  *  * 问题描述: 定义分数的一目运算+和-,分别代表分数取正和求反,将“按位取反运算符”~重载为分数的求倒数运算。 * 程序输入:相应的程序 * 程序输出:对应得结果 */#include <iostream>#include <cstdlib>using namespace std;class CFraction{public:    CFraction(int nu=0,int de=1);    CFraction operator+(const CFraction &c);    void simplify();    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);    bool operator<=(const CFraction &c);    bool operator==(const CFraction &c);    bool operator!=(const CFraction &c);    CFraction operator-();    CFraction operator+();    CFraction operator~();    void display();private:    int nume;//分子    int deno;//分母};CFraction::CFraction(int nu,int de){    if(de==0)    {        cout<<"初始化失败,分子不能为0";        exit(0);    }    else    {        nume=nu;        deno=de;    }}void CFraction::simplify(){    int a=nume,b=deno,c;    while(b!=0)    {        c=a%b;        a=b;        b=c;    }    nume=nume/a;    deno=deno/a;    if((deno<0)&&(nume<0))    {        deno*=(-1);        nume*=(-1);    }    if((deno<0)&&(nume>0))    {        deno*=(-1);        nume*=(-1);    }}CFraction CFraction:: operator+(){    return *this;}CFraction CFraction::operator-(){    CFraction c;    c.nume=-nume;    c.deno=deno;    return c;}CFraction CFraction:: operator~(){    CFraction c;    c.deno=nume;    c.nume=deno;    return c;}CFraction CFraction::operator+(const CFraction &c){    CFraction m;    m.deno=deno*c.deno;    m.nume=nume*c.deno+c.nume*deno;    m.simplify();    return m;}CFraction CFraction::operator-(const CFraction &c){    CFraction m;    m.deno=deno*c.deno;    m.nume=nume*c.deno-c.nume*deno;    m.simplify();    return m;}CFraction CFraction::operator*(const CFraction &c){    CFraction m;    m.nume=nume*c.nume;    m.deno=deno*c.deno;    m.simplify();    return m;}CFraction CFraction::operator/(const CFraction &c){    CFraction m;    if(!c.nume)return *this;    m.nume=nume*c.deno;    m.deno=deno*c.nume;    m.simplify();    return m;}bool CFraction::operator>(const CFraction &c){    int this_nume,c_nume,common_deno;    this_nume=nume*c.deno;        // 计算分数通分后的分子,同分母为deno*c.deno    c_nume=c.nume*deno;    common_deno=deno*c.deno;    if ((this_nume>c_nume&&common_deno>0)||(this_nume<c_nume&&common_deno<0)) return true; // 将通分后的分子比较大小    return false;}bool CFraction::operator<(const CFraction &c){    int this_nume,c_nume,common_deno;    this_nume=nume*c.deno;    c_nume=c.nume*deno;    common_deno=deno*c.deno;    if ((this_nume-c_nume)*common_deno<0) return true;    return false;}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||*this<c)        return false;    else        return true;}bool CFraction::operator!=(const CFraction &c){    if(*this==c)        return false;    else        return true;}void CFraction::display(){    if(nume==deno)        cout<<"1"<<endl;    else        cout<<"("<<nume<<"/"<<deno<<")"<<endl;}int main(){    CFraction c1(1,3),c2(-5,10),s;    cout<<"c1=1/3"<<'\t'<<"c2=-5/10"<<endl;    s=c1+c2;    cout<<"c1+c2=";    s.display();    s=c1-c2;    cout<<"c1-c2=";    s.display();    s=c1*c2;    cout<<"c1*c2=";    s.display();    s=c1/c2;    cout<<"c1/c2=";    s.display();    s=-c1;    cout<<"-c1=";    s.simplify();    s.display();    s=+c2;    cout<<"+c2=";    s.simplify();    s.display();    s=~c1;    cout<<"c1的倒数为:";    s.simplify();    s.display();    s=~c2;    cout<<"c2的倒数为:";    s.simplify();    s.display();    if(c1>c2)        cout<<"c1>c2"<<endl;    if(c1<c2)        cout<<"c1<c2"<<endl;    if(c1<=c2)        cout<<"c1<=c2"<<endl;    if(c1>=c2)        cout<<"c1>=c2"<<endl;    if(c1!=c2)        cout<<"c1!=c2"<<endl;    if(c1==c2)        cout<<"c1=c2"<<endl;    return 0;}


运算结果:


知识点总结:

一目运算符的重载

学习心得:

在实践中会遇到不同的问题,一一解决,加油!

0 0
原创粉丝点击