Pagini recente » Cod sursa (job #3133966) | Cod sursa (job #1653518) | Cod sursa (job #867887) | Cod sursa (job #846644) | Cod sursa (job #2338411)
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
FILE *f,*g;
char v[100002];
int st[100002];
int lg,s;
int adun=-3, scad=-4, inm=-5, imp=-6;
void read()
{
fscanf(f,"%s",&v);
lg=strlen(v);
}
void solve()
{ int vf=0,nr,s2,j,jcop,vffake,icop;
for(int i=0; i<lg; i++)
{
if(v[i]=='(')
st[++vf]=-1;
else if(v[i]>='0' && v[i]<='9')
{ nr=0;
while(v[i]>='0' && v[i]<='9')
{
nr=nr*10+v[i]-'0';
i++;
}
st[++vf]=nr;
i--;
}
else if(v[i]=='+')
st[++vf]=adun;
else if(v[i]=='-')
st[++vf]=scad;
else if(v[i]=='*')
st[++vf]=inm;
else if(v[i]=='/')
st[++vf]=imp;
else
{
for(j=vf; st[j]!=-1; j--){}
vffake=j;
s=st[++j];
j++; //aici tre sa vad daca ii cv de forma (-21+3)
for( ; j<=vf; j+=2)
{
if(st[j]==adun && (st[j+2]!=inm && st[j+2]!=imp))
s+=st[j+1];
else if(st[j]==scad && (st[j+2]!=inm && st[j+2]!=imp))
s-=st[j+1];
else
{ jcop=j;
if(st[i]==adun || st[i]==scad)
s2=st[i+1],i+=2;
else
s2=st[i-1];
while(st[j]==inm || st[j]==imp)
{
if(st[j]==inm)
s2*=st[j+1];
else
s2/=st[j+1];
j+=2;
}
if(jcop==scad)
s-=s2;
else
s+=s2;
}
}
vf=vffake;
st[vffake]=s;
}
}
if(vf<2)
return;
s=0;
st[vf+1]=st[vf+2]=st[vf+3]=0;
for(int i=2; i<vf; i+=2)
{
if(st[i]==adun && st[i+2]!=inm && st[i+2]!=imp)
s+=st[i+1];
else if(st[i]==scad && st[i+2]!=inm && st[i+2]!=imp)
s-=st[i+1];
else
{ icop=i;
if(st[i]==adun || st[i]==scad)
s2=st[i+1],i+=2;
else
s2=st[i-1];
while(st[i]==inm || st[i]==imp)
{
if(st[i]==inm)
s2*=st[i+1];
else
s2/=st[i+1];
i+=2;
}
if(icop==scad)
s-=s2;
else
s+=s2;
i-=2;
}
}
}
void write()
{
fprintf(g,"%d",s);
cout<<s;
}
int main()
{
f=fopen("evaluare.in","r");
g=fopen("evaluare.out","w");
read();
solve();
write();
fclose(f);
fclose(g);
return 0;
}