Cod sursa(job #3294058)

Utilizator avadaravaRares Avadanei avadarava Data 15 aprilie 2025 15:15:40
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.49 kb
#include <iostream>
#include <string>
#include <cctype>

using namespace std;

string s;  // șirul ce conține expresia
int pos;   // poziția curentă de parcurgere în șir

// (Opțional) Funcție care sare peste eventualele spații, dacă există.
void skipSpaces() {
    while (pos < s.size() && isspace(s[pos])) {
        pos++;
    }
}

// Declarație înaintea funcției parseFactor, pentru a permite apel recursiv.
int parseExpression();

// Funcția parseFactor: evaluează un factor (fie număr, fie expresie între paranteze)
int parseFactor() {
    skipSpaces();
    int result = 0;
    // Dacă întâlnește o paranteză deschisă, evaluează expresia din interior
    if (s[pos] == '(') {
        pos++;  // sare peste '('
        result = parseExpression();
        skipSpaces();
        pos++;  // sare peste ')'
        return result;
    } else {
        // Procesare număr (susține și semnul negativ)
        bool negative = false;
        if (s[pos] == '-') {
            negative = true;
            pos++;
        }
        while (pos < s.size() && isdigit(s[pos])) {
            result = result * 10 + (s[pos] - '0');
            pos++;
        }
        return negative ? -result : result;
    }
}

// Funcția parseTerm: evaluează factori separați prin '*' sau '/'
int parseTerm() {
    int result = parseFactor();
    skipSpaces();
    while (pos < s.size() && (s[pos] == '*' || s[pos] == '/')) {
        char op = s[pos++];
        int nextFactor = parseFactor();
        if (op == '*')
            result = result * nextFactor;
        else // op == '/' → împărțire întreagă
            result = result / nextFactor;
        skipSpaces();
    }
    return result;
}

// Funcția parseExpression: evaluează o expresie cu termeni separați prin '+' sau '-'
int parseExpression() {
    int result = parseTerm();
    skipSpaces();
    while (pos < s.size() && (s[pos] == '+' || s[pos] == '-')) {
        char op = s[pos++];
        int nextTerm = parseTerm();
        if (op == '+')
            result = result + nextTerm;
        else // op == '-'
            result = result - nextTerm;
        skipSpaces();
    }
    return result;
}

int main() {
    cout << "Introduceti expresia aritmetica: ";
    getline(cin, s);
    pos = 0;

    // Evaluează expresia
    int result = parseExpression();

    // Afișează rezultatul în terminal
    cout << "Rezultatul evaluarii este: " << result << endl;
    return 0;
}