Pagini recente » Cod sursa (job #2972485) | Cod sursa (job #1306281) | Cod sursa (job #3143517) | Cod sursa (job #2823236) | Cod sursa (job #1337972)
#include <fstream>
#include <cstring>
#define NR 100005
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char a[NR],op[NR/2],k[NR];
int v[NR/2];
void trag(int v[],int lg)
{
for(int i=0;i<lg;i++)
v[i]=v[i+1];
}
int calc(char b[])
{
int lg=0,d=strlen(b);
char aux[lg];
for(int i=0;i<d;i++)
if(b[i]>='0' && b[i]<='9')
v[lg]=v[lg]*10+b[i]-'0';
else
op[++lg]=b[i],v[lg]=0;
for(int i=2;i<=lg;i++)
if(op[i]=='*')
{
v[i-1]=v[i-1]*v[i];
strcpy(aux,op+i+1);
op[i]='\0';
strcat(op,aux);
trag(v+i,lg);
lg--; i--;
}
else
if(op[i]=='/')
{
v[i-1]=v[i-1]/v[i];
strcpy(aux,op+i+1);
op[i]='\0';
strcat(op,aux);
trag(v+i,lg);
lg--; i--;
}
long long s=0;
for(int i=1;i<=lg;i++)
{
if(op[i]=='+')
s=s+v[i];
else
s=s-v[i];
}
return s;
}
void convert(int n,char aux[])
{
int p=0,var;
if(n<0) n=-n;
while(n!=0)
aux[p++]=(n%10)+'0',n=n/10;
aux[p]='\0';
for(int i=0;i<=(p-1)/2;i++)
var=aux[i],aux[i]=aux[p-1-i],aux[p-1-i]=var;
}
int cautP(int poz,char b[],int d)
{
int ok=1,j;
for(j=poz+1;j<d;j++)
if(b[j]=='(') ok++;
else
if(b[j]==')')
{
ok--;
if(ok==0) break;
}
b[j]='\0';
strcpy(k,b+poz+1);
b[j]=')';
return j;
}
int changeP(char b[])
{
char aux[20];
int ok,j,d=strlen(b),n;
for(int i=0;i<d;i++)
if(b[i]=='(')
{
j=cautP(i,b,d);
n=changeP(k);
convert(n,aux);
//
strcpy(k,b+j+1);
b[i]='\0';
strcat(b,aux);
strcat(b,k);
d=strlen(b);
//
if(n<0)
{
for(j=i-1;j>=0;j--)
if(b[j]=='-')
{b[j]='+'; break;}
else
if(b[j]=='+')
{b[j]='-'; break;}
}
i--;
}
return calc(b);
}
void refac(char a[])
{
int d=strlen(a),lg=0;
if(a[0]!='-') k[lg++]='+';
for(int i=0;i<d;i++)
{
if(a[i-1]=='(')
if(a[i]!='-') k[lg++]='+';
k[lg++]=a[i];
}
strcpy(a,k);
op[0]='N';
}
int main()
{
fin.getline(a,NR);
refac(a);
fout<<changeP(a)<<'\n';
return 0;
}