【c++】运算符重载 有理数(分数)加减乘除

结合上一篇关于运算符重载的看:运算符重载
模块化:有理数运算 模块化
设计一个有理数类,要求如下:
有理数有整数类型的分子、分母组成,通过运算符重载,完成有理数的加、减、乘、除运算,运算结果要求为最简分数,即分子分母没有公约数。在主程序中测试类与方法。
tip:
1.可以在运算符重载时利用friend,友元关系让重载的运算符可以访问自定义类中的私有变量。看具体程序需求,不用也可以。
2.二元运算符成员函数重载只能有一个参数或没有参数。故在此时的条件下该题运算符重载时要用friend使其成为友元函数而避免被编译器错误认作成员函数报错。
例子:

friend Rational operator+(const Rational &r1,const Rational &r2);//相加例子

代码:
这段代码是自己输入两个有理数的
若只是测试类与方法,可以把输入句段删除,自定义类中的number1和number2相关值即可

#include<iostream>
#include<cmath>
using namespace std;

class Clc
{
public:
	Clc(int s=0,int m=1):son(s),mom(m){}//定义数据输入形式 
	int son,mom;
	friend Clc operator+(const Clc &number1,const Clc &number2);
	friend Clc operator-(const Clc &number1,const Clc &number2);
	friend Clc operator*(const Clc &number1,const Clc &number2);
	friend Clc operator/(const Clc &number1,const Clc &number2); 
	
	void easy();//辗转相除化简 
	void print();
	
};

Clc operator+(const Clc &number1,const Clc &number2)
{
	Clc anser;
	anser.son=number1.son*number2.mom+number1.mom*number2.son;
	anser.mom=number1.mom*number2.mom;
	anser.easy();
	return anser;
} 

Clc operator-(const Clc &number1,const Clc &number2)
{
	Clc anser;
	anser.son=number1.son*number2.mom-number1.mom*number2.son;
	anser.mom=number1.mom*number2.mom;
	anser.easy();
	return anser;
}

Clc operator*(const Clc &number1,const Clc &number2)
{
	Clc anser;
	anser.son=number1.son*number2.son;
	anser.mom=number1.mom*number2.mom;
	anser.easy(); 
	return anser;
}

Clc operator/(const Clc &number1,const Clc &number2)
{
	Clc anser;
	anser.son=number1.son*number2.mom;
	anser.mom=number1.mom*number2.son;
	anser.easy();
	return anser;
}

void Clc::easy()
{
	int s,m,tmp,gcd;
	if(son!=0)//若分子为零,辗转相除会报错,故判断 分子大小 
	{
		s=abs(son);
		m=abs(mom);
		tmp=m%s;
		while(tmp!=0)
		{
			m=s;
			s=tmp;
			tmp=m%s;
		}
		gcd=s;
		son=son/gcd;
		mom=mom/gcd;
		if(mom<0)//如果分母为负数就把'-'放在分子上 
		{
			mom=-mom;
			son=-son;
		}
	}
}

void Clc::print()
{
	if(son==0) //分子为零就输出0 
		cout<<"0"<<endl;
	if(son!=0)
	{
		if(mom!=1)
			cout<<son<<"/"<<mom<<endl;
		if(mom==1)//分母为1就输出分子,让答案为整数 
		{
			cout<<son<<endl;
		}	
	}
}

int main()
{
	int son1,son2,mom1,mom2;
	
	cout<<"按照x(分子)/x(分母)的格式输入有理数~"<<endl; 
	cout<<"输入第一个有理数吧~" <<endl;
	cin>>son1;
	cin.ignore(100,'/');
	cin>>mom1; 
	cout<<"输入第二个有理数吧~" <<endl;
	cin>>son2;
	cin.ignore(100,'/');
	cin>>mom2;
	if(mom1==0||mom2==0)//排除分母为0 
		cout<<"分母中有0存在~检查一下"<<endl; 
	cout<<"---------------------------------------------"<<endl;	
	Clc anser;
	Clc number1(son1,mom1),number2(son2,mom2); 
	
	cout<<son1<<"/"<<mom1<<" + "<<son2<<"/"<<mom2<<"的答案为:" <<endl;
	anser=number1+number2;
	anser.print();
	
	cout<<son1<<"/"<<mom1<<" - "<<son2<<"/"<<mom2<<"的答案为:" <<endl;
	anser=number1-number2;
	anser.print();
	
	cout<<son1<<"/"<<mom1<<" * "<<son2<<"/"<<mom2<<"的答案为:" <<endl;
	anser=number1*number2;
	anser.print();
	
	cout<<son1<<"/"<<mom1<<" / "<<son2<<"/"<<mom2<<"的答案为:" <<endl;
	anser=number1/number2;
	anser.print();
	
	return 0;
}

最典型的输出判断例子:
包含情况:
1.分子为0
2.分母为1
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值