Cod sursa(job #3363351)

Utilizator horia.boeriuBoeriu Horia Andrei horia.boeriu Data 16 august 2026 19:09:18
Problema Evaluarea unei expresii Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <bits/stdc++.h>

using namespace std;
const int MAXN = 100000;
char semn[MAXN], semn2[MAXN];//in semn[i] este ultimul semn de la nivelul i si in semn2 este ultimul semn dintre + si - de la nivelul i
int ult[MAXN], sum[MAXN];
int niv;
char ch;
void calc(int x) {
    int val;
    val = x;
    if (semn[niv] == '*') {
        val = ult[niv] * x;
    } else if (semn[niv] == '/') {
        val = ult[niv] / x;
    }
    if (ch != '*' && ch != '/') {
        if (semn2[niv] == '+') {
            sum[niv] += val;
        } else {
            sum[niv] -= val;
        }
        if (ch == '+' || ch == '-') {
            semn[niv] = semn2[niv] = ch;
            ult[niv] = 0;
        }
    } else {
        ult[niv] = val;
        semn[niv] = ch;
    }
}
int main()
{
    //tin o stiva pentru paranteze si la fiecare nivel tin ultimul numar si ultima operatie
    //se poate face si recursiv cred in loc de stiva
    FILE *fin, *fout;
    int x;
    fin = fopen("evaluare.in", "r");
    ch = fgetc(fin);
    niv = 0;
    x = 0;
    semn[0] = semn2[0] = '+';
    ult[0] = 0;
    while (ch != '\n' && ch != EOF) {
        if (isdigit(ch)) {
            x = 0;
            while (isdigit(ch)) {
                x = x * 10 + ch - '0';
                ch = fgetc(fin);
            }
            calc(x);
        }
        if (ch == '(') {
            niv++;
            semn[niv] = semn2[niv] = '+';
            ult[niv] = 0;
            ch = fgetc(fin);
        } else if (ch == ')') {
            niv--;
            ch = fgetc(fin);
            calc(sum[niv + 1]);
        } else if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
            ch = fgetc(fin);
        }
    }
    fclose(fin);
    fout = fopen("evaluare.out", "w");
    fprintf(fout, "%d\n", sum[0]);
    fclose(fout);
    return 0;
}