这是学校作业,做了就直接发上来了。
可以根据自己需要改。
#include<iostream>
#include<string>
#include<vector>
#include<functional>
#include<algorithm>
using namespace std;
class Fraction
{
public:
//无参造函数
Fraction() : numer(0), deno(1)
{
}
//带参造函数
Fraction(int n, int d) : numer(n), deno(d)
{
if (d == 0)
{
cerr << "The deno can't be zero!" << endl;
exit(-1);
}
}
//复制造函数
Fraction(const Fraction& f) : numer(f.numer), deno(f.deno)
{
}
//设置分数的分子和分母
void setFraction(int n, int d)
{
numer = n;
deno = d;
}
//获取分数的分子
int getNumer()
{
return numer;
}
//获取分数的分母
int getDeno()
{
return deno;
}
//获取最大公约数
int Gcd(int numer, int deno) const
{
if (deno == 0) return numer;
return Gcd(deno, numer % deno);
}
//当前分数约分
void RdcFrc()
{
int share = Gcd(numer, deno);
if (share != 0)
{
deno /= share;
numer /= share;
}
else
{
cerr << "Failed to execute RdcFrc." << endl;
exit(-1);
}
}
private:
int numer; //分子
int deno; //分母
//重载+运算符
friend Fraction operator+(const Fraction& frac1, const Fraction& frac2)
{
Fraction result;
result.numer = frac1.numer * frac2.deno + frac2.numer * frac1.deno;
result.deno = frac1.deno * frac2.deno;
result.RdcFrc();
return result;
}
friend Fraction operator-(const Fraction& frac1, const Fraction& frac2) //重载-运算符
{
Fraction result;
result.numer = frac1.numer * frac2.deno - frac2.numer * frac1.deno;
result.deno = frac1.deno * frac2.deno;
result.RdcFrc();
return result;
}
friend Fraction operator*(const Fraction& frac1, const Fraction& frac2) //重载*运算符
{
Fraction result;
result.numer = frac1.numer * frac2.numer;
result.deno = frac1.deno * frac2.deno;
result.RdcFrc();
return result;
}
friend Fraction operator/(const Fraction& frac1, const Fraction& frac2) //重载/运算符
{
Fraction result;
result.numer = frac1.numer * frac2.deno;
result.deno = frac1.deno * frac2.numer;
// 除以0的情况
result.RdcFrc();
return result;
}
friend bool operator==(const Fraction& frac1, const Fraction& frac2) //重载==运算符
{
Fraction _frac1 = frac1;
Fraction _frac2 = frac2;
_frac1.RdcFrc();
_frac2.RdcFrc();
return (_frac1.numer == _frac2.numer && _frac1.deno == _frac2.deno);
}
friend bool operator>(const Fraction& frac1, const Fraction& frac2) //重载>运算符
{
return (double(frac1.numer) / frac1.deno > double(frac2.numer) / frac2.deno);
}
friend bool operator<(const Fraction& frac1, const Fraction& frac2) //重载<运算符
{
return (double(frac1.numer) / frac1.deno < double(frac2.numer) / frac2.deno);
}
friend ostream& operator<<(ostream& out, const Fraction& frac) //重载<<运算符
{
cout << frac.numer << '/' << frac.deno;
return out;
}
friend istream& operator>>(istream& in, Fraction& frac) //重载>>运算符
{
char split; // 分数线
in >> frac.numer >> split >> frac.deno;
// 检查分母 分数线'/'
return in;
}
//friend void sortFraction(参数列表自行设计);//对分数数组排序
friend void new_sort(vector<Fraction>& vec, char sign)
{
if (sign == '>')
{
sort(vec.begin(), vec.end(), greater<>());
}
else
{
sort(vec.begin(), vec.end(), less<>());
}
}
}; // class Fraction
void jiemian1()
{
while (1)
{
cout << "请输入分数计算式(如1/2+1/3回车),输入#号键返回上一层目录:" << endl;
char ex1;
char sign;
Fraction frac1, frac2;
cin >> frac1 >> sign >> frac2;
while (cin.fail()) {
cin.clear();
if (cin.peek() == '#')
{
getchar();
system("cls");
return;
}
cin.ignore(INT_MAX, '\n');
cout << "输入错误!请重新输入:" << endl;
cin >> frac1 >> sign >> frac2;
}
// 应该判断有没有fail再clear
// 如果输入# cin::failbit变为true,输入被跳过,clear函数恢复该属性
Fraction result;
if (sign == '+')
{
result = frac1 + frac2;
}
else if (sign == '-')
{
result = frac1 - frac2;
}
else if (sign == '*')
{
result = frac1 * frac2;
}
else if (sign == '/')
{
result = frac1 / frac2;
}
cout << "=" << result << endl;
}
}
void jiemian2()
{
while (1)
{
cout << "请输入一组分数,用逗号隔开,如需由小到大排序用符号<结尾,由大到小排序用符号>结尾(如1/2,1/4,3/5<回车),输入#号键返回上一层目录:" << endl;
vector<Fraction> vec;
Fraction tmp;
char sign;
while (1)
{
cin >> tmp >> sign;
while (cin.fail() || (sign != ','&&sign != '>'&&sign != '<'))
{
cin.clear();
if (cin.peek() == '#')
{
getchar();
system("cls");
return;
}
cout << "输入错误!请重新输入:" << endl;
cin.ignore(INT_MAX, '\n');
cin >> tmp >> sign;
}
vec.push_back(tmp);
if (sign == '>' || sign == '<')
{
break;
}
}
new_sort(vec, sign);
for (auto& item : vec)
{
cout << item << ' ';
}
cout << endl;
}
}
void jiemian()
{
while (1)
{
cout << "1. 分数运算" << endl;
cout << "2. 分数排序" << endl;
int c1;
cin >> c1;
while (cin.fail()) {
cout << "输入错误!请重新输入:" << endl;
cin.clear();
void jiemian();
cin.ignore(INT_MAX, '\n');
cin >> c1;
}
if (c1 == 1)
{
system("cls");
jiemian1();
}
else if (c1 == 2)
{
system("cls");
jiemian2();
}
else
{
break;
}
}
}
int main()
{
while (1)
{
system("cls");
jiemian();
}
return 0;
}