????????该代码为基于c++实现分数类,是我大学oop课程的一个小作业,目前我并不很熟练编程,想通过分享的方式来让大佬们对这个代码提出一些修改建议。
? ? ? ? 该分数类的将分子和分母设置为int类型,将正负号设置为char类型,然后在共有部分为该类提供了取负运算、倒数运算、约分、小数转分数、字符串转分数,加减乘除,关系判断运算,输出等功能。
#include "iostream"
#include "math.h"
using namespace std;
class fraction { //分数类
public:
//构造函数部分
fraction() {sign = '+'; nu = 0; de = 1; } //构造函数,无参数
fraction(int _nu, int _de = 1); //构造函数,正常输入,默认分母为1
fraction(double _nu, double _de = 1, int n = 5) { DtoF(_nu, _de, n); } //构造函数,double情况,默认分母为1,默认精度为1e-5
fraction(string x) {StoF(x); }; //构造函数,字符串情况
//输出功能部分
void printint() { cout << sign << nu << "/" << de; } //输出分数
void printdouble() { cout << sign << double(nu) / de; }//输出小数
//单目运算部分
void Inverse() { sign == '+' ? sign = '-' : sign = '+'; } //取负运算
void Reciprocal() { int t; t = nu; nu = de; de = t; } //求倒数功能
int CommonDivisor(int a, int b);//求最大公约数功能
int Reduction(); //约分功能
void DtoF(double x, double _de, int n );//将double转换为分数
void StoF(string x);//将字符串转换为分数
//双目算数运算部分
fraction operator+(fraction a);//加法
fraction operator-(fraction a);//减法
fraction operator*(fraction a);//乘法
fraction operator/(fraction a);//除法
//双目关系运算部分
bool operator>(fraction a);
bool operator<(fraction a);
bool operator>=(fraction a);
bool operator<=(fraction a);
bool operator==(fraction a);
bool operator!=(fraction a);
private:
int nu, de;//分子和分母
char sign='+';//正负号
};
fraction::fraction(int _nu, int _de)//构造函数,正常输入
{
if (_de == 0) //若输入分母为0,则分数不合法,暂停程序
{
cout << "Illegal fraction:"<<_nu<<"/"<<_de;
system("pause");
}
if (_nu * _de < 0) sign = '-'; //若分子分母异号,则分数为负
nu = abs(_nu); de = abs(_de); //存入的分子分母皆为正数
Reduction();
}
int fraction::CommonDivisor(int a, int b)//利用辗转相除法求最大公约数
{
int t;
if (a < b) // 交换两个数,使大数放在a的位置上。
{
t = a;
a = b;
b = t;
}
while (b != 0)// 利用辗转相除法,直到b为0为止。
{
t = a % b;
a = b;
b = t;
}
return a;
}
int fraction::Reduction() //约分功能
{
int cd;
if (nu == de) { nu = 1; de = 1; }//分子分母相等,直接约分为1
else if (nu == 0) { de = 1; return 0; }//分子为0,则不须约分,将分母置为1,结束函数
else if (nu == 1 || nu == 0 ) { return 0; }//分子分母有一个为1或分子为0,则不需要约分直接结束函数
else if (nu % de == 0) { nu /= de; de = 1; }//分母为分子的因数
else if (de % nu == 0) { de /= nu; nu = 1; }//分子为分母的因数
else
{
cd = CommonDivisor(nu, de);//求分子和分母的最大公约数
nu /= cd; de /= cd;
}
return 0;
}
void fraction::DtoF(double _nu, double _de, int n)//将double转换为分数
{
de = 1;
double x = _nu / _de;
if (x < 0) { sign = '-'; x = -x; }//若x<0,则修改符号
nu = x * pow(10, n);
de *= pow(10, n);
Reduction();
}
void fraction::StoF(string x)//将字符串转换为分数
{
int i=0,n=0; nu = 1, de = 1;//如果不给出分母或分子,则默认为1
if (x[0] == '-') { sign = '-'; i++; n = i; }//如果有负号,则将符号设置为负
else if (x[0] == '+') { i++; n = i; }//如果有正号,则跳过
for (; x[i] != '/' && x[i] != '\0'; i++)//转换分子
{
if (i == n) nu--;//如果给出了分子,则将nu置为0
if (i != n) nu *= 10;
nu += (x[i] - '0');
}
n = i;//记录此时的i
for (; x[i] != '\0'; i++)//转换分母
{
if (i != n) de *= 10;
de += (x[i] - '0');
}
}
fraction fraction::operator+(fraction a)//加法
{
fraction sum; int cde,nu1,nu2;
sum.sign = sign;
sum.de = de;
if (de != a.de)//若分母不相等,则先通分
{
cde = de * a.de / CommonDivisor(de, a.de);//求两个分母的最小公倍数
sum.de = cde;//分母等于最小公倍数
nu1 = nu * cde / de;
nu2 = a.nu * cde / a.de;
}
sign == a.sign ? sum.nu = nu1 + nu2 : sum.nu = nu1 - nu2;
if (sum.nu < 0)//若分子为负,则修改结果的符号,并将分子置为正数
{
sum.Inverse();
sum.nu *= -1;
}
sum.Reduction();
return sum;
}
fraction fraction::operator-(fraction a)//减法
{
fraction result, b = a;
b.Inverse();//构造一个新的a的相反数,与前项相加
result = operator+(b);
return result;
}
fraction fraction::operator*(fraction a)//乘法
{
fraction result;
result.nu = nu * a.nu;
result.de = de * a.de;
if (sign != a.sign) result.sign = '-';//若两分数异号,则置为负
result.Reduction();
return result;
}
fraction fraction::operator/(fraction a)//除法
{
fraction result, b = a;
b.Reciprocal();//构建一个新的倒数
result = operator*(b);
return result;
}
bool fraction::operator>(fraction a)
{
if (sign != a.sign)//若异号,则正数一定大
{
if (sign == '+')return true;
else return false;
}
if (de == a.de)//若分母相同,直接比较
{
return nu > a.nu;
}
//若不同则转换为小数对比
return (double(nu) / de) > (double(a.nu) / a.de);
}
bool fraction::operator<(fraction a)
{
if ((sign == a.sign) && (nu == a.nu) && (de == a.de)) return false;//若相等,直接返回0
else return !operator>(a);//返回大于的相反结果
}
bool fraction::operator>=(fraction a)
{
if ((sign == a.sign) && (nu == a.nu) && (de == a.de)) return true;//若相等,直接返回1
else return operator>(a);//返回大于的结果
}
bool fraction::operator<=(fraction a)
{
if ((sign == a.sign) && (nu == a.nu) && (de == a.de)) return true;//若相等,直接返回1
else return operator<(a);//返回小于的结果
}
bool fraction::operator==(fraction a)
{
return ((sign == a.sign) && (nu == a.nu) && (de == a.de));
}
bool fraction::operator!=(fraction a)
{
return !((sign == a.sign) && (nu == a.nu) && (de == a.de));
}
|