Cod sursa(job #3310268)

Utilizator risxdrzBanica Albert risxdrz Data 12 septembrie 2025 15:30:46
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.03 kb
#include <iostream>
#include <string>
#include <cctype>

class MathEvaluator {
private:
    std::string expr;
    size_t pos;
    
    // Skip whitespace
    void skipWhitespace() {
        while (pos < expr.length() && std::isspace(expr[pos])) {
            pos++;
        }
    }
    
    // Parse a number
    int parseNumber() {
        skipWhitespace();
        int result = 0;
        bool negative = false;
        
        if (pos < expr.length() && expr[pos] == '-') {
            negative = true;
            pos++;
        } else if (pos < expr.length() && expr[pos] == '+') {
            pos++;
        }
        
        while (pos < expr.length() && std::isdigit(expr[pos])) {
            result = result * 10 + (expr[pos] - '0');
            pos++;
        }
        
        return negative ? -result : result;
    }
    
    // Parse factors (numbers and parentheses)
    int parseFactor() {
        skipWhitespace();
        
        if (pos < expr.length() && expr[pos] == '(') {
            pos++; // skip '('
            int result = parseExpression();
            skipWhitespace();
            if (pos < expr.length() && expr[pos] == ')') {
                pos++; // skip ')'
            }
            return result;
        }
        
        return parseNumber();
    }
    
    // Parse terms (multiplication and division)
    int parseTerm() {
        int result = parseFactor();
        
        while (pos < expr.length()) {
            skipWhitespace();
            if (pos >= expr.length()) break;
            
            char op = expr[pos];
            if (op == '*' || op == '/') {
                pos++;
                int right = parseFactor();
                if (op == '*') {
                    result *= right;
                } else {
                    result /= right;
                }
            } else {
                break;
            }
        }
        
        return result;
    }
    
    // Parse expressions (addition and subtraction)
    int parseExpression() {
        int result = parseTerm();
        
        while (pos < expr.length()) {
            skipWhitespace();
            if (pos >= expr.length()) break;
            
            char op = expr[pos];
            if (op == '+' || op == '-') {
                pos++;
                int right = parseTerm();
                if (op == '+') {
                    result += right;
                } else {
                    result -= right;
                }
            } else {
                break;
            }
        }
        
        return result;
    }
    
public:
    int evaluate(const std::string& expression) {
        expr = expression;
        pos = 0;
        return parseExpression();
    }
};

// Main eval function
int eval(const std::string& expression) {
    MathEvaluator evaluator;
    return evaluator.evaluate(expression);
}

// Example usage
int main() {
    std::string n;
    std::cin>>n;
    std::cout<<eval(n);
    return 0;
}