0
回答
Visual C++ 無小數四則運算整合計數機1.0(求高手大大指點)
华为云数据库免费试用   

 

// calculator.cpp: 定義主控台應用程式的進入點。
//

//有沒有bug , 可改善的地方 ?

#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <conio.h>
#include <string>
#include <math.h>

using namespace std;

#define ShowFixStep true
#define ShowStep true

HANDLE hConsole;

void PrintfStringWithColor(string str, int indes, int extra);//顯示改了的地方
int FindSymbolBR(string s, int indes);//根據先乘除後加減的方法找符號。
int ResultOfFormula(string s, int indes);//計算答案。
int GetNextNumber(string s, int indes);//找符號後的數字。(indes 是符號位置)
int GetPreviousNumber(string s, int indes);//找符號前的數字。(indes 是符號位置)
int FindSymbol(string s, int indes, int add);// 找符號, add 是方向。
bool Fix(string *s);//處理一些 "1--2" , "1*-2" 之類的問題 。 遇到不合理的 ,例如 : "1+*5" , "1**5" 之類的情況會返回 false。

int main()
{
	hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hConsole, 15);
	string formula;
	int indes, result, FirstValue, SecondValue;
	cout << "  ";
	cin >> formula;
	if (!Fix(&formula)) {
		_getch();
		return 0;
	}
	while((indes = FindSymbolBR(formula, 1)) > 0)
	{
		result = ResultOfFormula(formula, indes);
		FirstValue = FindSymbol(formula, indes - 1, -1) + 1;
		SecondValue = FindSymbol(formula, indes + 1, 1) - FirstValue;
		formula.replace(FirstValue, SecondValue, to_string(result));
		if (ShowStep) {
			cout << " =" << formula<<"\n";
		}
		if (!Fix(&formula)) {
			_getch();
			return 0;
		}
	}
	if (!ShowStep) {
		cout << " =" << formula << "\n";
	}
	_getch();
    return 0;
}

int FindSymbol(string s, int indes, int add) {
		for (int i = indes; (add > 0) * (i < s.size()) || (add < 0) * (i > 0); i += add) 
					if (s[i] == '*' || s[i] == '/' || s[i] == '+' || s[i] == '-') 
						return i;
	return -1 + (add > 0) * (s.size() + 1);
}

bool Fix(string* str)
{
	for (int i = 0; i < (*str).size(); i++) {
		if ((*str)[i] >= '0' && (*str)[i] <= '9')
			continue;
		switch ((*str)[i])
		{
		case '+':
			switch ((*str)[i + 1])
			{ 
			case '+':
				(*str).replace(i, 2, "+");
				if (ShowFixStep) {
					cout << "==";
					PrintfStringWithColor(*str, i, -1);
					cout << endl;
				}
				return Fix(str);
			case '-':
				(*str).replace(i, 2, "-");
				if (ShowFixStep) {
					cout << "==";
					PrintfStringWithColor(*str, i, -1);
					cout << endl;
				}
				return Fix(str);
			case '*':
			case '/':
				cout << "\n[ERROR !] :: [";
				PrintfStringWithColor(*str, i, i + 1);
				cout << "]\n";
				return false;
			}
			break;
		case '-':
			switch ((*str)[i + 1]) {
			case '+':
				(*str).replace(i, 2, "-");
				if (ShowFixStep) {
					cout << "==";
					PrintfStringWithColor(*str, i, -1);
					cout << endl;
				}
				return Fix(str);
			case '-':
				(*str).replace(i, 2, "+");
				if (ShowFixStep) {
					cout << "==";
					PrintfStringWithColor(*str, i, -1);
					cout << endl;
				}
				return Fix(str);
			case '*':
			case '/':
				cout << "\n[ERROR !] :: \n[";
				PrintfStringWithColor(*str, i, i + 1);
				cout << "]\n";
				return false;
			}
			break;
		case '*':
			switch ((*str)[i + 1])
			{
			case '-':
				(*str).replace(i, 2, "*");
				(*str).insert(FindSymbol((*str), i - 1, -1) + 1, "-");
				if (ShowFixStep) {
					cout << "==";
					PrintfStringWithColor(*str, i + 1, FindSymbol((*str), i - 1, -1));
					cout << endl;
				}
				return Fix(str);
			case '+':
				(*str).replace(i, 2, "*");
				if (ShowFixStep) {
					cout << "==";
					PrintfStringWithColor(*str, i, -1);
					cout << endl;
				}
				return Fix(str);
			case '*':
			case '/':
				cout << "\n[ERROR !] :: \n[";
				PrintfStringWithColor(*str, i, i + 1);
				cout << "]\n";
				return false;
			}
		case '/':
			switch ((*str)[i + 1]) {
			case '+':
				(*str).replace(i, 2, "/");
				if (ShowFixStep) {
					cout << "==";
					PrintfStringWithColor(*str, i, -1);
					cout << endl;
				}
				return Fix(str);
			case '-':
				(*str).replace(i, 2, "/");
				(*str).insert(FindSymbol((*str), i - 1, -1), "-");
				if (ShowFixStep) {
					cout << "==";
					PrintfStringWithColor(*str, i + 1, FindSymbol((*str), i - 1, -1));
					cout << endl;
				}
				return Fix(str);
			case '*':
			case '/':
				cout << "\n[ERROR !] :: \n[";
				PrintfStringWithColor(*str, i, i + 1);
				cout << "]\n";
				return false;
			}
		}
	}
	return true;
}

int FindSymbolBR(string s, int indes) {
	for (int i = indes; i < s.size(); i ++)
		if (s[i] == '*' || s[i] == '/')
			return i;
	for (int i = indes; i < s.size(); i++)
		if (s[i] == '+' || s[i] == '-')
			return i;
	return -1;
}

int GetNextNumber(string s, int indes) {
	string number;
	int FirstValue, SecondValue;
	FirstValue = indes + 1;
	SecondValue = FindSymbol(s, indes + 1, 1) - FirstValue;
	number.assign(s, FirstValue, SecondValue);
	return atoi(number.c_str());
}

int GetPreviousNumber(string s, int indes) {
	string number;
	int FirstValue, SecondValue;
	FirstValue = FindSymbol(s, indes - 1, -1) + 1;
	if (FirstValue == 1 && s[0] == '-') {
		FirstValue = 0;
	}
	SecondValue = indes - FirstValue;
	number.assign(s, FirstValue, SecondValue);
	return atoi(number.c_str());
}

int ResultOfFormula(string s, int indes) {
	switch (s[indes])
	{
	case '+':
		return GetNextNumber(s, indes) + GetPreviousNumber(s, indes);
	case '-':
		return GetPreviousNumber(s, indes) - GetNextNumber(s, indes);
	case '*':
		return GetPreviousNumber(s, indes) * GetNextNumber(s, indes);
	case '/':
		return round(double(GetPreviousNumber(s, indes)) / double(GetNextNumber(s, indes)));
	}
}

void PrintfStringWithColor(string str, int indes, int extra) {
	if (indes < 0 || indes > str.size())
		return;
	SetConsoleTextAttribute(hConsole, 9);
	for (int i = 0; i < str.size(); i++) {
		if (i == indes || i == extra) {
			SetConsoleTextAttribute(hConsole, 10);
			cout << str[i];
			SetConsoleTextAttribute(hConsole, 9);
		}
		else {
			cout << str[i];
		}
	}
	SetConsoleTextAttribute(hConsole, 15);
	return;
}


/*

例如輸入 :-167108179*-611099442*-231188420--56186772+472484098--153343897*-52085412+63080084+-266652234+-147257418--363700094+-156006620--3503601+99910492-546456852--528329731*-232807055+-43962117-270819652*299423951*12796984+65743600+-369178113+76719488+148059023*523113408--336583949


輸出 : 

  ==--167108179*611099442*-231188420--56186772+472484098--153343897*-52085412+63080084+-266652234+-147257418--363700094+-156006620--3503601+99910492-546456852--528329731*-232807055+-43962117-270819652*299423951*12796984+65743600+-369178113+76719488+148059023*523113408--336583949
==+167108179*611099442*-231188420--56186772+472484098--153343897*-52085412+63080084+-266652234+-147257418--363700094+-156006620--3503601+99910492-546456852--528329731*-232807055+-43962117-270819652*299423951*12796984+65743600+-369178113+76719488+148059023*523113408--336583949
==+167108179*-611099442*231188420--56186772+472484098--153343897*-52085412+63080084+-266652234+-147257418--363700094+-156006620--3503601+99910492-546456852--528329731*-232807055+-43962117-270819652*299423951*12796984+65743600+-369178113+76719488+148059023*523113408--336583949
==-+167108179*611099442*231188420--56186772+472484098--153343897*-52085412+63080084+-266652234+-147257418--363700094+-156006620--3503601+99910492-546456852--528329731*-232807055+-43962117-270819652*299423951*12796984+65743600+-369178113+76719488+148059023*523113408--336583949
==-167108179*611099442*231188420--56186772+472484098--153343897*-52085412+63080084+-266652234+-147257418--363700094+-156006620--3503601+99910492-546456852--528329731*-232807055+-43962117-270819652*299423951*12796984+65743600+-369178113+76719488+148059023*523113408--336583949
==-167108179*611099442*231188420+56186772+472484098--153343897*-52085412+63080084+-266652234+-147257418--363700094+-156006620--3503601+99910492-546456852--528329731*-232807055+-43962117-270819652*299423951*12796984+65743600+-369178113+76719488+148059023*523113408--336583949
==-167108179*611099442*231188420+56186772+472484098+153343897*-52085412+63080084+-266652234+-147257418--363700094+-156006620--3503601+99910492-546456852--528329731*-232807055+-43962117-270819652*299423951*12796984+65743600+-369178113+76719488+148059023*523113408--336583949
==-167108179*611099442*231188420+56186772+472484098+-153343897*52085412+63080084+-266652234+-147257418--363700094+-156006620--3503601+99910492-546456852--528329731*-232807055+-43962117-270819652*299423951*12796984+65743600+-369178113+76719488+148059023*523113408--336583949
==-167108179*611099442*231188420+56186772+472484098-153343897*52085412+63080084+-266652234+-147257418--363700094+-156006620--3503601+99910492-546456852--528329731*-232807055+-43962117-270819652*299423951*12796984+65743600+-369178113+76719488+148059023*523113408--336583949
==-167108179*611099442*231188420+56186772+472484098-153343897*52085412+63080084-266652234+-147257418--363700094+-156006620--3503601+99910492-546456852--528329731*-232807055+-43962117-270819652*299423951*12796984+65743600+-369178113+76719488+148059023*523113408--336583949
==-167108179*611099442*231188420+56186772+472484098-153343897*52085412+63080084-266652234-147257418--363700094+-156006620--3503601+99910492-546456852--528329731*-232807055+-43962117-270819652*299423951*12796984+65743600+-369178113+76719488+148059023*523113408--336583949
==-167108179*611099442*231188420+56186772+472484098-153343897*52085412+63080084-266652234-147257418+363700094+-156006620--3503601+99910492-546456852--528329731*-232807055+-43962117-270819652*299423951*12796984+65743600+-369178113+76719488+148059023*523113408--336583949
==-167108179*611099442*231188420+56186772+472484098-153343897*52085412+63080084-266652234-147257418+363700094-156006620--3503601+99910492-546456852--528329731*-232807055+-43962117-270819652*299423951*12796984+65743600+-369178113+76719488+148059023*523113408--336583949
==-167108179*611099442*231188420+56186772+472484098-153343897*52085412+63080084-266652234-147257418+363700094-156006620+3503601+99910492-546456852--528329731*-232807055+-43962117-270819652*299423951*12796984+65743600+-369178113+76719488+148059023*523113408--336583949
==-167108179*611099442*231188420+56186772+472484098-153343897*52085412+63080084-266652234-147257418+363700094-156006620+3503601+99910492-546456852+528329731*-232807055+-43962117-270819652*299423951*12796984+65743600+-369178113+76719488+148059023*523113408--336583949
==-167108179*611099442*231188420+56186772+472484098-153343897*52085412+63080084-266652234-147257418+363700094-156006620+3503601+99910492-546456852+-528329731*232807055+-43962117-270819652*299423951*12796984+65743600+-369178113+76719488+148059023*523113408--336583949
==-167108179*611099442*231188420+56186772+472484098-153343897*52085412+63080084-266652234-147257418+363700094-156006620+3503601+99910492-546456852-528329731*232807055+-43962117-270819652*299423951*12796984+65743600+-369178113+76719488+148059023*523113408--336583949
==-167108179*611099442*231188420+56186772+472484098-153343897*52085412+63080084-266652234-147257418+363700094-156006620+3503601+99910492-546456852-528329731*232807055-43962117-270819652*299423951*12796984+65743600+-369178113+76719488+148059023*523113408--336583949
==-167108179*611099442*231188420+56186772+472484098-153343897*52085412+63080084-266652234-147257418+363700094-156006620+3503601+99910492-546456852-528329731*232807055-43962117-270819652*299423951*12796984+65743600-369178113+76719488+148059023*523113408--336583949
==-167108179*611099442*231188420+56186772+472484098-153343897*52085412+63080084-266652234-147257418+363700094-156006620+3503601+99910492-546456852-528329731*232807055-43962117-270819652*299423951*12796984+65743600-369178113+76719488+148059023*523113408+336583949
 =174570186*231188420+56186772+472484098-153343897*52085412+63080084-266652234-147257418+363700094-156006620+3503601+99910492-546456852-528329731*232807055-43962117-270819652*299423951*12796984+65743600-369178113+76719488+148059023*523113408+336583949
 =390777000+56186772+472484098-153343897*52085412+63080084-266652234-147257418+363700094-156006620+3503601+99910492-546456852-528329731*232807055-43962117-270819652*299423951*12796984+65743600-369178113+76719488+148059023*523113408+336583949
 =390777000+56186772+472484098--1260253180+63080084-266652234-147257418+363700094-156006620+3503601+99910492-546456852-528329731*232807055-43962117-270819652*299423951*12796984+65743600-369178113+76719488+148059023*523113408+336583949
==390777000+56186772+472484098+1260253180+63080084-266652234-147257418+363700094-156006620+3503601+99910492-546456852-528329731*232807055-43962117-270819652*299423951*12796984+65743600-369178113+76719488+148059023*523113408+336583949
 =390777000+56186772+472484098+1260253180+63080084-266652234-147257418+363700094-156006620+3503601+99910492-546456852-1867260845-43962117-270819652*299423951*12796984+65743600-369178113+76719488+148059023*523113408+336583949
 =390777000+56186772+472484098+1260253180+63080084-266652234-147257418+363700094-156006620+3503601+99910492-546456852-1867260845-43962117-1423705596*12796984+65743600-369178113+76719488+148059023*523113408+336583949
 =390777000+56186772+472484098+1260253180+63080084-266652234-147257418+363700094-156006620+3503601+99910492-546456852-1867260845-43962117--1867759840+65743600-369178113+76719488+148059023*523113408+336583949
==390777000+56186772+472484098+1260253180+63080084-266652234-147257418+363700094-156006620+3503601+99910492-546456852-1867260845-43962117+1867759840+65743600-369178113+76719488+148059023*523113408+336583949
 =390777000+56186772+472484098+1260253180+63080084-266652234-147257418+363700094-156006620+3503601+99910492-546456852-1867260845-43962117+1867759840+65743600-369178113+76719488+-538163136+336583949
==390777000+56186772+472484098+1260253180+63080084-266652234-147257418+363700094-156006620+3503601+99910492-546456852-1867260845-43962117+1867759840+65743600-369178113+76719488-538163136+336583949
 =446963772+472484098+1260253180+63080084-266652234-147257418+363700094-156006620+3503601+99910492-546456852-1867260845-43962117+1867759840+65743600-369178113+76719488-538163136+336583949
 =919447870+1260253180+63080084-266652234-147257418+363700094-156006620+3503601+99910492-546456852-1867260845-43962117+1867759840+65743600-369178113+76719488-538163136+336583949
 =-2115266246+63080084-266652234-147257418+363700094-156006620+3503601+99910492-546456852-1867260845-43962117+1867759840+65743600-369178113+76719488-538163136+336583949
 =-2052186162-266652234-147257418+363700094-156006620+3503601+99910492-546456852-1867260845-43962117+1867759840+65743600-369178113+76719488-538163136+336583949
 =1976128900-147257418+363700094-156006620+3503601+99910492-546456852-1867260845-43962117+1867759840+65743600-369178113+76719488-538163136+336583949
 =1828871482+363700094-156006620+3503601+99910492-546456852-1867260845-43962117+1867759840+65743600-369178113+76719488-538163136+336583949
 =-2102395720-156006620+3503601+99910492-546456852-1867260845-43962117+1867759840+65743600-369178113+76719488-538163136+336583949
 =2036564956+3503601+99910492-546456852-1867260845-43962117+1867759840+65743600-369178113+76719488-538163136+336583949
 =2040068557+99910492-546456852-1867260845-43962117+1867759840+65743600-369178113+76719488-538163136+336583949
 =2139979049-546456852-1867260845-43962117+1867759840+65743600-369178113+76719488-538163136+336583949
 =1593522197-1867260845-43962117+1867759840+65743600-369178113+76719488-538163136+336583949
 =-273738648-43962117+1867759840+65743600-369178113+76719488-538163136+336583949
 =-317700765+1867759840+65743600-369178113+76719488-538163136+336583949
 =1550059075+65743600-369178113+76719488-538163136+336583949
 =1615802675-369178113+76719488-538163136+336583949
 =1246624562+76719488-538163136+336583949
 =1323344050-538163136+336583949
 =785180914+336583949
 =1121764863

*/

 

<无标签>
举报
EMCJava
发帖于10个月前 0回/96阅
顶部