主题:[讨论]求助C狂人...
/* 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狂人指导下下如何加以改进
谢谢!!!
#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狂人指导下下如何加以改进
谢谢!!!