九周任务三:定义分数类中的<<和>>的重载,实现分数的输入和输出

/* (程序头部注释开始)     
* 程序的版权和版本声明部分     
* Copyright (c) 2011, 烟台大学计算机学院学生      
* All rights reserved.     
* 作    者:       田庆                            
* 完成日期:  2012     年   4    月   18  日     
* 版 本 号:               
     
* 对任务及求解方法的描述部分     
* 输入描述:      
* 问题描述:  定义分数类中的<<和>>运算符的重载,实现输入和输出, 
* 程序输出:      
* 程序头部的注释结束     
*/  
#include <iostream>      
using namespace std;    
int gcd(int x,int y);    //求最大公约数    
class CFraction      
{      
private:      
    int nume;  // 分子      
    int deno;  // 分母      
public:      
    CFraction(int nu=0,int de=1):nume(nu),deno(de){}      
    void simplify();      
    void display();      
    CFraction operator+(const CFraction &c);  //两个分数相加,结果要化简      
    CFraction operator-(const CFraction &c);  //两个分数相减,结果要化简      
    CFraction operator*(const CFraction &c);  //两个分数相乘,结果要化简      
    CFraction operator/(const CFraction &c);  //两个分数相除,结果要化简      
    CFraction operator+();  //取正一目运算      
    CFraction operator-();  //取反一目运算      
    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); 
	//重载流插入运算符“<<”        
    friend ostream& operator << (ostream&,CFraction &);      
    //重载流提取运算符“>>”        
    friend istream& operator >> (istream&,CFraction &); 
};      
      
//化简(使分子分母没有公因子)       
void CFraction::simplify()      
{      
    int n=gcd(nume,deno);      
    nume/=n;      
    deno/=n;     
    if (deno<0)  // 将分母转化为正数      
    {      
        deno=-deno;      
        nume=-nume;      
    }      
    
}      
//求最大公约数;       
int gcd(int x,int y)      
{      
    int r;      
    while(y!=0)      
    {      
        r=x%y;      
        x=y;      
        y=r;      
    }      
    return x;      
}      
    
      
//显示分数      
void CFraction::display()      
{      
    cout<<"("<<nume<<"/"<<deno<<")"<<endl;      
}      
      
// 分数相加      
CFraction CFraction::operator+(const CFraction &c)      
{      
    CFraction t;      
    t.nume=nume*c.deno+c.nume*deno;      
    t.deno=deno*c.deno;      
    t.simplify();      
    return t;      
}      
      
// 分数相减      
CFraction CFraction:: operator-(const CFraction &c)      
{      
    CFraction t;      
    t.nume=nume*c.deno-c.nume*deno;      
    t.deno=deno*c.deno;      
    t.simplify();      
    return t;      
}      
      
// 分数相乘      
CFraction CFraction:: operator*(const CFraction &c)      
{      
    CFraction t;      
    t.nume=nume*c.nume;      
    t.deno=deno*c.deno;      
    t.simplify();      
    return t;      
}      
      
// 分数相除      
CFraction CFraction:: operator/(const CFraction &c)      
{      
    CFraction t;      
    t.nume=nume*c.deno;      
    t.deno=deno*c.nume;      
    t.simplify();      
    return t;      
}      
      
// 分数取正号      
CFraction CFraction:: operator+()      
{      
    return *this;      
}      
      
// 分数取负号      
CFraction CFraction:: operator-()      
{      
    CFraction x;      
    x.nume=-nume;      
    x.deno=-deno;      
    return x;           
}      
      
// 分数比较大小      
bool CFraction::operator>(const CFraction &c)      
{      
    int this_nu,c_nu,com_de;      
    this_nu=nume*c.deno;        // 计算分数通分后的分子,同分母为deno*c.deno      
    c_nu=c.nume*deno;       
    com_de=deno*c.deno;      
    if (this_nu>c_nu&&com_de>0||this_nu<c_nu&&com_de<0) return true; // 将通分后的分子比较大小      
    return false;      
}      
      
// 分数比较大小      
bool CFraction::operator<(const CFraction &c)      
{      
    int this_nu,c_nu,com_de;      
    this_nu=nume*c.deno;            
    c_nu=c.nume*deno;      
    com_de=deno*c.deno;      
    if ((this_nu-c_nu)*com_de<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 || *this<c)     
        return true;      
    else     
        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;      
}      
  
//下面定义成员函数       
istream& operator >> (istream& input,CFraction & c)    
{     
    input>>c.nume>>c.deno;    
    return input;    
}    
ostream& operator << (ostream& output,CFraction & c)    
{    
    output<<c.nume<<"/"<<c.deno<<endl;    
    return output;    
}  
int main()      
{      
    CFraction x,y,s;      
    cout<<"请输入分数x以2 3的形式输入:";    
    cin>>x;
	cout<<"请输入分数y以2 3的形式输入:";
	cin>>y;
	cout<<"x=";
    x.display();
	cout<<"y=";
	y.display();
    s=+x+y;      
    cout<<"分数相加即+x+y=";      
    s.display();    
    cout<<endl;    
    s=x-y;      
    cout<<"分数相减即x-y=";      
    s.display();    
    cout<<endl;    
    s=x*y;      
    cout<<"分数相乘即x*y=";      
    s.display();    
    cout<<endl;    
    s=x/y;      
    cout<<"分数相除即x/y=";      
    s.display();    
    cout<<endl;    
    s=-x+y;      
    cout<<"分数相减取负即-x+y=";      
    s.display();    
    cout<<endl;    
    cout<<"x和y比较大小得: "<<endl;    
    x.display();      
    if (x>y) cout<<"大于";      
    if (x<y) cout<<"小于";      
    if (x==y) cout<<"等于";
	cout<<endl;
    y.display();      
    cout<<endl;      
    system("pause");      
    return 0;      
}     


 
 
 

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值