Pagini recente » Cod sursa (job #3284446) | Cod sursa (job #3293742) | Cod sursa (job #3282021) | Cod sursa (job #3289750) | Cod sursa (job #146571)
Cod sursa(job #146571)
#include<stdio.h>
#include<string.h>
FILE *fin=freopen("evaluare.in","r",stdin),
*fout=freopen("evaluare.out","w",stdout);
char s[100000];
void citire()
{
fgets(s,100000,fin);
}
void parant(int &n, int &m)
{
while(1)
{
if(s[n]!='(' || s[m]!=')') return;
int arg=0;
for(int j=n+1;j<m;j++)
{
if(s[j]==')')
{
arg--;
if(arg<0) return;
}
if(s[j]=='(')
arg++;
}
if(arg) return ;
n++, m--;
}
}
int caut(int n, int m, char c1, char c2)
{
int arg=0;
for(int i=m;i>=n;i--)
{
if(s[i]==')') arg--;
if(s[i]=='(') arg++;
if(arg==0 && (s[i]==c1 || s[i]==c2)) return i;
}
return -1;
}
float eval(int n,int m)
{
parant(n,m);
int poz=caut(n+1,m,'+','-');
if(poz==-1)
poz=caut(n+1,m,'*','/');
if(poz==-1)
{
int a;
char p[100];
for(int i=0;i<=m-n;i++)
p[i]=s[i+n];
p[m-n+1]=0;
sscanf(p,"%ld",&a);
return a;
}
float v1=eval(n,poz-1), v2=eval(poz+1,m);
switch(s[poz])
{
case '+':return v1+v2;
case '-':return v1-v2;
case '*':return v1*v2;
default: return v1/v2;
}
}
int main()
{
citire();
int n=strlen(s)-1;
printf("%ld",(int) eval(0,n));
return 0;
}