C++分数计算器(课程作业)

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;
}
  • 14
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值