【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
    评论
有理数)创建一个名为 Rational 的类,用于对分数进行算术运算。编写一个程序来测试你的类。使用整数变量来表示类的私有实例变量——分子和分母。 提供一个构造函数,使该类的对象能够在声明时进行初始化。构造函数应以简化形式存储分数分数 2/4 等价于 1/2,并将作为分子中的 1 和分母中的 2 存储在对象中。 如果没有提供初始值设定项,请提供默认值为 1 的无参数构造函数。 提供执行以下每个操作的公共方法: a) 将两个有理数相加:相加的结果应以简化形式存储。 b) 两个有理数相减:相减的结果应以简化形式存储。 c) 将两个有理数相乘:相乘的结果应以简化形式存储。 d) 将两个有理数相除:相除的结果应以简化形式存储。 e) 以 a/b 的形式返回有理数的字符串表示形式,其中 a 是分子,b 是分母。 f) 以浮点格式返回有理数的字符串表示形式. (考虑提供格式化功能,类的用户能够指定小数点右侧的精度位数。) 【Sample output 1】 Enter numerator 1: 12 Enter denominator 1: 3 Enter numerator 2: 5 Enter denominator 2: 14 Enter precision: 3 a=4/1 b=5/14 a + b = 61/14 = 4.357 a - b = 51/14 = 3.643 a * b = 10/7 = 1.429 a / b = 56/5 = 11.200 【Sample output 2】 Enter numerator 1: 1 Enter denominator 1: 4 Enter numerator 2: 75 Enter denominator 2: 35 Enter precision: 1 a=1/4 b=15/7 a + b = 67/28 = 2.4 a - b = -53/28 = -1.9 a * b = 15/28 = 0.5 a / b = 7/60 = 0.1 Note: The red texts are inputed ,others are output texts. Just use a space to seperate words
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值