Cod sursa(job #1525646)

Utilizator radudurlesteanuDurlesteanu Radu Stefan radudurlesteanu Data 15 noiembrie 2015 12:45:21
Problema Evaluarea unei expresii Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>
#include <cstring>
using namespace std;
char e[100000],p[200000],op[]="+-*/";
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
int i,lg,lgp;
void TransformExpresie();
void TransformFactor();
void TransformTermen();
long rez()
{
int st[100000],j=0,k=0,S=0,a,b;
char c;
while (j<lgp)
   {
   c=p[j];
   if (isdigit(c)) {
                    st[k]*=10;
                    st[k]+=c-'0';
                   }
   if (c==' ') {k++;st[k]=0;}
   if (strchr(op,c)) {
                     a=st[k-1];
                     b=st[k-2];S=0;
                     if (c=='+') S+=a+b;
                     if (c=='-') S+=b-a;
                     if (c=='*') S+=a*b;
                     if (c=='/') if (b>0) S+=b/a;
                                     else S+=(b/a)-1;
                     st[k-1]=0;
                     k-=2;
                     st[k]=S;
                     }
    j++;
   }
return st[0];
}
int main()
{
fin.getline(e,200);
lg=strlen(e);
TransformExpresie();
fout<<rez();
}
void TransformFactor()
{if (e[i]=='(') {i++;
                 TransformExpresie();
                 i++;
                }
    else {
          while (isdigit(e[i])) {
                               p[lgp++]=e[i];
                               i++;
                               }
          p[lgp++]=' ';
        }
}
void TransformTermen()
{
TransformFactor();
while (i<lg && (e[i]=='*' || e[i]=='/'))
    {
      i++;char c=e[i-1];
      TransformFactor();
      p[lgp++]=c;
      p[lgp++]=' ';
    }
}
void TransformExpresie()
{TransformTermen();
while (i<lg && (e[i] == '+' || e[i]=='-'))
       {
        i++;char c=e[i-1];
        TransformTermen();
        p[lgp++]=c;
        p[lgp++]=' ';
       }
}