diff --git a/cpp/.vscode/settings.json b/cpp/.vscode/settings.json new file mode 100644 index 0000000..0cba2e6 --- /dev/null +++ b/cpp/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "iostream": "cpp" + } +} \ No newline at end of file diff --git a/cpp/bin/calc b/cpp/bin/calc new file mode 100644 index 0000000..845fec9 Binary files /dev/null and b/cpp/bin/calc differ diff --git a/cpp/calc.cpp b/cpp/calc.cpp new file mode 100644 index 0000000..d25c865 --- /dev/null +++ b/cpp/calc.cpp @@ -0,0 +1,64 @@ +#include +#include +#include + +static int pos = 0; +int calc_expression_value(const char * expression); + +int calc_factor_value(const char * factor){ + int result = 0; + char c = factor[pos]; + if( c == '('){ // if expression has '(', calculate the expression in the '()' + pos++; + result = calc_expression_value(factor); + pos++; + }else{ + while(isdigit(c)){ // Get the number to calculate + result = 10 * result + c - '0'; + pos++; + c = factor[pos]; + } + } + return result; +} + +int calc_term_value(const char * term){ + int result = calc_factor_value(term); // Get the first number + while(true){ + //pos++; // Calc the multiplication and divide + char op = term[pos]; + if(op == '*' || op == '/'){ + pos++; + int value = calc_factor_value(term); // Get another value + if(op == '*') result *= value; + else result /= value; + }else{ + break; + } + } + return result; +} + +int calc_expression_value(const char * expression){ + int result = calc_term_value(expression); // Calc the result of expression + //bool more = true; + while(true){ + char op = expression[pos]; + if(op == '+' || op == '-'){ // Calculate for add and subb + pos++; + int value = calc_term_value(expression); + if( op == '+') result += value; + else result -= value; + }else{ + break; + } + } + return result; +} + +int main(int argc,char ** argv){ + char expression[1000]; + std::cin.getline(expression,sizeof(expression)); + std::cout<