/* (程序头部注释开始)
* 程序的版权和版本声明部分
* 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;
}
九周任务三:定义分数类中的<<和>>的重载,实现分数的输入和输出
最新推荐文章于 2021-02-05 03:01:35 发布