Nu aveti permisiuni pentru a descarca fisierul grader_test1.ok
Cod sursa(job #146564)
Utilizator | Data | 1 martie 2008 21:39:53 | |
---|---|---|---|
Problema | Evaluarea unei expresii | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.24 kb |
#include<stdio.h>
#include<string.h>
FILE *fin=freopen("date.in","r",stdin),
*fout=freopen("date.out","w",stdout);
char s[300];
void citire()
{
fgets(s,300,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("%lf",eval(0,n));
return 0;
}