# 第13周项1—分数类中的运算符重载 （2）

﻿﻿

//
*ALL rights  reserved.
*文件名称：main.cpp
*作者：孙亚茹
*完成日期：2016年5月31日
*问题描述:在分数类中完成分数的取正取反，按位运算。
*//

#include<iostream>
#include<cmath>
using namespace std;
class CFraction
{
private:
int nume;  // 分子
int deno;  // 分母
public:
CFraction(int num=0,int den=1):nume(num),deno(den) {};
CFraction operator+(const CFraction &c1);
CFraction operator-(const CFraction &c1);
CFraction operator*(const CFraction &c1);
CFraction operator/(const CFraction &c1);
friend istream &operator>>(istream &in,CFraction &c1);
friend ostream &operator<<(ostream &out,CFraction &c1);
bool operator==(const CFraction &c1);
bool operator>(const CFraction &c1);
bool  operator<(const CFraction &c1);\
CFraction operator+();
CFraction operator-();
CFraction operator~();

void huajian();

//构造函数及运算符重载的函数声明
};
void CFraction::huajian()
{
int t,m,n;
m=deno;
n=nume;
while(n!=0)
{
t=m%n;
m=n;
n=t;
}
deno/=m;
nume/=m;
}
CFraction CFraction::operator+(const CFraction &c1)
{
CFraction c;
c.deno=deno*c1.deno;
c.nume=nume*c1.deno+c1.nume*deno;
c.huajian();
return c;
}
CFraction CFraction::operator-(const CFraction &c1)
{
CFraction c;
c.deno=deno*c1.deno;
c.nume=nume*c1.deno-c1.nume*deno;
c.huajian();
return c;
}
CFraction CFraction::operator*(const CFraction &c1)
{

CFraction c;
c.deno=deno*c1.deno;
c.nume=nume*c1.nume;
c.huajian();
return c;

}

CFraction CFraction::operator/(const CFraction &c1)
{
CFraction c;
c.deno=deno*c1.nume;
c.nume=nume*c1.deno;
c.huajian();
return c1;
}
istream &operator>>(istream &in,CFraction &c1)
{
char ch;
while(1)
{
cin>>c1.nume>>ch>>c1.deno;
if(c1.deno==0)
cout<<"分母不能为0，请重输"<<endl;
else if(ch!='/')
cout<<"格式错误，请重输"<<endl;
else
break;
}
return cin;
}
ostream &operator<<(ostream &out,CFraction &c1)
{
cout<<c1.nume<<'/'<<c1.deno;
return cout;
}
bool CFraction::operator==(const CFraction &c1)
{
int x,y;
x=nume*c1.deno;
y=c1.nume*deno;
if(x-y==0)
return true;
else
return false;

}
bool CFraction::operator>(const CFraction &c1)
{
int x,y;
x=nume*c1.deno;
y=c1.nume*deno;
if(x-y>0)
return true;
else
return false;

}
bool CFraction::operator<(const CFraction &c1)
{
int x,y;
x=nume*c1.deno;
y=c1.nume*deno;
if(x-y<0)
return true;
else
return false;

}
CFraction CFraction::operator+()
{
return *this;
}
CFraction CFraction ::operator-()
{
CFraction n;
n.nume=-nume;
n.deno=deno;
return n;
}
CFraction CFraction::operator~()
{
CFraction n;

if(nume<0)
{
n.deno=-nume;
n.nume=-deno;
}
else
{
n.nume=deno;
n.deno=nume;
}

return n;
}

int main()
{
CFraction c1,c2,c3;

cout<<"请输入第一个分数："<<endl;
cin>>c1;
cout<<"请输入第二个分数："<<endl;
cin>>c2;
cout<<endl;
cout<<"下面进行计算："<<endl;
c3=c1+c2;
cout<<"x+c2= "<<c3<<endl;
c3=c1-c2;
cout<<"x-c2= "<<c3<<endl;
c3=c1*c2;
cout<<"c1*c2= "<<c3<<endl;
c3=c1/c2;
cout<<"c1/c2= "<<c3<<endl;
cout<<endl;
cout<<"下面进行比较："<<endl;
if(c1>c2)
cout<<"c1>c2"<<endl;
if(c1<c2)
cout<<"c1<c2"<<endl;
if(c1==c2)
cout<<"c1=c2"<<endl;
cout<<endl;
cout<<"下面进行分数取反："<<endl;
c3=+c1;
cout<<"+c1 "<<c3<<endl;
c3=-c1;
cout<<"-c1 "<<c3<<endl;
c3=~c1;
cout<<"~c1 "<<c3<<endl;
return 0;
}


在取反运算最后输出时开始写的是 cout<<+x<<endl; 但是出现了许多错误，经过思考尝试写成和前面加减一样的 c3=+c1;
cout<<"+c1 "<<c3<<endl; 形式，结果问题解决，所以结果不能直接输出。以后遇到错误时要多尝试才有可能改过来。

• 本文已收录于以下专栏：

## C++实践参考——分数类中的运算符重载

【项目1-分数类中的运算符重载】 　　（1）实现分数类中的运算符重载，在分数类中可以完成分数的加减乘除（运算后再化简）、比较（6种关系）的运算。class CFraction { private: ...
• sxhelijian
• 2016年05月19日 21:44
• 3258

## 有一分数序列： 2/1 3/2 5/3 8/5 13/8 21/13...... 求出这个数列的前N项之和，保留两位小数

• qq_24722301
• 2015年01月20日 18:58
• 4605

## （c++）有一分数序列： 2/1 3/2 5/3 8/5 13/8 21/13...... 求出这个数列的前N项之和，保留两位小数。

#include #include using namespace std; int main() { double a=1,b=2,c,sum=0; int n; cin>>n; for(int i...
• sunxuelei9543
• 2017年01月19日 15:14
• 600

## 有一个分数序列 2/1,3/2,5/3,8/5,13/8,21/13,....... 求这个序列的前20项之和

• centralunit
• 2017年01月07日 00:17
• 2486

## 第13周项目1—分数类中的运算符重载

#include #include using namespace std; class CFraction { private: int nume; // 分子 int den...
• zhangzhangjiejie
• 2016年05月26日 17:32
• 158

## 有一个分数序列：2/1, 3/2, 5/3, 8/5, 13/8, …编写程序求出这个序列的前n项之和。 输入

#include int main(){ int a=2,b=1,c,n,i; double s=0; scanf("%d",&n); if(n>10||n
• hyc19960202
• 2017年01月01日 15:14
• 995

## 某数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,... 输出此数列第n项值 递归

• dingxingmei
• 2015年10月09日 10:38
• 1083

## 有一分数序列：2/1，3/2，5/3，8/5，13/8，21/13……求出这个数列的前20项之和。

• qslife
• 2016年06月05日 23:21
• 1883

## 第13周项目1--分数类中的运算符重载

• haiyanycy
• 2016年05月30日 14:59
• 220

## 第13周—项目一分数类中的运算符重载

*烟台大学计算机学院 *文件名称：xiangmu1.cpp *作 者：李亚辉 *完成日期：2016年6月23日 *版 本 号：vc++6.0 * *...
• ll333543
• 2016年06月23日 21:27
• 188

举报原因： 您举报文章：第13周项1—分数类中的运算符重载 （2） 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)