Cod sursa(job #2595775)

Utilizator VladTZYVlad Tiganila VladTZY Data 8 aprilie 2020 13:33:54
Problema Evaluarea unei expresii Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.95 kb
#include <fstream>
#include <cstring>

#define NMAX 100005

using namespace std;

ifstream f("evaluare.in");
ofstream g("evaluare.out");

int n, i;

int stiv_num[NMAX];
char stiv_sign[NMAX], x[NMAX];
int numbers = 0, signs = 0;

int getNr()
{
    int rez = 0;
    for(i = i; i < n && (x[i] >= '0' && x[i] <= '9'); i++)
        rez = rez * 10 + (x[i] - '0');

    i--;
    return rez;
}
void solveParanthese()
{
    while(stiv_sign[signs] != '(')
    {
        int nrNow = stiv_num[numbers];
        numbers--;

        if(stiv_sign[signs] == '+')
            stiv_num[numbers] += nrNow;
        if(stiv_sign[signs] == '-')
            stiv_num[numbers] -= nrNow;
        signs--;
    }
    signs--;

    if(stiv_sign[signs] == '*')
    {
        int nrNow = stiv_num[numbers];
        numbers--; signs--;

        stiv_num[numbers] *= nrNow;
    }
    if(stiv_sign[signs] == '/')
    {
        int nrNow = stiv_num[numbers];
        numbers--; signs--;

        stiv_num[numbers] /= nrNow;
    }
}

int main()
{
    f.getline(x, NMAX);
    n = strlen(x);

    stiv_sign[++signs] = '(';
    for(i = 0; i < n; i++)
    {
        if(x[i] == '(')
            stiv_sign[++signs] = '(';

        if(x[i] >= '0' && x[i] <= '9')
        {
            int nrNow = getNr();

            if(stiv_sign[signs] == '*')
            {
                stiv_num[numbers] *= nrNow;
                signs--;
                continue;
            }
            if(stiv_sign[signs] == '/')
            {
                stiv_num[numbers] /= nrNow;
                signs--;
                continue;
            }

            stiv_num[++numbers] = nrNow;
            continue;
        }

        if(x[i] == '*' || x[i] == '/' || x[i] == '+' || x[i] == '-')
            stiv_sign[++signs] = x[i];

        if(x[i] == ')')
            solveParanthese();
    }
    solveParanthese();

    g << stiv_num[1];
    return 0;
}