Cod sursa(job #2961915)

Utilizator vmnechitaNechita Vlad-Mihai vmnechita Data 7 ianuarie 2023 13:30:10
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 4.27 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Nod
{
    char* informatie;
    struct Nod *st, *dr;
};

/*
char* SetUpConstruiesteArbore(char *s)
{
    int n = strlen(s), m, i, j, x, cx;
    char* Operatori = "()+-*^/|&";
    char* Raspuns;

    j = 0;
    for(i = 0; i < n; i++) if(s[i] != ' ') s[j++] = s[i];
    s[j] = '\n', n = j;

    for(i = 0; i < n; i++)
    {
        if(strchr(Operatori, s[i]) != nullptr) Raspuns += s[i];
        else if(s[i] < '0' || s[i] > 9)
        {
            char* nume = "";
            while(i < n && s[i] != '.' && strcmp(Operatori, s[i]) == nullptr)
            {
                nume += s[i];
                i++;
            }
            cx = x = getIntVal(nume);
            while(cx)
            {
                cx /= 10;
                Raspuns += '0';
            }
            m = strlen(R), j = 0;
            while(x)
            {
                R[m-1-j] += x % 10;
                x /= 10;
                j++;
            }
        }
    }

    return Raspuns;
}
*/

int Prioritate(char Operator)
{
    if(Operator == '+' || Operator == '-') return 1;
    else if(Operator == '/' || Operator == '*') return 2;
}

float TransfInFormaPoloneza(char* s)
{
    int n = int(strlen(s)), i, capat1 = -1, capat2 = -1;
    float s1[100005], x, nr, ParteIntreaga, ParteFractionara;
    char s2[100005];

    for(i = 0; i < n; i++)
    {
        if(s[i] >= '0' && s[i] <= '9')
        {
            ParteIntreaga = ParteFractionara = 0, nr = 1;
            while(i < n && s[i] >= '0' && s[i] <= '9')
            {
                ParteIntreaga = ParteIntreaga * 10 + float(s[i] - '0');
                i++;
            }
            if(i < n && s[i] == '.')
            {
                while(i < n && s[i] >= '0' && s[i] <= '9')
                {
                    ParteFractionara = ParteFractionara * 10 + float(s[i] - '0');
                    nr *= 10;
                    i++;
                }
            }

            i--;
            x = ParteIntreaga + ParteFractionara / nr;
            s1[++capat1] = x;
        }
        else if(s[i] == '(') s2[++capat2] = '(';
        else if(s[i] == ')')
        {
            while(s2[capat2] != '(')
            {
                capat1--;
                if(s2[capat2] == '+') s1[capat1] = s1[capat1] + s1[capat1+1];
                else if(s2[capat2] == '-') s1[capat1] = s1[capat1] - s1[capat1+1];
                else if(s2[capat2] == '/') s1[capat1] = s1[capat1] / s1[capat1+1];
                else if(s2[capat2] == '*') s1[capat1] = s1[capat1] * s1[capat1+1];
                capat2--;
            }
            capat2--;
        }
        else
        {
            while(capat2 != -1 && s2[capat2] != '(' && Prioritate(s2[capat2]) >= Prioritate(s[i]))
            {
                capat1--;
                if(s2[capat2] == '+') s1[capat1] = s1[capat1] + s1[capat1+1];
                else if(s2[capat2] == '-') s1[capat1] = s1[capat1] - s1[capat1+1];
                else if(s2[capat2] == '/') s1[capat1] = s1[capat1] / s1[capat1+1];
                else if(s2[capat2] == '*') s1[capat1] = s1[capat1] * s1[capat1+1];
                capat2--;
            }
            s2[++capat2] = s[i];
        }
    }

    while(capat2 != -1)
    {
        capat1--;
        if(s2[capat2] == '+') s1[capat1] = s1[capat1] + s1[capat1+1];
        else if(s2[capat2] == '-') s1[capat1] = s1[capat1] - s1[capat1+1];
        else if(s2[capat2] == '/') s1[capat1] = s1[capat1] / s1[capat1+1];
        else if(s2[capat2] == '*') s1[capat1] = s1[capat1] * s1[capat1+1];
        capat2--;
    }

    return s1[capat1];
}

struct Nod* ConstruiesteArbore(char* s, struct Nod *rad)
{
    ;

}

int Eval(struct Nod* rad)
{
    if(strcmp(rad->informatie, "+") == 0) return Eval(rad->st) + Eval(rad->dr);
    else if(strcmp(rad->informatie, "-") == 0) return Eval(rad->st) - Eval(rad->dr);
    else if(strcmp(rad->informatie, "*") == 0) return Eval(rad->st) * Eval(rad->dr);
    else if(strcmp(rad->informatie, "/") == 0) return Eval(rad->st) / Eval(rad->dr);

    return atoi(rad->informatie);
}

int main()
{
    /*
    struct Nod* Radacina = ConstruiesteArbore((char*)("(1+2)*3-(1+2*3)"), Radacina);
    printf("%d", Eval(Radacina));
     */

    float x = TransfInFormaPoloneza((char*)("(1+2)*3-(1+2*3)"));
    int y = int(x);
    printf("%d", y);

    return 0;
}