C++实现:分数类

花了几个小时敲代码——测试——修改……

总算搞定了

好累,睡觉去的

有问题欢迎提出,继续修改

首先是头文件CFraction.h:

 

#ifndef CFRACTION_H_
#define CFRACTION_H_
#include <iostream>
using  namespace std;
class CFraction
{
public:
	CFraction(int a=1,int b=1);
	virtual ~CFraction(){};
	float GetValue()const;//获取分数值
	void Simplification();//化简
	void Show();//显示分数
	friend ostream& operator<<(ostream& os,CFraction& f);
	//重载四则运算操作符
	CFraction operator +(const CFraction& f)const;
	CFraction operator -(const CFraction& f)const;
	CFraction operator *(const CFraction& f)const;
	CFraction operator /(CFraction& f)const;
	//重载比较操作符
	bool operator ==(const CFraction& f)const;
	bool operator >(const CFraction& f)const;
	bool operator <(const CFraction& f)const;
	CFraction GetReciprocal();//获取分数的倒数
	void ChangeValue(int a,int b);//改变当前分数分子和分母
private:
	int m_molecular;//分子
	int m_denomilator;//分母
	bool m_IsNegative;//是否为负数 
};
#endif;

然后是类方法实现文件CFraction.cpp

#include "stdafx.h"
#include "CFraction.h"
#include <cmath>
//辗转相除法求最大公约数
int Function(int& a,int& b)
{
	int r=a%b;
	while(r)
	{
		a=b;
		b=r;
		r=a%b;
	}
	return b;
}
ostream& operator<<(ostream& os,CFraction& f)
{
	f.Simplification();
	if(f.m_IsNegative)//负数
		os<<"  -"<<f.m_molecular<<"/"<<f.m_denomilator<<endl;
	else//正数
		os<<"   "<<f.m_molecular<<"/"<<f.m_denomilator<<endl;
	return os;
}
CFraction::CFraction(int a, int b):m_IsNegative(false)
{//默认分数为正1
	while(b==0)
	{
		cout<<"分母不能为0,请重新输入分母:"<<endl;
		cin>>b;
	}
	this->m_molecular=abs(a);
	this->m_denomilator=abs(b);
	if(a<0&&b<0)
		this->m_IsNegative=false;
	else if(a<0||b<0)
		this->m_IsNegative=true;
	else
		this->m_IsNegative=false;
	this->Simplification();
}
float CFraction::GetValue()const
{
	return this->m_molecular/(float)m_denomilator;
}
void CFraction::Simplification()
{
	int a=m_molecular,b=m_denomilator;
	int ret=Function(a,b);
	m_molecular/=ret;
	m_denomilator/=ret;
}
CFraction CFraction::operator +(const CFraction &f)const
{
	CFraction temp;
	if(m_IsNegative==f.m_IsNegative)//同号相加
	{
		temp.m_molecular=m_molecular*f.m_denomilator+m_denomilator*f.m_molecular;
		temp.m_denomilator=m_denomilator*f.m_denomilator;
		temp.m_IsNegative=m_IsNegative;
	}
	else// 不同号
	{
		temp.m_molecular=abs(m_molecular*f.m_denomilator-m_denomilator*f.m_molecular);
		temp.m_denomilator=abs(m_denomilator*f.m_denomilator);
		if(this->GetValue()>f.GetValue())
			temp.m_IsNegative=m_IsNegative;
		else
			temp.m_IsNegative=f.m_IsNegative;
	}
	return temp;
}
void CFraction::Show()
{
	cout<<*this;
}
CFraction CFraction::operator -(const CFraction &f) const
{
	CFraction temp;
	if(m_IsNegative==f.m_IsNegative)//同号相减
	{
		temp.m_molecular=abs(m_molecular*f.m_denomilator-m_denomilator*f.m_molecular);
		temp.m_denomilator=m_denomilator*f.m_denomilator;
		if(GetValue()>=f.GetValue())
			temp.m_IsNegative=false;
		else
			temp.m_IsNegative=true;
	}
	else//异号相减
	{
		temp.m_molecular=m_molecular*f.m_denomilator+m_denomilator*f.m_molecular;
		temp.m_denomilator=m_denomilator*f.m_denomilator;
		temp.m_IsNegative=m_IsNegative;
	}
	return temp;
}
CFraction CFraction::operator *(const CFraction &f) const
{
	CFraction temp;
	temp.m_molecular=m_molecular*f.m_molecular;
	temp.m_denomilator=m_denomilator*f.m_denomilator;
	//接下来确定符号
	if(m_IsNegative==f.m_IsNegative)//同号相乘符号为正
		temp.m_IsNegative=false;
	else
		temp.m_IsNegative=true;
	return temp;

}
CFraction CFraction::operator /(CFraction &f) const
{
	CFraction temp,r;
	r=f.GetReciprocal();
	temp=*this*r;
	return temp;
}
CFraction CFraction::GetReciprocal()
{
	CFraction temp;
	temp.m_denomilator=m_molecular;
	temp.m_molecular=m_denomilator;
	temp.m_IsNegative=m_IsNegative;
	return temp;
}
bool CFraction::operator ==(const CFraction &f) const
{
	if(m_IsNegative!=f.m_IsNegative)//不同号肯定不相等
		return false;
	if(GetValue()==f.GetValue())
		return true;
	else
		return false;
}
bool CFraction::operator <(const CFraction &f) const
{
	if(m_IsNegative==f.m_IsNegative)//同号比较大小
	{
		if(GetValue()<f.GetValue())
		{
			if(m_IsNegative)
				return false;
			else
				return true;
		}
		else if(GetValue()>f.GetValue())
		{
			if(m_IsNegative)
				return true;
			else
				return false;
		}
		else//相等的分数
			return false;
	}
	else if(m_IsNegative)//左负友正
		return true;
	else// 左正右负
		return false;
}
bool CFraction::operator >(const CFraction& f)const//大于号小于号刚好相反
{
	return (f<*this);
}
void CFraction::ChangeValue(int a,int b)
{
	*this=CFraction(a,b);
}


希望对C++初学者有所帮助

C++真的很强大

努力学习中

再见

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
下面是一个简单的 C++ 分数 `fraction` 的实现,它包含了分数的四则运算和比较运算。 ```cpp #include <iostream> using namespace std; class fraction { private: int num; // 分子 int den; // 分母 public: fraction(int n = 0, int d = 1) { if (d == 0) { cout << "分母不能为0!" << endl; exit(1); } if (d < 0) { n = -n; d = -d; } num = n; den = d; reduce(); } int getNum() const { return num; } int getDen() const { return den; } fraction operator-() const { return fraction(-num, den); } friend fraction operator+(const fraction& f1, const fraction& f2); friend fraction operator-(const fraction& f1, const fraction& f2); friend fraction operator*(const fraction& f1, const fraction& f2); friend fraction operator/(const fraction& f1, const fraction& f2); friend bool operator==(const fraction& f1, const fraction& f2); friend bool operator!=(const fraction& f1, const fraction& f2); friend bool operator<(const fraction& f1, const fraction& f2); friend bool operator>(const fraction& f1, const fraction& f2); friend bool operator<=(const fraction& f1, const fraction& f2); friend bool operator>=(const fraction& f1, const fraction& f2); friend istream& operator>>(istream& in, fraction& f); friend ostream& operator<<(ostream& out, const fraction& f); private: void reduce() { int gcd = getGCD(num, den); num /= gcd; den /= gcd; } int getGCD(int a, int b) { if (b == 0) return a; return getGCD(b, a % b); } }; fraction operator+(const fraction& f1, const fraction& f2) { return fraction(f1.getNum() * f2.getDen() + f2.getNum() * f1.getDen(), f1.getDen() * f2.getDen()); } fraction operator-(const fraction& f1, const fraction& f2) { return f1 + (-f2); } fraction operator*(const fraction& f1, const fraction& f2) { return fraction(f1.getNum() * f2.getNum(), f1.getDen() * f2.getDen()); } fraction operator/(const fraction& f1, const fraction& f2) { return fraction(f1.getNum() * f2.getDen(), f1.getDen() * f2.getNum()); } bool operator==(const fraction& f1, const fraction& f2) { return f1.getNum() == f2.getNum() && f1.getDen() == f2.getDen(); } bool operator!=(const fraction& f1, const fraction& f2) { return !(f1 == f2); } bool operator<(const fraction& f1, const fraction& f2) { return f1.getNum() * f2.getDen() < f2.getNum() * f1.getDen(); } bool operator>(const fraction& f1, const fraction& f2) { return f2 < f1; } bool operator<=(const fraction& f1, const fraction& f2) { return !(f2 < f1); } bool operator>=(const fraction& f1, const fraction& f2) { return !(f1 < f2); } istream& operator>>(istream& in, fraction& f) { char slash; in >> f.num >> slash >> f.den; f.reduce(); return in; } ostream& operator<<(ostream& out, const fraction& f) { out << f.getNum() << '/' << f.getDen(); return out; } int main() { fraction f1(1, 2), f2(3, 4), f3; cout << "f1 = " << f1 << endl; cout << "f2 = " << f2 << endl; cout << "f3 = " << f3 << endl; cout << "请输入一个分数:"; cin >> f3; cout << "f3 = " << f3 << endl; cout << "f1 + f2 = " << f1 + f2 << endl; cout << "f1 - f2 = " << f1 - f2 << endl; cout << "f1 * f2 = " << f1 * f2 << endl; cout << "f1 / f2 = " << f1 / f2 << endl; cout << "f1 == f2 ? " << (f1 == f2) << endl; cout << "f1 != f2 ? " << (f1 != f2) << endl; cout << "f1 < f2 ? " << (f1 < f2) << endl; cout << "f1 > f2 ? " << (f1 > f2) << endl; cout << "f1 <= f2 ? " << (f1 <= f2) << endl; cout << "f1 >= f2 ? " << (f1 >= f2) << endl; return 0; } ``` 上述实现中,分数 `fraction` 的成员变量包括分子 `num` 和分母 `den`,它们在构造函数中被初始化。构造函数中还进行了分母为零的判断和分数的约分处理。`fraction` 重载了一些运算符,包括一元负号运算符、二元加减乘除运算符和比较运算符。此外,还重载了输入输出流运算符,方便用户输入和输出分数。在主函数中,演示了如何使用这些运算符进行分数的运算和比较。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值