Cod sursa(job #3293968)

Utilizator SebyiIorga Sebastian George Sebyi Data 14 aprilie 2025 16:52:08
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
#include <string>
#include <cctype>

ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");

int i = 0;

double parseExpression(const std::string& s);

double parseNumber(const std::string& s) {
    double num = 0;
    while (i < s.size() && std::isdigit(s[i])) {
        num = num * 10 + (s[i++] - '0');
    }
    if (i < s.size() && s[i] == '.') {
        i++;
        double frac = 0.1;
        while (i < s.size() && std::isdigit(s[i])) {
            num += (s[i++] - '0') * frac;
            frac *= 0.1;
        }
    }
    return num;
}

double parseFactor(const std::string& s) {
    if (s[i] == '(') {
        i++;
        double val = parseExpression(s);
        i++;
        return val;
    }
    return parseNumber(s);
}

double parseTerm(const std::string& s) {
    double val = parseFactor(s);
    while (i < s.size() && (s[i] == '*' || s[i] == '/')) {
        char op = s[i++];
        double right = parseFactor(s);
        if (op == '*') val *= right;
        else val /= right;
    }
    return val;
}

double parseExpression(const std::string& s) {
    double val = parseTerm(s);
    while (i < s.size() && (s[i] == '+' || s[i] == '-')) {
        char op = s[i++];
        double right = parseTerm(s);
        if (op == '+') val += right;
        else val -= right;
    }
    return val;
}

int main() {
    std::string input = "";
    fin.getline(input, 100001);
    input.erase(remove(input.begin(), input.end(), ' '), input.end());
    i = 0;
    double result = parseExpression(input);
    fout << result;
    return 0;
}