Cod sursa(job #146564)

Utilizator Mishu91Andrei Misarca Mishu91 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;
}