class Fraction { private: int nume; // 分子 int deno; // 分母 public: Fraction(int nu=0,int de=1); //构造函数,初始化用 void simplify(); //化简(使分子分母没有公因子) Fraction operator + (const Fraction &c); Fraction operator - (const Fraction &c); Fraction operator * (const Fraction &c); Fraction operator / (const Fraction &c); int get_nume(); int get_deno(); };
#include "stdafx.h" #include "Fraction.h" Fraction:: Fraction(int nu,int de): nume(nu), deno(de){} //化简 void Fraction::simplify() { int m,n,r; m=abs(deno); n=abs(nume); while(r=m%n) // 求m,n的最大公约数 { m=n; n=r; } deno/=n; // 化简 nume/=n; if (deno<0) // 将分母转化为正数 { deno=-deno; nume=-nume; } } // 分数相加 Fraction Fraction::operator+(const Fraction &c) { Fraction t; t.nume=nume*c.deno+c.nume*deno; t.deno=deno*c.deno; t.simplify(); return t; } // 分数相减 Fraction Fraction:: operator-(const Fraction &c) { Fraction t; t.nume=nume*c.deno-c.nume*deno; t.deno=deno*c.deno; t.simplify(); return t; } // 分数相乘 Fraction Fraction:: operator*(const Fraction &c) { Fraction t; t.nume=nume*c.nume; t.deno=deno*c.deno; t.simplify(); return t; } // 分数相除 Fraction Fraction:: operator/(const Fraction &c) { Fraction t; if (!c.nume) return *this; //除法无效(除数为0)时,这种情况需要考虑,但这种处理仍不算合理 t.nume=nume*c.deno; t.deno=deno*c.nume; t.simplify(); return t; } int Fraction::get_nume() { return nume; } int Fraction::get_deno() { return deno; }
void C分数计算Dlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 UpdateData(); Fraction f1(m_nume1, m_deno1), f2(m_nume2, m_deno2), f3(m_nume, m_deno); if(m_char == '+') { f3 = f1 + f2; } else if(m_char == '-') { f3 = f1 + f2; } else if(m_char == '*') { f3 = f1 * f2; } else if(m_char == '/') { f3 = f1 / f2; } m_nume = f3.get_nume(); m_deno = f3.get_deno(); UpdateData(FALSE); }
上图: