C++走向远洋——55(项目一3、分数类的重载、>><<的重载)

来源:互联网 发布:win7重置网络 编辑:程序博客网 时间:2024/05/21 12:45
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhello * 完成日期:2016年5月25日 * 版本号:V1.0 * 问题描述:分数类的重载取倒数+输入输出重载 * 程序输入:无 * 程序输出:见运行结果 */#include<iostream>#include<Cmath>using namespace std;class CFraction{private:int nume;   //分子int deno;   //分母public:CFraction(int nu=0,int de=0);//输入输出的重载friend istream &operator>>(istream &in,CFraction &x);friend ostream &operator<<(ostream &out,CFraction x);CFraction operator+(const CFraction &n);  //分数相加CFraction operator-(const CFraction &n);  //分数相减CFraction operator*(const CFraction &n);  //分数相乘CFraction operator/(const CFraction &n);  //分数相除void display();                           //输出分数void simplify();                          //分数化简    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~();  //分数取倒数};CFraction::CFraction(int nu,int de)                     //构造函数{nume=nu;deno=de;}void CFraction::display()                               //输出函数{cout<<nume<<"/"<<deno<<endl;}void CFraction::simplify()                              //分数化简{    int m,n,r;    n=fabs(deno);    m=fabs(nume);if(nume==0)  deno=0;else{    while(r=m%n)    // 求m,n的最大公约数    {        m=n;        n=r;    }    deno/=n;       // 化简    nume/=n;    if (deno<0)    // 将分母转化为正数    {        deno=-deno;        nume=-nume;    }}}istream &operator>>(istream &in,CFraction &x){    char ch;    while(1)    {        cin>>x.nume>>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.nume<<'/'<<x.deno;    return cout;}CFraction CFraction::operator +(const CFraction &n)     //定义分数相加{CFraction t;t.deno=this->deno*n.deno;t.nume=this->nume*n.deno+n.nume*this->deno;t.simplify();//化简return t;}CFraction CFraction::operator -(const CFraction &n)     //定义分数相减{CFraction t;t.deno=this->deno*n.deno;t.nume=this->nume*n.deno-n.nume*this->deno;t.simplify();//化简return t;}CFraction CFraction::operator *(const CFraction &n)     //定义分数相乘{CFraction t;t.deno=n.deno*this->deno;t.nume=n.nume*this->nume;    t.simplify();//化简return t;}CFraction CFraction::operator /(const CFraction &n)     //定义分数相除{CFraction t;t.deno=n.nume*this->deno;t.nume=n.deno*this->nume;t.simplify();//化简return t;}//比较运算符重载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) 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;    return true;}// 分数比较大小bool CFraction::operator!=(const CFraction &c){    if (*this>c || *this<c) return true;    return false;}// 分数比较大小bool CFraction::operator>=(const CFraction &c){    if (*this<c) return false;    return true;}// 分数比较大小bool CFraction::operator<=(const CFraction &c){    if (*this>c) return false;    return true;}// 分数取正号CFraction CFraction:: operator+(){    return *this;}// 分数取负号CFraction CFraction:: operator-(){    CFraction x;    x.nume=-this->nume;    x.deno=this->deno;    return x;}CFraction CFraction::operator ~(){CFraction t;t.deno=this->nume;t.nume=this->deno;return t;}int main(){CFraction a,b;CFraction c;cin>>a>>b;c=a+b;cout<<"c=";c.display();cout<<"  "<<c<<"重载<<后输出"<<endl;c=a*b;cout<<"c=";c.display();cout<<"  "<<c<<endl;c=a-b;    cout<<"c=";c.display();cout<<"  "<<c<<endl;c=a/b;cout<<"c=";c.display();cout<<"  "<<c<<endl;    if(a>b)cout<<"a>b"<<endl;c=~a;c.display();cout<<"  "<<c<<endl;    return 0;}

0 0
原创粉丝点击