C++大一结课作业
反正我留着也没用
造福同学校的人,就发出来了
我这个比作业要求的功能好点,能算两个以上的数
本人初学者能力有限,大佬轻喷(不是)
#include <iostream>
#include <string>
#include <map>
#include <algorithm>
#include <vector>
#include <windows.h>
using namespace std;
class Fraction {
friend Fraction operator+(const Fraction &frac1, const Fraction &frac2); //重载+运算符
friend Fraction operator-(const Fraction &frac1, const Fraction &frac2); //重载-运算符
friend Fraction operator*(const Fraction &frac1, const Fraction &frac2); //重载*运算符
friend Fraction operator/(const Fraction &frac1, const Fraction &frac2); //重载/运算符
friend bool operator==(Fraction frac1, Fraction frac2); //重载==运算符
friend bool operator>(const Fraction &frac1, const Fraction &frac2); //重载>运算符
friend bool operator<(const Fraction &frac1, const Fraction &frac2); //重载<运算符
friend ostream &operator<<(ostream &out, const Fraction &frac); //重载<<运算符
friend istream &operator>>(istream &in, Fraction &frac); //重载>>运算符
friend void sortFraction();//对分数数组排序
public:
Fraction(); //无参造函数
Fraction(int n, int d); //带参造函数
Fraction(const Fraction &f); //复制造函数
void setFraction(int n, int d); //设置分数的分子和分母
int getNumer(); //获取分数的分子
int getDeno(); //获取分数的分母
void RdcFrc(); //当前分数约分
private:
int numer; //分子
int deno; //分母
};
void callwrong() {
cin.clear();
cin.ignore(1024, '\n');
cout << "你输入了个什么玩意?\n";
Sleep(1000);
cout << "重来!";
Sleep(500);
system("cls");
}
Fraction::Fraction() : numer(0), deno(1) {//无参造函数
}
Fraction::Fraction(int n, int d) : numer(n), deno(d) { //带参造函数
}
Fraction::Fraction(const Fraction &f) : numer(f.numer), deno(f.deno) { //复制造函数
}
void Fraction::setFraction(int n, int d) {//设置分数的分子和分母
numer = n;
deno = d;
}
int Fraction::getNumer() {
return numer;
}//获取分数的分子
int Fraction::getDeno() {
return deno;
}//获取分数的分母
//当前分数约分
void Fraction::RdcFrc() {
if (numer == 0)
deno = 1;
if (deno < 0) {
deno = -deno;
numer = -numer;
}
for (int i = 2; deno * numer != 0 && (i <= deno && i <= numer); i++ ) {
if (!(deno % i) && !(numer % i)) {
deno /= i;
numer /= i;
i = 1;
}
}
}
//重载<<运算符
ostream &operator<<(ostream &out, const Fraction &frac) {//重载<<运算符
if (frac.numer == 0) {
cout << 0;
} else
cout << frac.numer << '/' << frac.deno;
return out;
}
//重载>>运算符
istream &operator>>(istream &in, Fraction &frac) {
char ch;
in >> frac.numer >> ch >> frac.deno;
if (ch != '/')
in.setstate(ios::failbit);
return in;
/* int condition = 0;
if (cin >> frac.numer){
if (cin.get() == '/')
if (cin >> frac.deno) {
// 如果分母为零,提示用户重新输入,或者抛出一个异常
if (frac.deno == 0) {
return in;
}
return in;
}
}
throw invalid_argument("Invalid fraction ");
frac.numer = prenumer;
frac.deno = predeno;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
return in;*/
}
//重载+运算符
Fraction operator+(const Fraction &frac1, const Fraction &frac2) {
Fraction frac3;
frac3.deno = frac1.deno * frac2.deno;
frac3.numer = frac1.numer * frac2.deno + frac2.numer * frac1.deno;
frac3.RdcFrc();
return frac3;
}
//重载-运算符
Fraction operator-(const Fraction &frac1, const Fraction &frac2) {
Fraction frac3;
frac3.deno = frac1.deno * frac2.deno;
frac3.numer = frac1.numer * frac2.deno - frac2.numer * frac1.deno;
frac3.RdcFrc();
return frac3;
}
//重载*运算符
Fraction operator*(const Fraction &frac1, const Fraction &frac2) {
Fraction frac3;
frac3.deno = frac1.deno * frac2.deno;
frac3.numer = frac1.numer * frac2.numer;
frac3.RdcFrc();
return frac3;
}
//重载/运算符
Fraction operator/(const Fraction &frac1, const Fraction &frac2) {
Fraction frac3;
frac3.deno = frac1.deno * frac2.numer;
frac3.numer = frac1.numer * frac2.deno;
frac3.RdcFrc();
return frac3;
}
//重载==运算符
bool operator==(Fraction frac1, Fraction frac2) {
frac1.RdcFrc();
frac2.RdcFrc();
return ((frac1.deno == frac2.deno) && (frac1.numer == frac2.numer));
}
//重载>运算符
bool operator>(const Fraction &frac1, const Fraction &frac2) {
Fraction frac3 = frac1 - frac2;
return (frac3.numer > 0);
}
//重载<运算符
bool operator<(const Fraction &frac1, const Fraction &frac2) {
Fraction frac3 = frac1 - frac2;
return (frac3.numer < 0);
}
//对分数数组排序
bool sortfrac(Fraction frac1, Fraction frac2) {
if ( (frac1.getNumer() * frac2.getDeno()) < (frac2.getNumer() * frac1.getDeno()) )
return 1;
else
return 0;
}
void sortFraction(vector<Fraction> &f0) {
sort(f0.begin(), f0.end(), sortfrac);
}
int main() {
char condition = '0';
while (1) {
//开始界面
while (condition == '0') {
cout << "给我选择选一个功能(输入1或2,tmd别乱输)\n"
<< "1.分数计算\n"
<< "2.分数排序\n"
<< "_\b";
cin >> condition;
cin.ignore(1024, '\n');
system("cls");
}
//分数计算
while (condition == '1') {
cout << "请输入一个分数计算式用符号=结尾(如1/2+1/3=回车),输入#返回上一层目录\n";
vector<Fraction> f0(1);
bool cdt = 1;//判断是否输入正确的中间参数
char ch;
if (cin >> f0[0]) { // 尝试从 cin 读取一个 Fraction 类型的值
// 成功输入分数!!进行分数计算等操作
Fraction fr(f0[0]);
for (int i = 1; 1; i++) {
if (cin.get( ch)) {
f0.push_back(Fraction());
if (ch == '+') { //加法
//成功输入下一个数
if (cin >> f0[i]) {
fr = fr + f0[i];
}
//乱输入下一个数
else {
cdt = 0;
break;
}
} else if (ch == '-') { //减法
if (cin >> f0[i]) {
fr = fr - f0[i];
} else {
cdt = 0;
break;
}
} else if (ch == '*') { //乘法
if (cin >> f0[i]) {
fr = fr * f0[i];
} else {
cdt = 0;
break;
}
} else if (ch == '/') { //除法
if (cin >> f0[i]) {
fr = fr / f0[i];
} else {
cdt = 0;
break;
}
} else if (ch == '=') { //换行输出结果
break;
} else { //乱输符号
cdt = 0;
break;
}
}
}
//输出结果
if (cdt)
cout << "答案为: " << fr << endl << endl;
else
callwrong();
//一开始就错了
} else {
cin.clear(); // 清除输入缓冲区中的错误状态,极为重要!!!!!!!!!
//此时不能ignore,因为要保留#符号来读取
if (cin.get() == '#') {
condition = '0';
system("cls");
} else {
system("cls");
callwrong();
}
}
}
//分数排序
while (condition == '2') {
cout << "请输入一组分数,用逗号隔开,如需由小到大排序用符号<结尾,由大到小排序用符号>结尾(如1/2,1/4,3/5<回车)\n输入#号键返回上一层目录:\n";
vector<Fraction> f0(1);
bool cdt = 1;//判断是否输入正确的中间参数
char ch;
bool biger;
if (cin >> f0[0]) {
Fraction ft;
for (int i = 1; 1; i++) {
if (cin.get(ch)) {
if (ch == ',') {
// f0.push_back(Fraction());
if (cin >> ft) {
f0.push_back(ft);
} else {
cdt = 0;
break;
}
} else if (ch == '<') {
biger = 1;
break;
} else if (ch == '>') {
biger = 0;
break;
} else {
cdt = 0;
break;
}
}
}
//输出排序结果
if (cdt) {
sortFraction(f0);
cout << "排序后的结果为:";
//从小到大
if (biger) {
for (auto it = f0.begin(); it != f0.end(); it++ ) {
if (it == f0.end() - 1)
cout << *it;
else {
if (*it == *(it + 1)) {
cout << *it << " = ";
} else {
cout << *it << " < ";
}
}
}
}
//从大到小
else {
for (auto it = f0.rbegin(); it != f0.rend(); it++) {
if (it == f0.rend() - 1)
cout << *it;
else {
if (*it == *(it + 1)) {
cout << *it << " = ";
} else {
cout << *it << " > ";
}
}
}
}
cout << endl << endl;
} else {
system("cls");
callwrong();
}
} else {
cin.clear(); // 清除输入缓冲区中的错误状态,极为重要!!!!!!!!!
//此时不能ignore,因为要保留#符号来读取
if (cin.get() == '#') {
condition = '0';
system("cls");
} else {
system("cls");
callwrong();
}
}
}
if (condition != '0' && condition != '1' && condition != '2') {
condition = '0';
callwrong();
}
}
return 0;
}