Pagini recente » Cod sursa (job #1804603) | Cod sursa (job #1644272) | Cod sursa (job #2738869) | Cod sursa (job #2951220) | Cod sursa (job #147854)
Cod sursa(job #147854)
#include <stdio.h>
#include <string.h>
#define MAX 100001
char a[MAX];
int n;
void citire()
{
freopen ("evaluare.in","r",stdin);
fgets(a,MAX,stdin);
fclose (stdin);
}
long da(int st,int dr,char s1,char s2)
{
int num=0;
for (int i=dr;i>=st;i--)
{
if (a[i]==')')
num++;
else
if (a[i]=='(')
num--;
else
if ((a[i]==s1 || a[i]==s2) && num==0)
return i;
}
return -1;
}
void paranteza(int &st,int &dr)
{
int num=0;
for (int i=dr-1;i>st;i--)
if (a[i]==')')
num++;
else
if (a[i]=='(')
num--;
if (num==0 && a[st]=='(' && a[dr]==')')
{
st++;
dr--;
return ;
}
}
long lal (int n,int m)
{
long aa;
char pp[100];
for (int k=n;k<=m;k++)
pp[k-n]=a[k];
pp[m-n+1]=0;
sscanf(pp,"%ld",&aa);
return aa;
}
long lol(int st,int dr)
{
paranteza(st,dr);
long aux=da(st+1,dr,'+','-');
if (aux==-1)
aux=da(st+1,dr,'*','/');
if (aux==-1)
return lal(st,dr);
long S1=lol(st,aux-1),S2=lol(aux+1,dr);
switch (a[aux])
{
case '+': return S1+S2;
case '-': return S1-S2;
case '*': return S1*S2;
default: return S1/S2;
}
}
int main ()
{
citire();
n=(a[strlen (a)-1]=='\n')?strlen(a)-2:strlen(a)-1;
freopen ("evaluare.out","w",stdout);
printf ("%ld\n",lol(0,n));
fclose(stdout);
return 0;
}