c++分数类

  以下这个代码是将头文件、对应的实现文件和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;
}

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值