最近写的C++分数类,与大家一起学习

本文介绍了一个分数类的设计与实现过程,包括分数的各种运算符重载、输入输出流的重载以及约分、求倒数等操作。通过具体示例展示了如何使用该分数类进行数学计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//fraction.h

#ifndef _FRACTION_H
#define _FRACTION_H

#include <iostream>
using namespace std;

class fraction
{
private:
	int numerator; //分子
	int denominator; //分母
public:
	fraction():numerator(0),denominator(1) //构造函数
	{
	}
	fraction(int a):numerator(a),denominator(1) //构造函数
	{
	}
	fraction(int a,int b):numerator(a),denominator(b) //构造函数
	{
	}

	friend istream& operator>>(istream&,fraction&); //重载输入流
	friend ostream& operator<<(ostream&,fraction&); //重载输出流

	friend const fraction& operator+(const fraction&,const fraction&); //重载“+”
	friend const fraction& operator-(const fraction&,const fraction&); //重载“-”
	friend const fraction& operator*(const fraction&,const fraction&); //重载“*”
	friend const fraction& operator/(const fraction&,const fraction&); //重载“/”

	bool operator==(const fraction&); //重载“==”
	bool operator<(const fraction&); //重载“<”
	bool operator>(const fraction&); //重载“>”
	bool operator<=(const fraction&); //重载“<=”
	bool operator>=(const fraction&); //重载“>=”
	bool operator!=(const fraction&); //重载“!=”

	const fraction& operator+=(const fraction&); //重载“+=”
	const fraction& operator-=(const fraction&); //重载“-=”
	const fraction& operator*=(const fraction&); //重载“*=”
	const fraction& operator/=(const fraction&); //重载“/=”

	const fraction& operator=(const fraction&); //重载“=”
	const fraction& reciprocal(); //倒数
	const fraction& reduct(); //约分
};

#endif
//fraction.cpp

#include "fraction.h"
#include <iostream>
#include <math.h>
using namespace std;

//输入函数
istream& operator>>(istream& in,fraction& f)
{
	in>>f.numerator>>f.denominator;
	return in;
}

//输出函数
ostream& operator<<(ostream& out,fraction& f)
{
	if(f.denominator==0)
	{
		out<<"分母不能为0!"<<endl;
		exit (0);
	}
	else if(f.numerator%f.denominator==0)
		out<<f.numerator/f.denominator;
	else
		out<<f.numerator<<"/"<<f.denominator;
	return out;
}

//最大公约数
int gcd(int a,int b)
{
	int temp;
	if(a<b)
	{
		temp=a;
		a=b;
		b=temp;
	}
	while(b!=0)
    {
		temp=a%b;
		a=b;
		b=temp;
    }
  return a;
}

//约分
const fraction& fraction::reduct()
{
	int GCD=gcd(abs(numerator),abs(denominator));
	numerator/=GCD;
	denominator/=GCD;
	return *this;
}

//倒数
const fraction& fraction::reciprocal()
{
	int temp;
	if(numerator==0)
	{
		cout<<"分母不能为0!"<<endl;
		exit (0);
	}
	temp=numerator;
	numerator=denominator;
	denominator=temp;
	return *this;
}

//重载“+”运算符
const fraction& operator+(const fraction& f1,const fraction& f2)
{
	fraction f;
	f.numerator=f1.numerator*f2.denominator+f2.numerator*f1.denominator;
	f.denominator=f1.denominator*f2.denominator;
	return f;
}

//重载“-”运算符
const fraction& operator-(const fraction& f1,const fraction& f2)
{
	fraction f;
	f.numerator=f1.numerator*f2.denominator-f2.numerator*f1.denominator;
	f.denominator=f1.denominator*f2.denominator;
	return f;
}

//重载“*”运算符
const fraction& operator*(const fraction& f1,const fraction& f2)
{
	fraction f;
	f.numerator=f1.numerator*f2.numerator;
	f.denominator=f1.denominator*f2.denominator;
	return f;
}

//重载“/”运算符
const fraction& operator/(const fraction& f1,const fraction& f2)
{
	fraction f;
	f.numerator=f1.numerator*f2.denominator;
	f.denominator=f1.denominator*f2.numerator;
	return f;
}

//重载“=”运算符
const fraction& fraction::operator=(const fraction& f)
{
	numerator=f.numerator;
	denominator=f.denominator;
	return *this;
}

//重载“+=”运算符
const fraction& fraction::operator+=(const fraction& f)
{
	numerator=numerator*f.denominator+f.numerator*denominator;
	denominator*=f.denominator;
	return *this;
}

//重载“-=”运算符
const fraction& fraction::operator-=(const fraction& f)
{
	numerator=numerator*f.denominator-f.numerator*denominator;
	denominator*=f.denominator;
	return *this;
}

//重载“*=”运算符
const fraction& fraction::operator*=(const fraction& f)
{
	numerator*=f.numerator;
	denominator*=f.denominator;
	return *this;
}

//重载“/=”运算符
const fraction& fraction::operator/=(const fraction& f)
{
	numerator*=f.denominator;
	denominator*=f.numerator;
	return *this;
}

//重载“==”运算符
bool fraction::operator==(const fraction& f)
{
	return (numerator*f.denominator==f.numerator*denominator);
}

//重载“<”运算符
bool fraction::operator<(const fraction& f)
{
	return (numerator*f.denominator<f.numerator*denominator);
}

//重载“>”运算符
bool fraction::operator>(const fraction& f)
{
	return (numerator*f.denominator>f.numerator*denominator);
}

//重载“<=”运算符
bool fraction::operator<=(const fraction& f)
{
	return (numerator*f.denominator<=f.numerator*denominator);
}

//重载“>=”运算符
bool fraction::operator>=(const fraction& f)
{
	return (numerator*f.denominator>=f.numerator*denominator);
}

//重载“!=”运算符
bool fraction::operator!=(const fraction& f)
{
	return (numerator*f.denominator!=f.numerator*denominator);
}

//test.cpp

#include "fraction.h"
#include <iostream>
using namespace std;

int main()
{
	fraction a;
	fraction b(24,-10);
	fraction c,d,e,f;
	fraction g(2);
	cout<<"请输入c的分子分母,以空格相隔!"<<endl;
	cin>>c;
	cout<<"初始值为:\n"<<"a="<<a<<",b="<<b<<",c="<<c<<",d="<<d<<",e="<<e<<",f="<<f<<",g="<<g<<endl;
	cout<<"b="<<b<<"约分:"<<"b=";
	b.reduct();
	cout<<b<<endl;
	cout<<"b="<<b<<"倒数:"<<"b=";
	b.reciprocal();
	cout<<b<<endl;
	c=b;
	cout<<"将b赋值给c:"<<"c="<<c<<endl;
	d+=b+=a;
	cout<<"d+=b+=a:"<<"d="<<d<<endl;
	e-=b-=a;
	cout<<"e-=b-=a:"<<"e="<<e<<endl;
	f*=b*=a;
	cout<<"f*=b*=a:"<<"f="<<f<<endl;
	c/=g;
	cout<<"c/=b:"<<"c="<<c<<endl;
	f=a+b+d;
	cout<<"f=a+b+d:"<<"f="<<f<<endl;
	g=a-b-f;
	cout<<"g=a-b-f:"<<"g="<<g<<endl;
	g=a*b*f;
	cout<<"g=a*b*f:"<<"g="<<g<<endl;
	cout<<"a="<<a<<",d="<<d<<",";

	cout<<"与整数运算:c=";
	c+=2;
	cout<<c<<endl;
	if(a==d)
		cout<<"a==d"<<endl;
	else
		cout<<"a!=d"<<endl;
	a.reduct();
	b.reduct();
	c.reduct();
	d.reduct();
	e.reduct();
	f.reduct();
	g.reduct();
	cout<<"约分后输出最终值:\n"<<"a="<<a<<",b="<<b<<",c="<<c<<",d="<<d<<",e="<<e<<",f="<<f<<",g="<<g<<endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值