您的位置:首页 > 编程语言 > C语言/C++

c++分数类

2015-11-12 10:26 441 查看
  以下这个代码是将头文件、对应的实现文件和main.cpp放在一起的,只要稍微改一下预处理指令就能拆成三部分。

  
#include<cstdio>
#include<cassert>

class fraction{
private:
int numerator;//分子
int denominator;//分母
int gcd(int x,int y)const;//最大公约数
int lcm(int x,int y)const;//最小公倍数
void fixup();//维护分母始终为正数

public:
//构造函数
fraction();//缺省构造函数
fraction(int numerator); //分母默认值为1
fraction(int numerator,int denominator);

//运算符重载
friend const fraction operator +(const fraction &x,const fraction &y);
friend const fraction operator -(const fraction &x,const fraction &y);
friend const fraction operator *(const fraction &x,const fraction &y);
friend const fraction operator /(const fraction &x,const fraction &y);
const fraction operator -();

const fraction simplify()const; //化简
const fraction reciprocal()const;//倒数

friend bool operator >(const fraction &x,const fraction &y);
friend bool operator >=(const fraction &x,const fraction &y);
friend bool operator <(const fraction &x,const fraction &y);
friend bool operator <=(const fraction &x,const fraction &y);
friend bool operator !=(const fraction &x,const fraction &y);
friend bool operator ==(const fraction &x,const fraction &y);
fraction& operator =(const fraction &x);
//输出
void print()const;
};

//用初始化列表写构造函数
fraction::fraction(int x,int y):numerator(x),denominator(y){
assert(y!=0);//确保分母不为0,否则在运行过程中报错
}

fraction::fraction(int x):numerator(x),denominator(1){ }

fraction::fraction(){ }

//最小公倍数
int fraction::lcm(int x,int y)const
{
//欧几里得算法
while(y){
int t=y;
y=x%y;
x=t;
}
return x;
}

//最大公约数
int fraction::gcd(int x,int y)const
{
int n=lcm(x,y);
return x*y/n;
}

//维护分母为正
void fraction::fixup()
{
//如果分母为负,将分子分母同时取负
if(denominator<0){
denominator=-denominator;
numerator=-numerator;
}
assert(denominator!=0);
}

//化简
const fraction fraction::simplify()const
{
fraction ans;
int n=lcm(numerator,denominator);//得到最小公倍数
ans.denominator=denominator/n;//分子分母同时除以最小公倍数
ans.numerator=numerator/n;
return ans;
}

const fraction operator +(const fraction &x,const fraction &y)
{
int n=x.gcd(x.denominator,y.denominator);//得到最大公约数
fraction ans;
//将分母化为相同的再对分子进行加法运算
ans.numerator=n/x.denominator*x.numerator+n/y.denominator*y.numerator;
ans.denominator=n;
return ans.simplify();
}

const fraction operator -(const fraction &x,const fraction &y)
{
int n=x.gcd(x.denominator,y.denominator);//得到最大公约数
fraction ans;
//将分母化为相同的再对分子进行减法运算
ans.numerator=n/x.denominator*x.numerator-n/y.denominator*y.numerator;
ans.denominator=n;
return ans.simplify();
}

const fraction operator *(const fraction &x,const fraction &y)
{
fraction ans;
fraction tmp_x=x.simplify();
fraction tmp_y=y.simplify();
//分子分母对应相乘
ans.numerator=tmp_x.numerator*tmp_y.numerator;
ans.denominator=tmp_x.denominator*tmp_y.denominator;
return ans.simplify();
}

const fraction operator /(const fraction &x,const fraction &y)
{
fraction ans;
fraction tmp_x=x.simplify();
fraction tmp_y=y.simplify();
assert(tmp_y.denominator!=0);//分子为0不能作为除数
//分子乘分母,分母乘分子
ans.numerator=tmp_x.numerator*tmp_y.denominator;
ans.denominator=tmp_x.denominator*tmp_y.numerator;
ans=ans.simplify();
ans.fixup();
return ans;
}

const fraction fraction::operator -()
{
//分子变为相反数
fraction x;
x.numerator=-numerator;
x.denominator=denominator;
return x;
}

fraction& fraction::operator =(const fraction &x)
{
if(this!=&x){
numerator=x.numerator;
denominator=x.denominator;
}
return *this;
}
bool operator >(const fraction &x,const fraction &y)
{
if((x-y).numerator>0)return true;
else return false;
}

bool operator >=(const fraction &x,const fraction &y)
{
if((x-y).numerator>=0)return true;
else return false;
}

bool operator <(const fraction &x,const fraction &y)
{
if((x-y).numerator<0)return true;
else return false;
}

bool operator <=(const fraction &x,const fraction &y)
{
if((x-y).numerator<=0)return true;
else return false;
}

bool operator !=(const fraction &x,const fraction &y)
{
if((x-y).numerator!=0)return true;
else return false;
}

bool operator ==(const fraction &x,const fraction &y)
{
if((x-y).numerator==0)return true;
else return false;
}

const fraction fraction::reciprocal()const
{
return 1/(*this);
}

void fraction::print()const
{
if(numerator%denominator)printf("%d/%d\n",numerator,denominator);
else printf("%d\n",numerator/denominator);
}

int main()
{
fraction x(1,4),y(7,16);
//error:fraction t(1,0);
int v=1;

//测试分数运算
fraction ans1=x+y;
fraction ans2=x-y;
fraction ans3=x*y;
fraction ans4=x/y;
fraction ans5=-x;
fraction ans6=x.reciprocal();

printf("x=1/4,y=7/16,v=1\n\n");
printf("x+y=");
ans1.print();

printf("x-y=");
ans2.print();

printf("x*y=");
ans3.print();

printf("x/y=");
ans4.print();

printf("-x=");
ans5.print();

printf("1/x=");
ans6.print();

printf("\nx>y? ");
printf("%d\n",x>y);

printf("x<y? ");
printf("%d\n",x<y);

printf("x==y? ");
printf("%d\n",x==y);

printf("x!=y? ");
printf("%d\n",x!=y);

printf("x>=y? ");
printf("%d\n",x>=y);

printf("x<=y? ");
printf("%d\n",x<=y);

printf("\n");

//测试分数与整数运算

fraction ans7=v+x;
fraction ans8=x+v;
fraction ans9=v-x;
fraction ans10=x-v;
fraction ans11=x*v;
fraction ans12=v*x;
fraction ans13=x/v;
fraction ans14=v/x;

printf("v+x=");
ans7.print();
printf("x+v=");
ans8.print();
printf("v-x=");
ans9.print();
printf("x-v=");
ans10.print();
printf("x*v=");
ans11.print();
printf("v*x=");
ans12.print();
printf("x/v=");
ans13.print();
printf("v/x=");
ans14.print();

printf("\nx>v? ");
printf("%d\n",x>v);

printf("x<v? ");
printf("%d\n",x<v);

printf("x==v? ");
printf("%d\n",x==v);

printf("x!=v? ");
printf("%d\n",x!=v);

printf("x>=v? ");
printf("%d\n",x>=v);

printf("x<=v? ");
printf("%d\n",x<=v);

printf("\nv>x? ");
printf("%d\n",v>x);

printf("v<x? ");
printf("%d\n",v<x);

printf("v==x? ");
printf("%d\n",v==x);

printf("v!=x? ");
printf("%d\n",v!=x);

printf("v>=x? ");
printf("%d\n",v>=x);

printf("v<=x? ");
printf("%d\n",v<=x);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: