Cod sursa(job #1233166)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 24 septembrie 2014 21:15:45
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.82 kb
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

int n, i;
char s[110005];

int evalDefault();
int getNumber();
int evalDivide(int, int);
int nextChar();

int main()
{
    freopen("evaluare.in", "r", stdin);
    freopen("evaluare.out", "w", stdout);

    gets(s+1);
    n=1;
    while((s[n]>='0'&&s[n]<='9')||s[n]=='+'||s[n]=='-'||s[n]=='*'||s[n]=='/'||s[n]=='('||s[n]==')') n++;

    i=0;
    printf("%d", evalDefault());
    return 0;
}
/// MainEnd
int evalDefault()
{
    int sum=0, x=0, sign=1;
    while(1)
    {
        i++;
        int nxt=nextChar();
        if(nxt==6) break;
        if(i>n) break;
        if(nxt==-1) break;

        if(nxt==0)
        {
            i--;
            x=getNumber();
            continue;
        }
        if(nxt==1)
        {
            if(sign==1)
                sum=sum+x;
            else
                sum=sum-x;
            sign=1;
            continue;
        }
        if(nxt==2)
        {
            if(sign==1)
                sum=sum+x;
            else
                sum=sum-x;
            sign=2;
            continue;
        }
        if(nxt==3) {x=evalDivide(x, 1); continue;}
        if(nxt==4) {x=evalDivide(x, 2); continue;}
        if(nxt==5) {x=evalDefault(); continue;}
    }

    if(sign==1)
        sum=sum+x;
    else
        sum=sum-x;

    return sum;
}

int evalDivide(int y, int sign)
{
    int prod=y, x=0;
    while(1)
    {
        i++;
        int nxt=nextChar();

        if(nxt==-1) break;
        if(nxt==6)
        {
            i--;
            break;
        }
        if(nxt==0) {i--;x=getNumber(); continue;}
        if(nxt==1||nxt==2) {i--; break;}
        if(nxt==3)
        {
            if(sign==1)
                prod=prod*x;
            else
                prod=prod/x;
            sign=1;
            continue;
        }
        if(nxt==4)
        {
            if(sign==1)
                prod=prod*x;
            else
                prod=prod/x;
            sign=2;
            continue;
        }
        if(nxt==5) {x=evalDefault(); continue;}
    }

    if(sign==1)
        prod=prod*x;
    else
        prod=prod/x;

    return prod;
}

int nextChar()
{
    if(s[i]>='0'&&s[i]<='9') return 0;
    if(s[i]=='+') return 1;
    if(s[i]=='-') return 2;
    if(s[i]=='*') return 3;
    if(s[i]=='/') return 4;
    if(s[i]=='(') return 5;
    if(s[i]==')') return 6;
    return -1;
}

int getNumber()
{
    int nr=0;
    while(1)
    {
        i++;
        int nxt=nextChar();

        if(i>n) break;
        if(nxt>0) break;
        if(nxt==-1) break;

        nr=nr*10+s[i]-'0';
    }
    i--;
    return nr;
}