C++实现:分数类

来源:互联网 发布:淘宝大学图片 编辑:程序博客网 时间:2024/05/22 00:41

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

总算搞定了

好累,睡觉去的

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

首先是头文件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){//默认分数为正1while(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;elsethis->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;elsetemp.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;elsetemp.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;elsetemp.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;elsereturn false;}bool CFraction::operator <(const CFraction &f) const{if(m_IsNegative==f.m_IsNegative)//同号比较大小{if(GetValue()<f.GetValue()){if(m_IsNegative)return false;elsereturn true;}else if(GetValue()>f.GetValue()){if(m_IsNegative)return true;elsereturn 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++真的很强大

努力学习中

再见

原创粉丝点击