#include #include #include #include float string2float(const std::string &str) { float num; std::stringstream ss; ss << str; if (ss >> num) { return num; } std::cout << "Error: Could not convert string to float. Exiting..." << std::endl; return 0; } std::string float2string(const float i) { std::string str; std::stringstream ss; ss << i; return ss.str(); } std::string printvector(const std::vector &vector, const std::string &str = "\n") { std::string string; for (unsigned int i = 0; i < vector.size(); i++) { string += vector[i]; string += str; } return string; } int find_op(const std::vector &vector, const std::string &str) { for (unsigned int i = 0; i < vector.size(); i++) { if (vector[i] == str) { return i; } } return -1; } int find_ops(const std::vector &vector, const std::string &alphabet) { for (unsigned int i = 0; i < alphabet.length(); i++) { int j = find_op(vector, alphabet.substr(i, 1)); if (j > -1) { return j; } } return -1; } std::string trim(const std::string& str) { int start = str.find_first_not_of(" "); if (start == std::string::npos) { return ""; } return str.substr(start, str.find_last_not_of(" ")-start+1); } int main(void) { std::string in; std::vector equation; //Take input until done for(int i = 0; in != "="; i++) { std::cout << "Your expression: \"" << trim(printvector(equation, " ")) << "\". "; if (equation.size() % 2 == 0) { std::cout << "Expecting a number: "; } else { std::cout << "Expecting an operator (+, -, *, /, or =): "; } std::cin >> in; //Push input onto vector if acceptable if (equation.size() % 2 == 0) { std::stringstream ss(in); float fnum; if (ss >> fnum) { equation.push_back(in); } } else { if (in == "*" || in == "/" || in == "+" || in == "-") { equation.push_back(in); } } } //Calculate in order: *, /, +, - for (int strpos = find_ops(equation, "*/+-"); strpos > 0; strpos = find_ops(equation, "*/+-")) { if (equation[strpos] == "*") { equation.insert(equation.begin()+strpos+2, float2string(string2float(equation[strpos-1]) * string2float(equation[strpos+1]))); } else if (equation[strpos] == "/") { if (equation[strpos+1] == "0") { std::cout << "Error: Can't divide by zero. Exiting..." << std::endl; return 0; } equation.insert(equation.begin()+strpos+2, float2string(string2float(equation[strpos-1]) / string2float(equation[strpos+1]))); } else if (equation[strpos] == "+") { equation.insert(equation.begin()+strpos+2, float2string(string2float(equation[strpos-1]) + string2float(equation[strpos+1]))); } else if (equation[strpos] == "-") { equation.insert(equation.begin()+strpos+2, float2string(string2float(equation[strpos-1]) - string2float(equation[strpos+1]))); } equation.erase(equation.begin()+strpos-1, equation.begin()+strpos+2); } //Print what we have std::cout << "Result: " << printvector(equation, " ") << std::endl; return 0; }