Cod sursa(job #3300221)

Utilizator anamaria-carina.orszariAnamaria-Carina Orszari anamaria-carina.orszari Data 13 iunie 2025 21:05:00
Problema Evaluarea unei expresii Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 3.01 kb
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define MAX_LUNGIME 100005

typedef struct Nod
{
    int esteOperator;
    char operator;
    int valoare;
    struct Nod *stanga, *dreapta;
} Nod;
char expresie[MAX_LUNGIME];
int pozitie;
Nod* creeazaNodValoare(int valoare)
{
    Nod* nod = (Nod*)malloc(sizeof(Nod));
    nod->esteOperator = 0;
    nod->valoare = valoare;
    nod->stanga = nod->dreapta = NULL;
    return nod;
}
Nod* creeazaNodOperator(char operator, Nod* stanga, Nod* dreapta)
{
    Nod* nod = (Nod*)malloc(sizeof(Nod));
    nod->esteOperator = 1;
    nod->operator = operator;
    nod->stanga = stanga;
    nod->dreapta = dreapta;
    return nod;
}
void sareSpatii()
{
    while (expresie[pozitie] == ' ') pozitie++;
}
int citesteNumar()
{
    sareSpatii();
    int valoare = 0;
    while (isdigit(expresie[pozitie]))
    {
        valoare = valoare * 10 + (expresie[pozitie] - '0');
        pozitie++;
    }
    return valoare;
}
Nod* parseazaExpresie();

Nod* parseazaFactor()
{
    sareSpatii();
    if (expresie[pozitie] == '(')
    {
        pozitie++;
        Nod* nod = parseazaExpresie();
        sareSpatii();
        pozitie++;
        return nod;
    } else {
        return creeazaNodValoare(citesteNumar());
    }
}
Nod* parseazaTermen()
{
    Nod* nod = parseazaFactor();
    while (1) {
        sareSpatii();
        if (expresie[pozitie] == '*' || expresie[pozitie] == '/')
        {
            char op = expresie[pozitie++];
            Nod* dreapta = parseazaFactor();
            nod = creeazaNodOperator(op, nod, dreapta);
        }
        else
            break;
    }
    return nod;
}
Nod* parseazaExpresie()
{
    Nod* nod = parseazaTermen();
    while (1) {
        sareSpatii();
        if (expresie[pozitie] == '+' || expresie[pozitie] == '-')
        {
            char op = expresie[pozitie++];
            Nod* dreapta = parseazaTermen();
            nod = creeazaNodOperator(op, nod, dreapta);
        }
        else
            break;
    }
    return nod;
}
int evalueaza(Nod* nod) 
{
    if (!nod->esteOperator) return nod->valoare;
    int stanga = evalueaza(nod->stanga);
    int dreapta = evalueaza(nod->dreapta);
    switch (nod->operator)
    {
        case '+': return stanga + dreapta;
        case '-': return stanga - dreapta;
        case '*': return stanga * dreapta;
        case '/': return stanga / dreapta;
    }
    return 0; // fallback
}
void elibereazaArbore(Nod* nod)
{
    if (!nod) return;
    elibereazaArbore(nod->stanga);
    elibereazaArbore(nod->dreapta);
    free(nod);
}

int main()
{
    FILE* fin = fopen("evaluare.in", "r");
    FILE* fout = fopen("evaluare.out", "w");
    fgets(expresie, MAX_LUNGIME, fin);
    pozitie = 0;

    Nod* radacina = parseazaExpresie();
    int rezultat = evalueaza(radacina);
    fprintf(fout, "%d\n", rezultat);

    elibereazaArbore(radacina);
    fclose(fin);
    fclose(fout);
    return 0;
}