Cod sursa(job #2155236)
Utilizator | Data | 7 martie 2018 18:33:50 | |
---|---|---|---|
Problema | Evaluarea unei expresii | Scor | 20 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 4.42 kb |
#include <stdio.h>
#include <cstring>
using namespace std;
FILE *f,*g;
char c[100009];
int par[50002],stiva[100009];
///'+'-> -2
///'-'-> -3
///'*'-> -4
///'/'-> -5
int adun(int a, int b)
{
return (a+b);
}
int scad(int a, int b)
{
return (a-b);
}
int inm(int a, int b)
{
return (a*b);
}
int imp(int a, int b)
{
return (a/b);
}
int cauta(int a, int b, int semn)
{
if(semn==-2)
return adun(a,b);
if(semn==-3)
return scad(a,b);
if(semn==-4)
return inm(a,b);
if(semn==-5)
return imp(a,b);
}
int main()
{
int lg,ss=0,pp=0,ok=0,s1,s2,poz,a,b,sum;
f=fopen("evaluare.in","r");
g=fopen("evaluare.out","w");
fscanf(f,"%s",&c);
lg=strlen(c);
int i,nr;
for(i=0;i<lg;++i)
{
if(c[i]=='(')
stiva[++ss]=-1,par[++pp]=ss;
else
if(c[i]=='+')
stiva[++ss]=-2;
else
if(c[i]=='-')
stiva[++ss]=-3;
else
if(c[i]=='*')
stiva[++ss]=-4;
else
if(c[i]=='/')
stiva[++ss]=-5;
else
if(c[i]>='0' && c[i]<='9')
{
nr=0;
while(c[i]>='0' && c[i]<='9')
{
nr=nr*10+c[i]-'0';
++i;
}
stiva[++ss]=nr;
--i;
}
else
if(c[i]==')')
{
s1=-4;
s2=-5;
ok=1;
while(ok==1)
{
ok=0;
poz=par[pp];
while((stiva[poz]!=s1&& stiva[poz]!=s2) && poz<=ss)
++poz;
if(poz<=ss)
{
ok=1;
int j;
a=stiva[poz-1];
b=stiva[poz+1];
stiva[poz-1]=cauta(a,b,stiva[poz]);
for(j=poz;j<ss-1;++j)
stiva[j]=stiva[j+2];
ss-=2;
}
}
s1=-2;
s2=-3;
sum=0;
poz=par[pp]+1;
sum=stiva[poz];
++poz;
while(poz<ss)
{
sum=cauta(sum,stiva[poz+1],stiva[poz]);
poz+=2;
}
poz=par[pp];
stiva[poz]=sum;
ss=poz;
}
}
s1=-4;
s2=-5;
ok=1;
while(ok==1)
{
ok=0;
poz=1;
while((stiva[poz]!=-4 && stiva[poz]!=-5) && poz<=ss)
++poz;
if(poz<=ss)
{
ok=1;
int j;
a=stiva[poz-1];
b=stiva[poz+1];
stiva[poz-1]=cauta(a,b,stiva[poz]);
for(j=poz;j<ss-1;++j)
stiva[j]=stiva[j+2];
ss-=2;
}
}
s1=-2;
s2=-3;
sum=0;
poz=1;
sum=stiva[poz];
++poz;
while(poz<ss)
{
sum=cauta(sum,stiva[poz+1],stiva[poz]);
poz+=2;
}
poz=1;
stiva[poz]=sum;
fprintf(g,"%d",stiva[1]);
fclose(f);
fclose(g);
return 0;
}