/* Rick Woods      Last edited: 2/14/02    Fractions class - header file--分数类头文件*/
#ifndef _TGR_FRACTIONS_H
#define _TGR_FRACTIONS_H
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
//#include <bool.h>
#include <string.h>
class fraction  //分数类定义
{
public:
        fraction();    //constructors
        fraction(int initn, int initd);
        //accessors
        int numerator() const; //取分子,const成员函数,不能修改数据成员
    int denominator() const;   //取分母
        double decimal() const;  //将分数转换为对应的小数
        fraction absval() const;  //分数的绝对值
        //modifiers
    void setnum(int newnum); //设置分子
        void setden(int newden);  //设置分母
        void simplify();         //约分
        void recip();            //分子分母转置
        const fraction & operator+= (int rhs);
    private:
        int n;
        int d;
};
//free (nonmember) functions
//miscellany
int GCF(int x, int y);  //求x,y的最大公因子
//addition operators
fraction operator+ (const fraction &lhs, const fraction &rhs);
fraction operator+ (const fraction &lhs, int rhs);
//subtraction operators
fraction operator- (const fraction &lhs, const fraction &rhs);
fraction operator- (const fraction &lhs, int rhs);
//multiplication operators
fraction operator* (const fraction &lhs, const fraction &rhs);
fraction operator* (const fraction &lhs, int rhs);
//division operators
fraction operator/ (const fraction &lhs, const fraction &rhs);
fraction operator/ (const fraction &lhs, int rhs);
//power operator
fraction operator^ (const fraction &base, int exp); //^(幂)运算符重载
//comparison operators
bool operator== (const fraction &lhs, const fraction &rhs);
bool operator!= (const fraction &lhs, const fraction &rhs);
bool operator>= (const fraction &lhs, const fraction &rhs);
bool operator<= (const fraction &lhs, const fraction &rhs);
bool operator>  (const fraction &lhs, const fraction &rhs);
bool operator<  (const fraction &lhs, const fraction &rhs);
bool operator== (const fraction &lhs, int rhs);
bool operator!= (const fraction &lhs, int rhs);
bool operator>= (const fraction &lhs, int rhs);
bool operator<= (const fraction &lhs, int rhs);
bool operator>  (const fraction &lhs, int rhs);
bool operator<  (const fraction &lhs, int rhs);
// I/O operators/functions
ostream & operator<< (ostream &os, const fraction &f); // 输出运算符重载
istream & operator>> (istream &is, fraction &f); // 输入运算符重载
void PrintAsMixed(ostream &os, const fraction &f);
#endif/* fraction.cpp
Rick Woods        Last edited: 2/14/02
     Fractions class - implementation file--分数类执行文件开始*/
#include "fraction.h"
fraction::fraction() : n(0), d(1) {}   //    缺省构造函数(=0/1)
fraction::fraction(int initn, int initd) : n(initn), d(initd) {}
int fraction::numerator() const    //    取分子
{
    return n;
}
int fraction::denominator() const 
{
    return d;
}
double fraction::decimal() const
{
    return double(n) / double(d);
}
fraction fraction::absval() const
{
    fraction returnValue(abs(n), abs(d));
    return returnValue;
}
void fraction::setnum(int newnum)
{
    n = newnum;
}
void fraction::setden(int newden)
{
    if(newden != 0)
        d = newden;
    else
    {
        cout << "Error:  Attemted to set denominator to zero!\n"
         << "Press any key to terminate";
    getch();
    abort();
  }
}
void fraction::simplify()
{
    int r = GCF(n, d);
    n /= r;
    d /= r;
}
void fraction::recip()
{
    int temp = n;
    n = d;
    d = temp;
}
const fraction & fraction::operator+= (int rhs)
{
  fraction newrhs(rhs, 1);
  return (*this + newrhs);
}
int GCF(int x, int y)   //    辗转相除求x,y的最大公约数
{
    int r = x%y;
    if(r==0)
        return y;
    else
        return GCF(y, r);
}
fraction operator+ (const fraction &lhs, const fraction &rhs)
{
    fraction sum;
    int newnum = (lhs.numerator() * rhs.denominator())                            +(rhs.numerator() * lhs.denominator());
    int newden = (lhs.denominator() * rhs.denominator());
    sum.setnum(newnum);
    sum.setden(newden);
    sum.simplify();
    return sum;
}
fraction operator+ (const fraction &lhs, int rhs)
{
  fraction newrhs(rhs, 1);
  return lhs + newrhs;
}
fraction operator- (const fraction &lhs, const fraction &rhs)
{
    fraction newrhs = rhs;
    newrhs.setnum(-rhs.numerator());
    return lhs + newrhs;
}
fraction operator- (const fraction &lhs, int rhs)
{
  fraction newrhs(rhs, -1);
  return lhs + newrhs;
}
fraction operator* (const fraction &lhs, const fraction &rhs)
{
    fraction product;
    int newnum = lhs.numerator() * rhs.numerator();
    int newden = lhs.denominator() * rhs.denominator();
    product.setnum(newnum);
    product.setden(newden);
    product.simplify();
    return product;
}
fraction operator* (const fraction &lhs, int rhs)
{
  fraction prod(lhs.numerator() * rhs, lhs.denominator());
  prod.simplify();
  return prod;
}
fraction operator/ (const fraction &lhs, const fraction &rhs)
{
  if(rhs == 0)
  {
    cout << "Error:  Division by zero attempted!\n"
                 << "Press any key to terminate";
    getch();
    abort();
  }
 fraction newrhs = rhs;
    newrhs.recip();
    return lhs * newrhs;
}

fraction operator/ (const fraction &lhs, int rhs)
{
  if(rhs == 0)
  {
    cout << "Error:  Division by zero attempted!\n"
         << "Press any key to terminate";
    getch();
    abort();
  }fraction quot(lhs.numerator(), lhs.denominator() * rhs);
  quot.simplify();
  return quot;
}

fraction operator^ (const fraction &base, int exp)
{
    fraction returnValue;
    returnValue.setnum(pow(base.numerator(), exp));
  returnValue.setden(pow(base.denominator(), exp));
    return returnValue;
}

bool operator== (const fraction &lhs, const fraction &rhs)
{
  return lhs.decimal() == rhs.decimal();
}

bool operator!= (const fraction &lhs, const fraction &rhs)
{
    return lhs.decimal() != rhs.decimal();
}

bool operator>= (const fraction &lhs, const fraction &rhs)
{
  return lhs.decimal() >= rhs.decimal();
}

bool operator<= (const fraction &lhs, const fraction &rhs)
{
  return lhs.decimal() <= rhs.decimal();
}

bool operator> (const fraction &lhs, const fraction &rhs)
{
  return lhs.decimal() > rhs.decimal();
}

bool operator< (const fraction &lhs, const fraction &rhs)
{
    return lhs.decimal() < rhs.decimal();
}
bool operator== (const fraction &lhs, int rhs)
{
  return lhs.decimal() == rhs;
}
bool operator!= (const fraction &lhs, int rhs)
{
  return lhs.decimal() != rhs;
}
bool operator>= (const fraction &lhs, int rhs)
{
  return lhs.decimal() >= rhs;
}
bool operator<= (const fraction &lhs, int rhs)
{
  return lhs.decimal() <= rhs;
}
bool operator> (const fraction &lhs, int rhs)
{
  return lhs.decimal() > rhs;
}
bool operator< (const fraction &lhs, int rhs)
{
  return lhs.decimal() == rhs;
}
ostream & operator<< (ostream &os, const fraction &f)
{
    fraction temp = f.absval();
    int numer = f.numerator();
    int denom = f.denominator();
    if((!((numer > 0 && denom > 0)    // This extremely complex and seemingly
       || (numer < 0 && denom < 0)))  // useless if statement tests to see if
            && f != 0)                    // fraction f is negative.
    os << '-';
    if(temp.numerator() == 0 || temp.denominator() == 1)
        os << temp.numerator();
    else
        os << temp.numerator() << '/' << temp.denominator();
return os;
 }

istream & operator>> (istream &is, fraction &f) //    is:输入流,f:待输入的分数
{
    int newnum, newden;
    char slash = ' ';
    do
    {
        is >> newnum >> slash >> newden;
    } while(slash != '/');
    f.setnum(newnum);
    f.setden(newden);
    return is;
}
//    将分数f按整数,真分数格式输出到流os
void PrintAsMixed(ostream &os, const fraction &f)
{
  int wholePart = f.numerator() / f.denominator();
  fraction fracPart = f - wholePart;

  if(wholePart != 0)
    cout << wholePart << " ";
  if(fracPart != 0)
    cout << fracPart;
}
// Fractions class - implementation file--分数类执行文件结束*/
//    分数计算测试程序    
#include <iostream.h>
#include <conio.h>
#include "fraction.h"
int main()
{
    fraction f1; 
    fraction f2;   int i;
 // clrscr();  //利用>>重载输入f1,f2
  cout << "First fraction:\n";
  cin >> f1;
  cout << "\nSecond fraction:\n";
    cin >> f2;
  cout << "\nEnter an integer\n";
  cin >> i;
  f1.simplify();
  f2.simplify();
   fraction sum  = f1 + f2; 
  fraction diff = f1 - f2;
  fraction prod = f1 * f2;
  fraction quot;
  if(f2 != 0)
    quot = f1 / f2;//输出小数运算结果
  cout << f1 << " in decimal form is "  << f1.decimal() << '\n';
    cout << f2 << " in decimal form is "  << f2.decimal() << "\n\n";//利用<<重载输出运算结果
  cout << f1 << " + " << f2 << " = " << sum  << " (" <<  sum.decimal() << ")\n";
    cout << f1 << " - " << f2 << " = " << diff << " (" << diff.decimal() << ")\n";
  cout << f1 << " * " << f2 << " = " << prod << " (" << prod.decimal() << ")\n";
  cout << f1 << " / " << f2 << " = ";
  if(f2 != 0)
    cout << quot << " (" << quot.decimal() << ")\n\n";
  else
    cout << "Undefined!\n\n";
//进行分数(f1)和整数(i)的四则运算并输出结果                  
  cout << f1 << " + " << i << " = " << f1 + i << "\n";
  cout << f1 << " - " << i << " = " << f1 - i << "\n";
  cout << f1 << " * " << i << " = " << f1 * i << "\n";
    cout << f1 << " / " << i << " = ";
  if(i != 0)
    cout << f1 / i << "\n\n";
  else
    cout << "Undefined!\n\n";
  cout << "Boolean operator tests (1 = true, 0 = false)\n";
  cout << f1 << " == " << f2 << ": " << (f1 == f2) << '\n';
  cout << f1 << " != " << f2 << ": " << (f1 != f2) << '\n';
  cout << f1 << " >= " << f2 << ": " << (f1 >= f2) << '\n';
  cout << f1 << " <= " << f2 << ": " << (f1 <= f2) << '\n';
  cout << f1 << " >  " << f2 << ": " << (f1 >  f2) << '\n';
  cout << f1 << " <  " << f2 << ": " << (f1 <  f2) << "\n\n";
  double dec1 = f1.decimal();
  double dec2 = f2.decimal();
  if(dec1 > 1 && (int(dec1) != dec1))
  {
    cout << f1 << " as a mixed number is ";
    PrintAsMixed(cout, f1);
    cout << '\n';
  }
  if(dec2 > 1 && (int(dec2) != dec2))
  {
    cout << f2 << " as a mixed number is ";
    PrintAsMixed(cout, f2);
  }
    getch();
    return 0;
}
这个是原先的分数计算器,但是不能实现分数的混合运算
哪位C狂人指导下下如何加以改进
谢谢!!!