Cod sursa(job #150500)

Utilizator ViksenVictor-Nicolae Savu Viksen Data 6 martie 2008 23:50:54
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <stdio.h>

char E[100012],S[100012],O[7]={'\n','+','-','*','/','(',')'};
int C[6][7] = {{4,1,1,1,1,1,5},
               {2,2,2,1,1,1,2},
               {2,2,2,1,1,1,2},
               {2,2,2,2,2,1,2},
               {2,2,2,2,2,1,2},
               {5,1,1,1,1,1,3}},
               s,n,T[100012],t,j,err;

int cauta ( char c )
{
    int i=0;
    for (i=0;c!=O[i];i++);
    return i;
}

void calcul ( char c )
{
    switch (c)
    {
        case '+' : T[t-2]+=T[t-1];T[--t]=0; break;
        case '-' : T[t-2]-=T[t-1];T[--t]=0; break;
        case '*' : T[t-2]*=T[t-1];T[--t]=0; break;
        case '/' : T[t-2]/=T[t-1];T[--t]=0; break;
        default : break;
    }
}

void caz()
{
    int b=cauta(S[s]);
    int a=cauta(E[j]);
    switch (C[b][a])
    {
        case 1 : S[++s]=E[j++]; break;
        case 2 : calcul(S[s--]); break;
        case 3 : j++;S[s--]=0; break;
        case 4 : err=1; break;
        default : break;
    }
}

int expresie ()
{

}

int main ()
{
    fgets ( E , 100010 , fopen ( "evaluare.in" , "r" ) );
    S[0]='\n';
    freopen ( "evaluare.out" , "w" , stdout );
    t=0;
    for (err=0;!err;caz())
    {
        if (E[j]>='0'&&E[j]<='9')
        {
            while (E[j]>='0'&&E[j]<='9') T[t]=T[t]*10+E[j++]-'0';
            t++;
        }
    }
    printf ( "%d\n" , T[t-1] );
    fclose ( stdout );
}